NewReset 82 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

17 18 19 20 21
; DuffEntry is the address of "Nowhere"
;  - there should never be any page actually mapped to this address (L2PT entry always 0)
;  - a page that is not mapped in should always have this special address in its CAM entry,
;    ie. should only be one Nowhere
;
22
 [ HAL32
23
DuffEntry *     &FAFF8000
24
 |
25
DuffEntry *     &01F08000
26
 ]
Neil Turton's avatar
Neil Turton committed
27

28 29 30
Nowhere * DuffEntry  ; synonym


Neil Turton's avatar
Neil Turton committed
31 32 33 34 35 36 37 38 39
SoftReset       * 0                     ; Reset types
PowerOnReset    * 1
ControlReset    * 2

; CMOS RAM resetting stuff:
CMOSLimit       * &F0

; Keyboard flags
                ^ 1
40 41 42 43 44
 [ HAL
KbdScanActive   # 1
                # 2
KbdFlags        # 4
 |
Neil Turton's avatar
Neil Turton committed
45 46 47 48 49 50 51 52 53 54
CTRL_Down_Flag  # 1
SHIFT_Down_Flag # 1
KB_There_Flag   # 1

R_Down_Flag     # 1      ; note that these 4 form one word!!
T_Down_Flag     # 1
Del_Down_Flag   # 1
Copy_Down_Flag  # 1

KeyDataPtr      # 4
55 56

Port2Present    # 1      ; note that these 4 form one word!!
Neil Turton's avatar
Neil Turton committed
57
Port3Present    # 1
58 59
KeyState        # 1
KeyMSB          # 1
60
 ]
Neil Turton's avatar
Neil Turton committed
61

Kevin Bracey's avatar
Kevin Bracey committed
62
; On ARM600, InitIRQWs is in zero page - check it's big enough
Neil Turton's avatar
Neil Turton committed
63

Kevin Bracey's avatar
Kevin Bracey committed
64
        ASSERT  @ <= ?InitIRQWs
Neil Turton's avatar
Neil Turton committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96


;       AddCamEntries
;
; in:   r0 -> appropriate part of CAM map
;       r1 = ap (+ CB bits in new world)
;       r2 = log address
;       r7 = amount of cam map to do
;       r8 = PageSize
;
; out:  r0, r3-r12 preserved
;       r1 corrupted
;       r2 updated by relevant amount

AddCamEntries ROUT
        Push    "r0, lr"
        MOV     lr, r1                  ; access privs (PPL)
        MOV     r1, r7
01
        STMIA   r0!, {r2, lr}           ; store logaddr, PPL
        ADD     r2, r2, r8              ; increment address by 1 page
        SUBS    r1, r1, #8              ; decrement count of how much to do
        BNE     %BT01
        Pull    "r0, pc"

; 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!)

97
GetConfiguredSize Entry "r1"
Jeffrey Lee's avatar
Jeffrey Lee committed
98
        LDR     r1, =ZeroPage
Neil Turton's avatar
Neil Turton committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
        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

FudgeConfigureRMA
        Push   lr
        B      ConfigureRMA

ReadCMOSAndConfigure ROUT
; R0 = index into CMOS RAM of byte with size in
; R1 = place to save amount moved
; R2 = CAM entry number to start at: updated
; R3 = LogRam Address to move memory to
; r11  PPL
; Check for memory left, move as much as poss
        Push    lr
        BL      Read                    ; CMOS byte -> R0

        AND     R0, R0, #127            ; mask to same bitfield as status
ConfigureRMA
Jeffrey Lee's avatar
Jeffrey Lee committed
129
        LDR     R10, =ZeroPage
Neil Turton's avatar
Neil Turton committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
        LDR     R10, [R10, #Page_Size]
        MUL     R0, R10, R0             ; get size in bytes
        MOV     R5, #0                  ; amount moved
        CMP     R0, #0
        BEQ     NoMoreMemory

 [ GetPagesFromFreePool

; r0 = amount of memory to move
; r1 = address to store size in
; (r2 = page number to start at, ignored in our method)
; r3 = address of where to put memory
; r10 = page size
; r11 = ap + CB

Jeffrey Lee's avatar
Jeffrey Lee committed
145
        LDR     r4, =ZeroPage+FreePoolDANode
Neil Turton's avatar
Neil Turton committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
        MOV     r6, r11                         ; r6 = ap + CB
        LDR     r7, [r4, #DANode_Base]
        LDR     r8, [r4, #DANode_Size]
        ADD     r7, r7, r8                      ; r7 -> end of free pool +1
10
        CMP     r8, r10                         ; if no free memory left
        BCC     %FT20                           ; then tidy up
        SUB     r7, r7, r10                     ; move free pool pointer backwards
        Push    "r0, r1"
        MOV     r0, r7
        MOV     r1, r3
        BL      MovePageAtR0ToR1WithAccessR6
        Pull    "r0, r1"
        ADD     r3, r3, r10                     ; advance "to" pointer
        SUB     r8, r8, r10                     ; one less page of free memory
        ADD     r5, r5, r10                     ; one more page done
        SUBS    r0, r0, r10
        BNE     %BT10
20
        STR     r8, [r4, #DANode_Size]
 |
Jeffrey Lee's avatar
Jeffrey Lee committed
167 168
        LDR     R7, =ZeroPage
        LDR     R8, [R7, #RAMLIMIT]
Neil Turton's avatar
Neil Turton committed
169 170 171 172 173 174

; now set R6 = first entry not to use
;         R7 = end of gap   "   "  "
;         R8 = last entry we can use

        LDR     r6, [r7, #VideoSize]            ; find out how many pages in video area
175
;        MOV     r7, #0
Neil Turton's avatar
Neil Turton committed
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
        MOV     r6, r6, LSR #12                 ; = page number of start of skipped bit
        ASSERT  SoftCamMapSize = L2PTSize +4
        MOV     r7, #L2PTSize
        LDMIA   r7, {r7, lr}                    ; r7 = L2PTSize, lr = SoftCamMapSize
        ADD     r7, r7, lr                      ; add sizes together
        ADD     r7, r7, #StaticPagesSize + UndStackSize ; + number of bytes used for other static bits
        ADD     r7, r6, r7, LSR #12             ; r7 = page number after static bit
        MOV     r8, r8, LSR #12                 ; make r8 into highest page number+1

CAMZapLoop
        CMP     R2, R6                  ; if at gap, skip
        MOVEQ   R2, R7
        CMP     R2, R8                  ; if no more memory, give in
        BEQ     NoMoreMemory
        ADD     R5, R5, R10
        Push    "R0, R1, R6"
        BL      BangCamUpdate
        Pull    "R0, R1, R6"
        ADD     R2, R2, #1
        ADD     R3, R3, R10
        SUBS    R0, R0, R10
        BGT     CAMZapLoop
 ]
NoMoreMemory
        STR     R5, [R1]
        Pull    "PC"

; MassageScreenSize - called from ReadCMOSAndConfigure (above) and also from
; ReadSysInfo

MassageScreenSize ROUT
Kevin Bracey's avatar
Kevin Bracey committed
207
        Push    lr
Jeffrey Lee's avatar
Jeffrey Lee committed
208
        LDR     lr, =ZeroPage
Kevin Bracey's avatar
Kevin Bracey committed
209 210
        LDR     lr, [lr, #VRAMFlags]
        TST     lr, #2
Jeffrey Lee's avatar
Jeffrey Lee committed
211
        LDRNE   lr, =ZeroPage
Kevin Bracey's avatar
Kevin Bracey committed
212 213 214
        LDRNE   r0, [lr, #VideoSize]
        Pull    pc, NE

Neil Turton's avatar
Neil Turton committed
215 216
        CMP     r0, #0
        BNE     CmosScreenWillDo
Jeffrey Lee's avatar
Jeffrey Lee committed
217 218 219
      [ ZeroPage <> 0
        LDR     r0, =ZeroPage
      ]
Neil Turton's avatar
Neil Turton committed
220 221 222 223 224 225 226 227 228 229
        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
230
        Pull    pc
Neil Turton's avatar
Neil Turton committed
231 232 233

        LTORG

234 235 236
  [ HAL
    ! 0, "*** DUMMY CONT_Break, soft breaks/resets will not work yet with HAL"
CONT_Break
237
        AddressHAL
238
        MOV     a1, #1
239
        LDR     a2, =L1PT
240
        CallHAL HAL_Reset
241 242 243 244 245
  ]


  [ :LNOT: HAL

Neil Turton's avatar
Neil Turton committed
246 247 248 249 250 251
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Data tables: VIDC := mode 0, all palette black

VIDCTAB

; Program Control Register first, to clear power-down bit
Kevin Bracey's avatar
Kevin Bracey committed
252 253 254
; Now depending upon the VIDCClockSource flag, re-program the clock source.
   [ VIDCClockSource = "VCO"
     [ VCOstartfix
255
        & &E0000404     ; CR: FIFO load 16 words, 1 bpp, ck/2, vclk (allow for doubled VCO freq)
Kevin Bracey's avatar
Kevin Bracey committed
256
     |
Neil Turton's avatar
Neil Turton committed
257
        & &E0000400     ; CR: FIFO load 16 words, 1 bpp, ck/1, vclk
Kevin Bracey's avatar
Kevin Bracey committed
258 259 260 261 262 263
     ]
   ]
   [ VIDCClockSource = "HCLK"
        & &E0000401     ; CR: FIFO load 16 words, 1 bpp, ck/1, hclk
   ]
   [ VIDCClockSource = "RCLK"
264
        & &E0000406     ; CR: FIFO load 16 words, 1 bpp, ck/2, rclk
265
   ]
Neil Turton's avatar
Neil Turton committed
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299

; Don't bother programming all 256 palette entries, we'll be here all night
; Since we're setting up a 1 bit-per-pixel mode, just do colours 0 and 1

        & &10000000     ; Palette address register = 0
        & &00000000     ; Colour 0 = black
        & &00000000     ; Colour 1 = black
        & &40000000     ; Border colour = black
        & &50000000     ; Pointer colour 1 = black
        & &60000000     ; Pointer colour 2 = black
        & &70000000     ; Pointer colour 3 = black

; Get a stable display up so we get stable signals

        & &800003F8     ; HCR  = 76 + 88 + 96 + 640 + 96 + 28
        & &81000044     ; HSWR = 76
        & &82000098     ; HBSR = 76 + 88
        & &830000F2     ; HDSR = 76 + 88 + 96
        & &84000372     ; HDER = 76 + 88 + 96 + 640
        & &850003D8     ; HBER = 76 + 88 + 96 + 640 + 96
        & &860000F3     ; HCSR = HDSR

        & &90000137     ; VCR  = 3 + 19 + 16 + 256 + 16 + 2
        & &91000002     ; VSWR = 3
        & &92000015     ; VBSR = 3 + 19
        & &93000025     ; VDSR = 3 + 19 + 16
        & &94000125     ; VDER = 3 + 19 + 16 + 256
        & &95000135     ; VBER = 3 + 19 + 16 + 256 + 16
        & &96000025     ; VCSR = VDSR
        & &97000025     ; VCER = VDSR

        & &B1000001     ; SCR: sound disabled (+use 24MHz clock)

        & &C00F1003     ; EREG = comp sync, DACs on, ereg output ext lut
300 301 302
   [ VCOstartfix
        & &D0000302     ; FSYNREG, clk = (3+1)/(2+1) * 24MHz = 32MHz  (higher frequency as part of fix)
   |
Neil Turton's avatar
Neil Turton committed
303
        & &D0000305     ; FSYNREG, clk = (3+1)/(5+1) * 24MHz = 16MHz
304
   ]
Neil Turton's avatar
Neil Turton committed
305 306 307 308 309 310
        & &F0013000     ; DCR: bus D[31:0], Hdisc       ;RCM 29/9/94: changed from &F0012000 at PSwindells request
        & &FFFFFFFF     ; That's the lot


VIDCPhys        *       &03400000       ; used to address VIDC when MMU is off

311

Neil Turton's avatar
Neil Turton committed
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
; Entered here after RESET (or BREAK)

; This code must be capable of being executed at a non-ROM address and with the MMU off,
; and running in 32-bit mode up until the call to MemSize.

CONT_Break
        MOV     r1, #1          ; parameter passed to InitMEMC, to indicate Break not Reset
        B       Continue

CONT    ROUT
        MOV     r1, #0          ; parameter passed to InitMEMC, to indicate Reset not Break
Continue

; First bang MEMC to ensure safety

        BL      InitMEMC        ; initialise MEMC CR, and turn off MMU if it's on

; VInit etc set on ze mode change: no DMA going yet so don't set owt.

        MOV     R1, #VIDCPhys   ; Must ALWAYS initialise VIDC on reset or else
        ADR     R2, VIDCTAB     ; we may get vsync interrupts that stiff us
10      LDR     R0, [R2], #4    ; permanently as VIDC is in an undefined state
        CMP     R0, #-1         ; so have mode 0 with all black palette
        STRNE   R0, [R1]
        BNE     %BT10

; Now bang IOC (disable all but keyboard interrupts)

        MOV     R1, #IOC
        MOV     R0, #&FF                ; all inputs
        STRB    R0, [R1, #IOCControl]   ; in case called by Tim

        MOV     R0, #0
        STRB    R0, [R1, #IOCIRQMSKA]   ; kein interrupts
        STRB    R0, [R1, #IOCFIQMSK]    ; disable FIQs
        STRB    R0, [R1, #IOMD_DMAMSK]  ; disable DMA interrupts, too
348 349
        STRB    R0, [R1, #IOMD_IRQMSKC] ; and the rest...
        STRB    R0, [R1, #IOMD_IRQMSKD]
Neil Turton's avatar
Neil Turton committed
350

351
  [ Keyboard_Type = "A1A500" :LOR: Keyboard_Type = "PC"
Neil Turton's avatar
Neil Turton committed
352
        MOV     R0, #KARTRxBit          ; used for Archi keyboard or IOMD PC keyboard
353
  ]
Neil Turton's avatar
Neil Turton committed
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
        STRB    R0, [R1, #IOCIRQMSKB]   ; allow communication with kbd, when I_bit gets cleared

; now bits to allow CMOS read/write : need timer

        LDR     R0, =20000-1    ; R0 = Timer delay (units of 0.5 microsecond)
                                ; 20000*0.5E-6 = 0.01 Seconds (100Hz ticker)
                                ; TMD 21-May-93: "-1" correction applied

        STRB    R0, [R1, #Timer0LL]     ; Set up the delay
        MOV     R0, R0, LSR #8
        STRB    R0, [R1, #Timer0LH]
        STRB    R0, [R1, #Timer0GO]     ; and start the ticks

        MOV     R0, #timer0_bit
        STRB    R0, [R1, #IOCIRQCLRA]   ; Clear pending t0 interrupt j.i.c.

370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
  [ VCOstartfix
        ;2nd part of fix for VCO failing to start on A7000 (esp. 7500FE) - forcing PCOMP high for about 3 ms
        LDRB    R0, [R1,#IOMD_ID0]
        CMP     R0, #&E7
        LDREQB  R0, [R1,#IOMD_ID1]
        CMPEQ   R0, #&D4
        BEQ     vcofix_notMorris      ; risky to force PCOMP on Risc PC
        MOV     R0, #VIDCPhys
        LDR     R2, =&D0000342        ; VIDC20 FSYNREG, as in VIDCTAB but with force PCOMP high
        STR     R2, [R0]
        MOV     R0, #3072*2           ; time delay of about 3 ms (0.5 us units)
        STRB    R0, [R1, #Timer0LR]   ; copy counter into output latch
        LDRB    R2, [R1, #Timer0CL]   ; R2 := low output latch
vcofix_waitloop
        STRB    R0, [R1, #Timer0LR]   ; copy counter into output latch
        LDRB    R3, [R1, #Timer0CL]   ; R3 := low output latch
        TEQ     R3, R2                ; unchanged ?
        BEQ     vcofix_waitloop       ; then loop
        MOV     R2, R3                ; copy anyway
        SUBS    R0, R0, #1            ; decrement count
        BNE     vcofix_waitloop       ; loop if not finished
        MOV     R0, #VIDCPhys
        LDR     R2, =&D0000302        ; VIDC20 FSYNREG, as in VIDCTAB (PCOMP low again)
        STR     R2, [R0]
vcofix_notMorris
  ]

Neil Turton's avatar
Neil Turton committed
397 398 399 400
; now size memory

        BL      MemSize                 ; out: r0 = page size, r1 = memory size, r2 = MEMC CR value, r3-r14 corrupt

401
MemSized
Neil Turton's avatar
Neil Turton committed
402 403 404 405
        MOV     R8, R0                  ; R8 = page size in bytes
        MOV     R13, R1                 ; R13 is now the RAM size
        MOV     R9, R2                  ; need this to set soft copy right

406 407 408 409 410
   [ EmulatorSupport
        ARM_on_emulator R7
        MOVEQ   R7,#&80
        ORREQ   R7,R7,#&3E00            ; r7 := &3E80 = 16000 (standard Risc PC value)
        BLNE    TimeCPU                 ; r7 := CPU speed in kHz/MEMC1a flag
Neil Turton's avatar
Neil Turton committed
411
   |
Neil Turton's avatar
Neil Turton committed
412
        BL      TimeCPU                 ; r7 := CPU speed in kHz/MEMC1a flag
Neil Turton's avatar
Neil Turton committed
413
   ]
Neil Turton's avatar
Neil Turton committed
414 415 416 417 418 419 420 421 422 423 424 425 426

; the fixed areas give us : IRQ stack (in cursor), SVC stack (in sysheap base)
; and bottom block makes most sense done here

; now keyboard initialisation: initialise baud rate, send dummy, read dummy

        MOV     R0, #InitKbdWs
        MOV     R1, #0
        STRB    R1, [R0, #CTRL_Down_Flag] ; clear CTRL down flag, R down flag
        STRB    R1, [R0, #SHIFT_Down_Flag]
        STRB    R1, [R0, #KB_There_Flag]
        STR     R1, [R0, #R_Down_Flag]  ; all CMOS reset flags
        STR     R1, [R0, #KeyDataPtr]
427 428
        STR     R1, [R0, #Port2Present] ; all KbdRes vars

Neil Turton's avatar
Neil Turton committed
429 430 431 432 433 434 435
        B       SetUpKbd                ; No stack yet so branch and branch back.
SetUpKbdReturn


; set up reset interrupt handler (reads, discards keys, setting flags if CTRL or R)
; NB on ARM600 we need to go into 32-bit mode, so we can safely overwrite vectors

436
        MRS     r0, CPSR                ; switch into IRQ32, still IRQs disabled
Neil Turton's avatar
Neil Turton committed
437 438
        BIC     r0, r0, #&1F
        ORR     r1, r0, #IRQ32_mode
439
        MSR     CPSR_c, r1
Neil Turton's avatar
Neil Turton committed
440 441 442 443 444 445 446 447

        LDR     sp_irq, =IRQSTK         ; set up sp_irq

        ADRL    R2, MOSROMVecs          ; pick up from table
        LDR     R2, [R2, #&18]          ; this gets overwritten while active,
        MOV     R3, #0
        STR     R2, [R3, #&18]          ; but hopefully by the same value!

448
        ADDR    R2, IRQ_Test_CTRL_or_R_Pressed ; (could use ADRL, but ADDR macro is nicer)
Kevin Bracey's avatar
Kevin Bracey committed
449
        STR     R2, [R3, #InitIRQHandler] ; instruction is now a LDR PC,InitKbdHandler
Kevin Bracey's avatar
Kevin Bracey committed
450

Neil Turton's avatar
Neil Turton committed
451
        ORR     r0, r0, #SVC32_mode     ; switch into SVC32
Neil Turton's avatar
Neil Turton committed
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470

 [ StrongARM
   ;for StrongARM, we need to do an IMB type thing for modifying code in vector area
        ARM_read_ID r1
        AND     r1,r1,#&F000
        CMP     r1,#&A000
        BNE     vectorpoke_notSA_1
        MOV     r1,#0                   ;we clean one cache entry, 0..1F, = vector area
  [ SAcleanflushbroken
        ARMA_clean_DCentry r1
        ARMA_flush_DCentry r1
  |
        ARMA_cleanflush_DCentry r1
  ]
        ARMA_drain_WB
        ARMA_flush_IC
vectorpoke_notSA_1
 ]

Neil Turton's avatar
Neil Turton committed
471
        BIC     r0, r0, #I32_bit        ; and enable IRQs
472
        MSR     CPSR_c, r0
Neil Turton's avatar
Neil Turton committed
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503

 ; in SVC32 from now until we've finished poking around with vectors



 [ :LNOT: AlwaysClearRAM

; IF por OR FX200 bit set THEN clear memory
        MOV     R0, #IOC
        LDRB    R1, [R0, #IOCIRQSTAA]
        ANDS    R1, R1, #por_bit
        BNE     %FT20

        LDR     R0, =OsbyteVars + :INDEX: ESCBREAK
        LDRB    R1, [R0]
        CMP     R1, #2                  ; unlike popular rumour, bit 1 ain't
        CMPNE   R1, #3                  ; a flag
        BNE     %FT30
20
 ]
        BL      ClearPhysRAM
30
        MOV     r0, #0
        STR     r9, [r0, #MEMC_CR_SoftCopy] ; set soft copy.
        STR     r7, [r0, #MemorySpeed]  ; Remember CPU speed/MEMC1a flag
        STR     r8, [r0, #Page_Size]    ; r8 is still page size from way up there
        STR     r13, [r0, #RAMLIMIT]    ; save sussed memory size in LogRam

        LDR     sp, =SVCSTK             ; set up a stack

; do as much other initialisation as possible, to give keyboard stuff time
Neil Turton's avatar
Neil Turton committed
504 505 506 507
 [ StrongARM
        BL      Processor_Type          ; Determines the processor type & stores it in page 0.
 ]

508 509 510

  ]    ; :LNOT: HAL

511 512
Continue_after_HALInit

Neil Turton's avatar
Neil Turton committed
513 514 515 516 517 518
;StrongARM: 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
519 520 521 522 523 524 525 526 527

 [ ProcessorVectors
; 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
528
        LDR     R1, =ZeroPage+ProcVec_Start
Neil Turton's avatar
Neil Turton committed
529 530 531 532 533 534 535 536 537 538 539
        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
540 541
        LDR     R0, =ZeroPage+4
        LDR     R3, =ZeroPage+EndMOSROMVecs-MOSROMVecs
Neil Turton's avatar
Neil Turton committed
542 543 544 545

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
546
        TEQ     R0, R3
Neil Turton's avatar
Neil Turton committed
547 548
        BNE     %BT40

Kevin Bracey's avatar
Kevin Bracey committed
549 550
        ChangedProcVecs r0

Kevin Bracey's avatar
Kevin Bracey committed
551
 [ :LNOT: No26bitCode
Neil Turton's avatar
Neil Turton committed
552 553
; Now we have set up the hardware vectors we can drop back to SVC26 mode

554
        MRS     r0, CPSR
Neil Turton's avatar
Neil Turton committed
555 556
        BIC     r0, r0, #&1F
        ORR     r0, r0, #SVC26_mode
557
        MSR     CPSR_c, r0
Neil Turton's avatar
Neil Turton committed
558 559 560
 ]

 [ CacheCMOSRAM
Kevin Bracey's avatar
Kevin Bracey committed
561
        DebugTX "InitCMOSCache entry"
Neil Turton's avatar
Neil Turton committed
562
        BL      InitCMOSCache           ; initialise cache of CMOS RAM
Kevin Bracey's avatar
Kevin Bracey committed
563
        DebugTX "InitCMOSCache done"
564
        TEQ     R0, #0                  ; returns zero on failure
Jeffrey Lee's avatar
Jeffrey Lee committed
565 566 567
      [ ZeroPage <> 0
        LDREQ   R0, =ZeroPage
      ]
568 569 570
        LDREQ   R1, [R0, #HAL_StartFlags]
        ORREQ   R1, R1, #OSStartFlag_NoCMOS
        STREQ   R1, [R0, #HAL_StartFlags]
Neil Turton's avatar
Neil Turton committed
571 572 573
 ]

; Now copy the initialised data
Jeffrey Lee's avatar
Jeffrey Lee committed
574
        LDR     R0, =ZeroPage+IRQ1V
Neil Turton's avatar
Neil Turton committed
575 576 577 578 579 580 581 582 583

; first save IOC soft copy so can restore it

        LDRB    R2, [R0, #IOCControlSoftCopy-IRQ1V]
        Push    "R2"
        LDRB    R2, [R0, #CannotReset-IRQ1V]
        Push    "R2"

        ADRL    r1, StartData
Jeffrey Lee's avatar
Jeffrey Lee committed
584
        LDR     R3, =ZeroPage+(EndData-StartData+IRQ1V)
Neil Turton's avatar
Neil Turton committed
585 586 587
DatCopy
        LDR     R2, [R1], #4
        STR     R2, [R0], #4
Jeffrey Lee's avatar
Jeffrey Lee committed
588
        TEQ     R0, R3
Neil Turton's avatar
Neil Turton committed
589 590 591
        BNE     DatCopy

        ADR     r2, CONT_Break
Jeffrey Lee's avatar
Jeffrey Lee committed
592
        LDR     r0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
593 594
        STR     r2, [r0, #ResetIndirection]

Jeffrey Lee's avatar
Jeffrey Lee committed
595 596
        MOV     r3, #0                  ; initialise abort list
        STR     r3, [r0, #AbortIndirection]
Neil Turton's avatar
Neil Turton committed
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615

; 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
616 617
        LDR     R1, [R1]
        STR     R1, [R0]
Neil Turton's avatar
Neil Turton committed
618

Robert Sprowson's avatar
Robert Sprowson committed
619
; conversion SWIs all go through same despatch point
Neil Turton's avatar
Neil Turton committed
620 621
        LDR     R0, =SvcTable
        ADRL    R1, despatchConvert
Robert Sprowson's avatar
Robert Sprowson committed
622 623 624
        STR     R1, [R0, #OS_ConvertStandardDateAndTime * 4]
        STR     R1, [R0, #OS_ConvertDateAndTime * 4]

Neil Turton's avatar
Neil Turton committed
625 626 627 628
        MOV     R2, #OS_ConvertHex1
conversionSWIfill
        STR     R1, [R0, R2, LSL #2]
        ADD     R2, R2, #1
Robert Sprowson's avatar
Robert Sprowson committed
629 630
        CMP     R2, #OS_ConvertVariform
        BLS     conversionSWIfill
Neil Turton's avatar
Neil Turton committed
631

632 633 634
; 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
635
        LDR     r0, =ZeroPage
636
        ARMop   IMB_Full,,,r0
Kevin Bracey's avatar
Kevin Bracey committed
637
        DebugTX "IMB_Full done"
Neil Turton's avatar
Neil Turton committed
638 639 640

; Initialise CAO ptr to none.

Jeffrey Lee's avatar
Jeffrey Lee committed
641
        LDR     R0, =ZeroPage
642
        LDR     R1, =DuffEntry          ; nothing will be here!!
Neil Turton's avatar
Neil Turton committed
643 644
        STR     R1, [R0, #Curr_Active_Object]

Neil Turton's avatar
Neil Turton committed
645
KeyWait * 200000                 ; 1/5 sec wait (in microseconds)
646 647 648 649 650
 [ HAL
us      * 1
 |
us      * 2
 ]
Neil Turton's avatar
Neil Turton committed
651

652
 [ HAL
653 654
        AddressHAL
        MOV     r6, #25                 ; Check for keyboard 25 times (5 secs max).
Jeffrey Lee's avatar
Jeffrey Lee committed
655
        LDR     r4, =ZeroPage+InitIRQWs
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676

kbdwait
        CallHAL HAL_KbdScan
        STR     r0, [r4, #KbdFlags]

        TST     r0, #KbdFlag_Done
        BNE     kbddone

      [ EmulatorSupport
        ARM_on_emulator r0
        MOVEQ   r0, #us
        LDRNE   r0, =KeyWait*us         ; Wait 1/5 second (give keys down a chance to come in).
      |
        LDR     r0, =KeyWait*us         ; Wait 1/5 second (give keys down a chance to come in).
      ]
        CallHAL HAL_CounterDelay
        SUBS    r6, r6, #1              ; else wait a maximum of 5 seconds.
        BNE     kbdwait
kbddone
        MSR     CPSR_c, #I32_bit+SVC32_mode
        CallHAL HAL_KbdScanFinish
Jeffrey Lee's avatar
Jeffrey Lee committed
677
        LDR     r1, =ZeroPage+InitIRQWs
678 679 680
        MOV     r0, #0
        STRB    r0, [r1, #KbdScanActive]
        MSR     CPSR_c, #SVC32_mode
Jeffrey Lee's avatar
Jeffrey Lee committed
681
        DebugTX "Keyboard scan complete"
682
 |
Neil Turton's avatar
Neil Turton committed
683 684 685
    [ KeyWait <> 0
; Check for keyboard there every 1/5 sec. but give up after 2 secs.
        MOV     r2, #IOC
Mike Stephens's avatar
Mike Stephens committed
686
        MOV     r6, #10                 ; Check for keyboard 10 times (2 secs max).
Neil Turton's avatar
Neil Turton committed
687 688 689
        MOV     r4, #InitKbdWs
kbdwait
        LDRB    r5, [r4, #KB_There_Flag]
690 691
      [ EmulatorSupport
        ARM_on_emulator r0
692 693
        MOVEQ   r0, #us
        LDRNE   r0, =KeyWait*us         ; Wait 1/5 second (give keys down a chance to come in).
694
      |
695
        LDR     r0, =KeyWait*us         ; Wait 1/5 second (give keys down a chance to come in).
696
      ]
Neil Turton's avatar
Neil Turton committed
697 698 699
        BL      DoMicroDelay
        TEQ     r5, #0                  ; If keyboard was there 1/5 second ago then
        BNE     kbdthere                ;   continue reset
Mike Stephens's avatar
Mike Stephens committed
700
        SUBS    r6, r6, #1              ; else wait a maximum of 2 seconds.
Neil Turton's avatar
Neil Turton committed
701 702 703
        BNE     kbdwait
kbdthere
    ]
704
 ]
Neil Turton's avatar
Neil Turton committed
705

706
 [ ValidateCMOS
Neil Turton's avatar
Neil Turton committed
707
; Do a POR if some super-critical values are shagged or if checksum is invalid.
708
        MOV     R3, #-1                 ; do all RAM if we do any
Neil Turton's avatar
Neil Turton committed
709
        BL      ValChecksum             ; Always check the checksum
710
        BNE     cmos_reset
Neil Turton's avatar
Neil Turton committed
711

712 713 714 715
 ]

 [ ValidateCMOS :LAND: STB

Neil Turton's avatar
Neil Turton committed
716 717 718
; ScreenSizeCMOS, RAMDiscCMOS, SysHeapCMOS, RMASizeCMOS and SpriteSizeCMOS
; should be 0. Happily they are at consecutive addresses so we can loop through
; them.
719
        MOV     R1, #ScreenSizeCMOS
Neil Turton's avatar
Neil Turton committed
720
reset_loop
721 722 723 724 725 726 727
        MOV     R0, R1
        BL      Read
        TEQ     R0, #0
        BNE     cmos_reset
        INC     R1
        TEQ     R1, #SpriteSizeCMOS
        BHI     reset_loop
Neil Turton's avatar
Neil Turton committed
728

729
; Year should be >=1995, <=2037 (when 32 bit signed Unix time breaks)
730 731
        MOV     R0, #YearCMOS+1
        BL      Read
732 733
        MOV     R1, R0
        MOV     R0, #YearCMOS+0
734
        BL      Read
735 736 737 738 739
        MOV     R2, #100
        MLA     R0, R2, R1, R0
        LDR     R1, =1995
        SUB     R0, R0, R1
        CMP     R0, #2037 - 1995
740
        BHI     cmos_reset
Neil Turton's avatar
Neil Turton committed
741 742 743

checkboot
; Bit 4 of DBTBCMOS should be 1 (Boot)
744 745
        MOV     R0, #DBTBCMOS
        BL      Read
746 747
        TST     R0, #(1:SHL:4)
        BEQ     cmos_reset
Neil Turton's avatar
Neil Turton committed
748 749 750
 ]


751
; IF power-on bit set AND R/T/Del/Copy pressed THEN reset CMOS RAM
Neil Turton's avatar
Neil Turton committed
752
; note that memory cleared if POR, so key info has had plenty of time!
Robert Sprowson's avatar
Robert Sprowson committed
753

754
 [ HAL
Jeffrey Lee's avatar
Jeffrey Lee committed
755
        LDR     R0, =ZeroPage+HAL_StartFlags
756
        LDR     R1, [R0]
757
        TST     R1, #OSStartFlag_NoCMOS ; If no CMOS, reset for sensible cache
Kevin Bracey's avatar
Kevin Bracey committed
758
        BNE     cmos_reset
759
        TST     R1, #OSStartFlag_POR
760
        BEQ     no_cmos_reset           ; not a power on reset
761
        DebugTX "POR detected"
762
      [ CheckProtectionLink
763 764
        TST     R1, #OSStartFlag_NoCMOSReset
        BNE     no_cmos_reset
765
      ]
766 767 768
        TST     R1, #OSStartFlag_CMOSReset
        BNE     cmos_reset
 |
Neil Turton's avatar
Neil Turton committed
769 770 771 772 773
        MOV     R0, #IOC
        LDRB    R1, [R0, #IOCIRQSTAA]
        ANDS    R1, R1, #por_bit
        BEQ     no_cmos_reset

774
      [ CheckProtectionLink
Neil Turton's avatar
Neil Turton committed
775 776
        LDR     r0, =IOMD_MonitorType

777 778
        ; on Issue A's the protection bit is only weakly pulled up,
        ; so force it high, then read it back
Neil Turton's avatar
Neil Turton committed
779 780 781 782 783 784 785
        LDRB    r1, [r0]
        ORR     r1, r1, #IOMD_ProtectionLinkBit
        STRB    r1, [r0]

        LDRB    r1, [r0]
        TST     r1, #IOMD_ProtectionLinkBit
        BEQ     no_cmos_reset           ; if zero then CMOS is protected
786
      ]
Neil Turton's avatar
Neil Turton committed
787

788 789
    [ STB :LAND: IOMD_C_FrontPanelButton <> 0
      [ FrontPanelButtClearsCMOS
Neil Turton's avatar
Neil Turton committed
790 791 792 793
        MOV     r0, #IOMD_Base          ; if front panel button pressed then CMOS reset
        LDRB    r0, [r0, #IOMD_CLINES]
        TST     r0, #IOMD_C_FrontPanelButton
        BEQ     cmos_reset
794 795
      ]
    ]
Neil Turton's avatar
Neil Turton committed
796

797
 ]
798

Jeffrey Lee's avatar
Jeffrey Lee committed
799
        LDR     R0, =ZeroPage+InitIRQWs
800 801 802 803
 [ HAL
        LDR     R7, [R0, #KbdFlags]
        TST     R7, #KbdFlag_R:OR:KbdFlag_T:OR:KbdFlag_Delete:OR:KbdFlag_Copy
 |
Robert Sprowson's avatar
Robert Sprowson committed
804
        LDR     R7, [R0, #R_Down_Flag]  ; Picks up R/T/Del/Copy flags all in one
Neil Turton's avatar
Neil Turton committed
805
        CMP     R7, #0
806
 ]
Robert Sprowson's avatar
Robert Sprowson committed
807 808 809
        LDRNE   R3, =ZeroPage
        MOVNE   R14, #1
        STRNEB  R14, [R3, #MentionCMOSReset]
Neil Turton's avatar
Neil Turton committed
810 811
        BEQ     no_cmos_reset           ; power on bit checked again there

812
      [ :LNOT: STB
Neil Turton's avatar
Neil Turton committed
813
        ADD     sp, sp, #4              ; junk CannotReset flag from stack
814
      ]
Neil Turton's avatar
Neil Turton committed
815 816 817 818 819 820 821 822 823 824

; CMOS reset detectified.
; **************************************************************************
; Note: if this CMOS reset code ever needs changing again, it's probably
; better to rewrite it. The Compact apparently has a table of default
; CMOS values; R-p.o. just writes the table, DEL-p.o. zeroes all, then
; writes the table. With skipping of the time CMOS, and post-prodding of
; the sync, that would probably be a better algorithm.
; **************************************************************************

825
 [ HAL
826
        TST     R7, #KbdFlag_Copy:OR:KbdFlag_Delete
827
 |
828 829 830
        ASSERT  (Del_Down_Flag - R_Down_Flag) = 2
        ASSERT  (Copy_Down_Flag - Del_Down_Flag) = 1
        MOVS    R3, R7, LSR #16         ; full reset or just system?
831
 ]
Neil Turton's avatar
Neil Turton committed
832 833 834 835 836 837

        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.
Neil Turton's avatar
Neil Turton committed
838
cmos_reset
839
 [ STB
Neil Turton's avatar
Neil Turton committed
840 841
        ADD     sp, sp, #4              ; junk CannotReset flag from stack
 ]
842
        DebugTX "Reset CMOS"
Neil Turton's avatar
Neil Turton committed
843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
        MOVNE   R0, #0                  ; even the econet station number
        MOVEQ   R0, #1
    |
        MOV     R0, #1                  ; leave the econet station number
    ]
        MOV     R1, #0                  ; zero it first
cmrlp   BL      Write                   ; CMOS(R0) := R1
        ADD     R0, R0, #1
        CMP     R0, R3
        MOVEQ   R0, #&80                ; skip user cmos
        CMP     r0, #YearCMOS
        ADDEQ   r0, r0, #2
        CMP     r3, #UserCMOS           ; system only?
        BNE     skipskipforTC
        CMP     r0, #NewADFSCMOS
        CMPNE   r0, #CountryCMOS        ; skip these if so
        ADDEQ   r0, r0, #1
skipskipforTC
        CMP     R0, #CMOSLimit
        BNE     cmrlp
    [ ChecksumCMOS
        BL      MakeChecksum            ; create a valid checksum
    ]
; now put nice values in where necessary
; first full reset defaults
        CMP     r3, #-1
        BNE     not_full_reset
Neil Turton's avatar
Neil Turton committed
870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888

 [ STB :LAND: IOMD_C_PALNTSCType <> 0
        MOV     r4, #IOMD_Base          ; configure territory, country and timezone based on PAL/NTSC bit
        LDRB    r4, [r4, #IOMD_CLINES]
        MOV     r0, #TerritoryCMOS
        TST     r4, #IOMD_C_PALNTSCType
        MOVEQ   r1, #0                  ; PAL = territory UK
        MOVNE   r1, #49                 ; NTSC = territory USA
        BL      Write
        MOV     r0, #CountryCMOS
        TST     r4, #IOMD_C_PALNTSCType
        MOVEQ   r1, #1                  ; PAL = country UK
        MOVNE   r1, #48                 ; NTSC = country USA
        BL      Write
        MOV     r0, #TimeZoneCMOS
        TST     r4, #IOMD_C_PALNTSCType
        MOVEQ   r1, #0                  ; PAL = 0 from UTC (GMT)
        MOVNE   r1, #&E0                ; NTSC = -8 hours from UTC (USA Pacific)
        BL      Write
889
   [ STB :LAND: :DEF: ObsoleteNC1CMOS
Neil Turton's avatar
Neil Turton committed
890 891 892 893 894
        MOV     r0, #MiscellaneousNCCMOS
        TST     r4, #IOMD_C_PALNTSCType
        MOVEQ   r1, #0                  ; PAL = A4 paper size
        MOVNE   r1, #1                  ; NTSC = US letter paper size
        BL      Write
895
   ]
Neil Turton's avatar
Neil Turton committed
896
 |
Neil Turton's avatar
Neil Turton committed
897 898 899
        MOV     r0, #CountryCMOS
        MOV     r1, #1                  ; country UK
        BL      Write
Neil Turton's avatar
Neil Turton committed
900 901 902
 ]

 [ :LNOT: STB
Neil Turton's avatar
Neil Turton committed
903 904 905
        MOV     r0, #NewADFSCMOS
        MOV     r1, #&41                ; floppies=1, ST506=0, IDE=1 (changed 01-Sep-93)
        BL      Write
Neil Turton's avatar
Neil Turton committed
906 907
 ]

Neil Turton's avatar
Neil Turton committed
908 909 910
not_full_reset

; IF R or Delete pressed THEN set sync 0 ELSE set sync Auto
Jeffrey Lee's avatar
Jeffrey Lee committed
911
        LDR     R0, =ZeroPage+InitIRQWs
912 913 914 915
 [ HAL
        LDR     R1, [R0, #KbdFlags]
        TST     R1, #KbdFlag_R:OR:KbdFlag_Delete
 |
Neil Turton's avatar
Neil Turton committed
916 917 918 919
        LDRB    R1, [R0, #R_Down_Flag]
        CMP     R1, #0
        LDREQB  R1, [R0, #Del_Down_Flag]
        CMPEQ   R1, #0
920
 ]
Neil Turton's avatar
Neil Turton committed
921 922 923 924 925
        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

926
 [ HAL
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
     [ M_32
; M_32 used for IOMD based machines, select quadrature or PS2 as appropriate
        AddressHAL
        MOV     R0, #0
        MOV     R1, #&400
        CallHAL HAL_ControllerAddress
        CMP     R0, #0
        MOVEQ   R1, #PointerDevice_USB
        BEQ     program_mousetype
        LDRB    R1, [R0, #IOMD_ID1]
        LDRB    R0, [R0, #IOMD_ID0]
        ORR     R0, R0, R1, LSL #8
        LDR     R1, =IOMD_Original
        TEQ     R0, R1
        MOVEQ   R1, #PointerDevice_QuadMouse
        BEQ     program_mousetype
        LDR     R1, =IOMD_7500
        TEQ     R0, R1
        LDRNE   R1, =IOMD_7500FE
        TEQNE   R0, R1
        MOVEQ   R1, #PointerDevice_PS2Mouse
        MOVNE   R1, #PointerDevice_USB
program_mousetype
        MOV     R0, #MouseCMOS
        BL      Write
     |
953
        MOV     R0, #MouseCMOS
954
        MOV     R1, #PointerDevice_USB
955
        BL      Write
956
     ]
957

958 959 960 961 962
; set print and sound CMOS (16bit sound)
        MOV     R0, #TutuCMOS
        MOV     R1, #2_10100100  ; tbs chars valid, ctrlchars '|x'
        BL      Write

963 964
 |

Neil Turton's avatar
Neil Turton committed
965 966
 [ MorrisSupport
        MOV     R8, #IOMD_Base
967 968 969 970 971 972
        LDRB    r0, [r8, #IOMD_ID0]
        LDRB    r1, [r8, #IOMD_ID1]
        ORR     r0, r0, r1, LSL #8
        LDR     r1, =IOMD_Original
        TEQ     r0, r1
        BEQ     dont_program_mousetype
Neil Turton's avatar
Neil Turton committed
973 974 975 976 977 978 979 980 981 982 983 984
;
; Morris based machines use PS2 mice/tracker balls
;
        MOV     R0, #MouseCMOS
        MOV     R1, #PointerDevice_PS2Mouse     ;type 3
        BL      Write

  [ Select16BitSound
; set print and sound CMOS (16bit sound)
        B       Config16BitSound
  ]
dont_program_mousetype
985
 ] ; MorrisSupport
Neil Turton's avatar
Neil Turton committed
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014

 [ Select16BitSound
        LDR     r0, =IOMD_MonitorType

; on Issue A's the protection bit is only weakly pulled up,
; so force it high, then read it back

        LDR     r1, [r0]
        ORR     r1, r1, #IOMD_SoundsystemLinkBit
        STR     r1, [r0]

        LDR     r1, [r0]
        TST     r1, #IOMD_SoundsystemLinkBit
        BEQ     Config16BitSound                ; if zero, must be Rimmer, so assume 16bit sound hardware present

; set print and sound CMOS (8bit sound)
        MOV     R0, #TutuCMOS
        MOV     R1, #2_0100  ; tbs chars valid, ctrlchars '|x'
        BL      Write
        B       ConfigSoundDone

Config16BitSound
; set print and sound CMOS (16bit sound)
        MOV     R0, #TutuCMOS
        MOV     R1, #2_10100100  ; tbs chars valid, ctrlchars '|x'
        BL      Write

ConfigSoundDone
 ]
1015
 ] ; HAL
Neil Turton's avatar
Neil Turton committed
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027

        ADR     R8, DefaultCMOSTable
50
        LDRB    R0, [R8], #1
        CMP     R0, #&FF
        BEQ     hard_reset              ; power on bit musta bin set
        LDRB    R1, [R8], #1
        BL      Write
        B       %BT50

        LTORG

Neil Turton's avatar
Neil Turton committed
1028 1029 1030 1031 1032 1033 1034
 [ ValidateCMOS :LAND: STB
DefaultCMOSTable ; list of non-zero options wanted :
; byte pairs of offset, value
; terminated by offset &FF
        =       KeyDelCMOS,             32
        =       KeyRepCMOS,             8
        =       MODETVCMOS,             &10                                     ; TV 0,1
1035
        =       StartCMOS,              (1:SHL:7):OR:(2:SHL:3)                  ; NONUM, NOCAPS
1036
        =       DBTBCMOS,               (1:SHL:4)                               ; Boot
Kevin Bracey's avatar
Kevin Bracey committed
1037
        =       YearCMOS,               02
Kevin Bracey's avatar
Kevin Bracey committed
1038
        =       YearCMOS+1,             20
1039
  [ IOMD_C_MonitorType = 0 :LAND: IOMD_C_PALNTSCType = 0
Neil Turton's avatar
Neil Turton committed
1040
; TV if we don't have a MonitorType auto-detect bit
1041
        =       VduCMOS,                Sync_Separate :OR: MonitorType0
Neil Turton's avatar
Neil Turton committed
1042 1043
  |
; auto-detect if we have a MonitorType auto-detect bit
1044
        =       VduCMOS,                Sync_Auto :OR: MonitorTypeAuto
Neil Turton's avatar
Neil Turton committed
1045 1046
  ]
        =       MouseStepCMOS,          2
1047
        =       SystemSpeedCMOS,        (1:SHL:2):OR:(1:SHL:4):OR:(0:SHL:5)
Kevin Bracey's avatar
Kevin Bracey committed
1048 1049 1050
                                      ; Delete-etc reset
                                      ;              WimpMode auto
                                      ;                           Cache on
Neil Turton's avatar
Neil Turton committed
1051
 | ;ValidateCMOS
Neil Turton's avatar
Neil Turton committed
1052 1053 1054 1055
DefaultCMOSTable ; list of non-zero options wanted :
; byte pairs of offset, value
; terminated by offset &FF
        =       KeyDelCMOS,     32
1056
   [ M_CortexA8 :LOR: M_CortexA9
1057
        =       FileLangCMOS,   fsnumber_SCSIFS ; SCSIFS for OMAP3, etc.
1058
   |
1059 1060 1061
    [ M_ARM11ZF
        =       FileLangCMOS,   fsnumber_SDFS   ; SDFS for Pi, etc.
    |
Jeffrey Lee's avatar
Jeffrey Lee committed
1062
        =       FileLangCMOS,   fsnumber_adfs   ; ADFS
1063
    ]
1064
   ]
1065
        =       FontCMOS,       64      ; KJB 13-Dec-02: Changed to 256K from 64K
Neil Turton's avatar
Neil Turton committed
1066 1067 1068 1069
        =       PigCMOS,        10
        =       KeyRepCMOS,     8
        =       RMASizeCMOS,    0
        =       SpriteSizeCMOS, 0
Ben Avison's avatar
Ben Avison committed
1070
        =       SysHeapCMOS,    8
Neil Turton's avatar
Neil Turton committed
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
        =       MODETVCMOS,     &10     ; TV 0,1
        =       NetFSIDCMOS,    254
        =       NetPSIDCMOS,    235
        =       PSITCMOS,      (3:SHL:2) :OR: (1:SHL:5)
                              ; Baud 3
                              ;                print 1

        =       DBTBCMOS,      (1:SHL:4) :OR: (4:SHL:5)
                              ; Boot (changed from NoBoot 01-Sept-93)
                              ;                Data 4

1082 1083 1084
        =       StartCMOS,     (4:SHL:0) :OR: (2:SHL:3) :OR: (1:SHL:6) :OR: (0:SHL:7)
                              ; ^              ^              ^              ^
                              ; ADFS DR.4      NOCAPS         NODIR (moot)   NUM
Neil Turton's avatar
Neil Turton committed
1085 1086 1087 1088 1089 1090 1091 1092 1093

     [ NewClockChip                     ; only on A1's!
        =       NewADFSCMOS+1,  &FF     ; step 3 for each drive
     ]

        =       NewADFSCMOS+2,  1       ; ADFSBuffers 1
        =       SoundCMOS,      &F0     ; speaker on, volume 7, channel 1

        =       LanguageCMOS,   ConfiguredLang
1094
        =       YearCMOS,       04
Kevin Bracey's avatar
Kevin Bracey committed
1095
        =       YearCMOS+1,     20
Neil Turton's avatar
Neil Turton committed
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
 [ :LNOT: Select16BitSound
        =       TutuCMOS,       2_0100  ; tbs chars valid, ctrlchars '|x'
 ]
        =       NetFilerCMOS,  (0:SHL:0) :OR: (1:SHL:1) :OR: (0:SHL:2)
                              ; FS list order by name
                              ;                Use $.Arthurlib
                              ;                               Large icons

     ;  =       Mode2CMOS,      WimpModeAutoBit :OR: CMOSResetBit ;AKA SystemSpeedCMOS - removed by RManby and SCormie 8/3/95
        =       DesktopCMOS,    2_01000000      ; verbose ON
        =       WimpFlagsCMOS,  2_01101111      ; instant effects, drags off screen
        =       ProtectionCMOS, 2_01110110      ; allow only peek and user RPC
        =       MouseStepCMOS,  2
        =       FileSwitchCMOS,(1:SHL:0) :OR: (1:SHL:1) :OR: (0:SHL:2) :OR: (0:SHL:3) :OR: (0:SHL:6)
                              ; truncate names
                              ;                Use DragASprite (changed 01-Sept-93)
                              ;                               Interactive file copying
                              ;                                              Wimp dither colours off
                              ;                                                             last shutdown ordinary

        =       DesktopFeaturesCMOS,(1:SHL:0) :OR: (8:SHL:1) :OR: (0:SHL:7)
                              ;      3D look
                              ;                     Homerton.Medium
                              ;                                    tiled window background

Neil Turton's avatar
Neil Turton committed
1121
        [ STB
Neil Turton's avatar
Neil Turton committed
1122 1123 1124 1125 1126 1127 1128 1129 1130
        =       SystemSpeedCMOS,(1:SHL:0):OR:(0:SHL:1):OR:(1:SHL:2):OR:(0:SHL:3):OR:(1:SHL:4):OR:(0:SHL:5):OR:(1:SHL:6):OR:(0:SHL:7)
                              ;  AUN ROMBoot Enabled
                              ;               AUN auto-station numbering off
                              ;                            Delete-etc reset
                              ;                                         power saving off
                              ;                                                      WimpMode auto
                              ;                                                                  Cache on
                              ;                                                                               Broadcast loader disabled
                              ;                                                                                            broadcast loader colours off
Neil Turton's avatar
Neil Turton committed
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
        |
        =       SystemSpeedCMOS,(0:SHL:0):OR:(0:SHL:1):OR:(1:SHL:2):OR:(0:SHL:3):OR:(1:SHL:4):OR:(0:SHL:5):OR:(1:SHL:6):OR:(0:SHL:7)
                              ;  AUN BootNet Disabled
                              ;               AUN auto-station numbering off
                              ;                            Delete-etc reset
                              ;                                         power saving off
                              ;                                                      WimpMode auto
                              ;                                                                  Cache on
                              ;                                                                               Broadcast loader disabled
                              ;                                                                                            broadcast loader colours off
        ]

        [ :LNOT: STB
1144 1145 1146 1147
        =       FontMaxCMOS,    64      ; 4096k
        =       FontMax2CMOS,   36:EOR:12 ; 36 point
        =       FontMax3CMOS,   36:EOR:24 ; 36 point
        =       FontMax4CMOS,   16      ; 16 point
Neil Turton's avatar
Neil Turton committed
1148 1149
        |
        ;       yes, omitting FontMaxCMOS is deliberate!
Neil Turton's avatar
Neil Turton committed
1150 1151
        =       FontMax2CMOS,   &2C     ; 32 point
        =       FontMax3CMOS,   &38     ; 32 point
Neil Turton's avatar
Neil Turton committed
1152
        ]
Neil Turton's avatar
Neil Turton committed
1153 1154
        =       AlarmAndTimeCMOS,2_00010000 ; !Alarm autosave on
        =       FSLockCMOS+5,   &EA     ; Checksum for no password
1155
   [ M_CortexA8 :LOR: M_CortexA9 :LOR: M_ARM11ZF
1156 1157 1158 1159
        =       CDROMFSCMOS,    &C0                     ; drives = 0, buffer size = 256K
        =       NetworkFlags,   LanManFStransport       ; LMTransport is NetBIOS over IP
        =       WimpDragMoveLimitCMOS, (1:SHL:2)        ; WimpIconiseButton
        =       SparrowMarker,  FreewayNoAutoAddress    ; Stop Freeway assigning addresses to interfaces
1160
   |
1161
        =       CDROMFSCMOS,    &C1     ; drives = 1, buffer size = 256K
1162
   ]
Neil Turton's avatar
Neil Turton committed
1163
  ]
1164
        =       &FF
Neil Turton's avatar
Neil Turton committed
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
        ALIGN


no_cmos_reset                           ; R1 has por_bit set if power on
        Push    "r1"
        MOV     r0, #SystemSpeedCMOS
        BL      Read
        BIC     r1, r0, #CMOSResetBit   ; clear bit indicating CMOS reset
        MOV     r0, #SystemSpeedCMOS
        BL      Write
        Pull    "r1"

        Pull    r0                      ; always pull CannotReset flag
 [ SoftResets
        TST     r1, #por_bit
        BNE     hard_reset              ; it was a power-on, so it's a hard reset
        CMP     r0, #0
 [ DebugForcedReset
        MOVNE   r2, #Reset_CannotResetFlag
 ]
        BNE     hard_reset_forced

; IF control pressed OR memory implausible (Check SysHpd, CAM map sensible) THEN hard reset

        LDR     R0, =SysHeapStart
        LDR     R8, [R0, #:INDEX: hpdmagic]
        LDR     R2, =magic_heap_descriptor
        CMP     R8, R2                  ; check sysheap initialised
 [ DebugForcedReset
        MOVNE   r2, #Reset_SysHeapCorrupt
 ]
        BNE     hard_reset_forced

; also check CAM map sensible

Jeffrey Lee's avatar
Jeffrey Lee committed
1200
        LDR     R5, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
        LDR     R4, [R5, #Page_Size]    ; R4 = page size
        ADRL    R3, PageShifts-1
        LDRB    R4, [R3, R4, LSR #12]   ; R4 = log2(pagesize)
        LDR     R3, [R5, #RAMLIMIT]     ; R3 = total RAM size
        MOV     R2, R3, LSR R4          ; number of pages=total memory / pagesize
        CMP     R2, #256                ; but if fewer than 128 (eg 64 on A305) (NB if <256 then <=128)
        MOVCC   R2, #128                ; then use 128 (all MEMC1's pages need initialising,
                                        ; even if half of them are not in use)
        SUB     R2, R2, #1
        LDR     R3, =CamEntriesForVicky

        LDR     R4, [R5, #MaxCamEntry]  ; get highest CAM entry
        LDR     R5, [R5, #CamEntriesPointer] ; and pointer to CAM soft copy

        CMP     R5, R3                  ; if not the same
 [ DebugForcedReset
        MOVNE   r2, #Reset_WrongCamMapAddress
        BNE     hard_reset_forced
 ]
        CMPEQ   R4, R2                  ; or number of pages not the same
 [ DebugForcedReset
        MOVNE   r2, #Reset_WrongNumberOfPages
 ]
        BNE     hard_reset_forced       ; then do a hard reset

; now check all cam contains sensible values

Jeffrey Lee's avatar
Jeffrey Lee committed
1228
        LDR     R4, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244
        LDR     R4, [R4, #Page_Size]
        SUB     R4, R4, #1
        ORR     R4, R4, #&F0000000      ; can have addresses above 64M
CamCheck
        LDR     R3, [R5, R2, LSL #2]
        BIC     r3, r3, #&F0000000      ; remove PPL
        TST     R3, R4
 [ DebugForcedReset
        MOVNE   r2, #Reset_CamMapCorrupt
 ]
        BNE     hard_reset_forced       ; wally entry: not pagesize multiple, or >= 32M
        SUBS    R2, R2, #1
        BPL     CamCheck

; leave CTRL test till last, so the keyboard's had as much time to
; wiggle the wet string as we can give it
Jeffrey Lee's avatar
Jeffrey Lee committed
1245
        LDR     R0, =ZeroPage+InitKbdWs
Neil Turton's avatar
Neil Turton committed
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269
        LDRB    R1, [R0, #CTRL_Down_Flag]
        CMP     R1, #0
        BNE     hard_reset

soft_reset
; clear out 4K of scratchspace, to use as a reverse CAM soft copy;
; set bytes to indicate page mapped to that address. Can then recalculate
; end of memory.

; This code doesn't currently work on ARM600 versions -
; 4K of workspace isn't enough to do this with a 4K page size
; We'd probably want to do it differently anyway, using the L2PT
; But since we're removing soft resets it's not worth the effort

        ASSERT  MEMM_Type <> "ARM600"

        MOV     R5, #ScratchSpace
        MOV     R1, #4*1024
        MOV     R2, #0
clrscratch
        SUBS    R1, R1, #4
        STRPL   R2, [R5, R1]
        BPL     clrscratch

Jeffrey Lee's avatar
Jeffrey Lee committed
1270 1271
        LDR     r7, =ZeroPage
        LDR     R2, [R7, #Page_Size]
Neil Turton's avatar
Neil Turton committed
1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310
        ADRL    R8, PageShifts-1
        LDRB    R8, [R8, R2, LSR #12]

        LDR     r2, [r7, #RAMLIMIT]
        MOV     r2, r2, LSR r8          ; last valid page
        SUB     r2, r2, #1

        LDR     R7, [R7, #CamEntriesPointer]
        LDR     R12, =DuffEntry

restoreCAMloop
        LDR    R3, [R7, R2, LSL #2]
        MOV    r11, r3, LSR #28
        BIC    r3, r3, #&F0000000

        MOV    R0, R3, LSR R8              ; logram page number
        LDRB   R4, [R5, R0]
        CMP    r4, #0                      ; check for doubly mapped pages
        BEQ    rclon

        ORR    r3, r12, #&30000000         ; force to invalid place if so.
        STR    r3, [R7, R2, LSL #2]
        MOV    r3, r12
        MOV    r11, #3                     ; protected
        MOV    R0, R3, LSR R8
        LDRB   R4, [R5, R0]
rclon
        CMP    r3, #16*1024*1024           ; in application space?
        MOVLT  r11, #0                     ; noprot if so
        STRLT  r3, [R7, R2, LSL #2]
        ADD    R4, R4, #1
        STRB   R4, [R5, R0]                ; sema for interesting pages
        BL     BangCam
        SUBS   R2, R2, #1
        BPL    restoreCAMloop

; now do post-scan to see if we need to do more CAM bashing to get pages back.
; any entries that aren't validateable should be remapped.

Jeffrey Lee's avatar
Jeffrey Lee committed
1311
        LDR     R1, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1312
        MOV     R12, #ScratchSpace
Jeffrey Lee's avatar
Jeffrey Lee committed
1313 1314
        LDR     R2, [R1, #Page_Size]
        MOV     R7, #0
Neil Turton's avatar
Neil Turton committed
1315 1316 1317 1318 1319 1320 1321 1322
findapplend
        LDRB    R3, [R12], #1
        CMP     R3, #0
        ADDNE   R7, R7, R2
        BNE     findapplend
        STR     R7, [R1, #AplWorkSize]  ; verified value
        LDR     R3, [R1, #RAMLIMIT]     ; calc last valid page:
        MOV     R3, R3, LSR R8          ; RAMLIMIT >> R8
Jeffrey Lee's avatar
Jeffrey Lee committed
1323
        LDR     R4, [R1, #CamEntriesPointer] ; no PPL
Neil Turton's avatar
Neil Turton committed
1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
testforremap
        SUBS    R3, R3, #1
        BMI     finishedremap
        LDR     R0, [R4, R3, LSL #2]
        BIC     r0, r0, #&F0000000      ; remove PPL
        ADD     R1, R0, R2
        SWI     XOS_ValidateAddress
        BCC     testforremap

        Push    "R2-R4"
        MOV     R0, R0, LSR R8          ; curr logram page number
        LDRB    R4, [R5, R0]
        SUB     R4, R4, #1
        STRB    R4, [R5, R0]            ; dec sema
        MOV     R2, R3                  ; entry no
        MOV     R3, R7                  ; addr to set to
        BL      BangCamUpdate
        Pull    "R2-R4"
holefilled
        ADD     R7, R7, R2
        LDRB    R0, [R12], #1           ; reinspect our reverse map
        CMP     R0, #0
        BNE     holefilled
Jeffrey Lee's avatar
Jeffrey Lee committed
1347 1348 1349
      [ ZeroPage <> 0
        LDR     R0, =ZeroPage
      ]
Neil Turton's avatar
Neil Turton committed
1350 1351 1352 1353 1354
        STR     R7, [R0, #AplWorkSize]
        B       testforremap

finishedremap
        MOV     R12, #NVECTORS-1
Jeffrey Lee's avatar
Jeffrey Lee committed
1355
        LDR     R11, =ZeroPage+VecPtrTab
Neil Turton's avatar
Neil Turton committed
1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
freenextvec
        LDR     R2, [R11, R12, LSL #2]
loseveclink
        LDR     R3, [R2, #TailPtr]
        BL      FreeSysHeapNode
        MOVVC   R2, R3
        BVC     loseveclink
        CMP     R3, #0                  ; were we at the end of the chain?
 [ DebugForcedReset
        MOVNE   r2, #Reset_VectorChainCorrupt
 ]
        BNE     hard_reset_forced
        SUBS    R12, R12, #1
        BPL     freenextvec
; so that's the code for restore default vectors, basically
        BL      InitVectors
Jeffrey Lee's avatar
Jeffrey Lee committed
1372
        LDR     R0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415
        LDR     R1, [R0, #AplWorkSize]
        STR     R1, [R0, #MemLimit]

        LDR     R3, =TickNodeChain
        LDR     R2, [R3]

loseticknodes
        CMP     R2, #0
        BEQ     ticknodesallgone

        LDR     R3, [R2]
        BL      FreeSysHeapNode
 [ DebugForcedReset
        MOVVS   r2, #Reset_TickNodesCorrupt
 ]
        BVS     hard_reset_forced
        MOV     R2, R3
        B       loseticknodes

ticknodesallgone
; and now it's time to free the IRQ structures

        MOV     R12, #(NoInterrupt-1)*12+8      ; last device link offset
        LDR     R11, =DefaultIRQ1V-DefaultIRQ1Vcode+Devices
freenextdev
        LDR     R2, [R11, R12]
losedevlink
        CMP     R2, #0
        BEQ     stepdevice

        LDR     R3, [R2, #8]
        BL      FreeSysHeapNode
 [ DebugForcedReset
        MOVVS   r2, #Reset_DeviceVectorCorrupt
 ]
        BVS     hard_reset_forced
        MOV     R2, R3
        B       losedevlink
stepdevice
        SUBS    R12, R12, #12
        BPL     freenextdev

; now the PIRQ structures and CallBack_Vector
Jeffrey Lee's avatar
Jeffrey Lee committed
1416
        LDR     R11, =ZeroPage+PIRQ_Chain
Neil Turton's avatar
Neil Turton committed
1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
        MOV     r4, #PodDesp_Link
losepirqchain
        LDR     R2, [R11]
        CMP     r2, #0                  ; for CallBack_Vector
        BEQ     doobry
losepirqlink
        LDR     R3, [R2, r4]
        BL      FreeSysHeapNode
        MOVVC   R2, R3
        BVC     losepirqlink
        CMP     R3, #0                  ; were we at the end of the chain?
 [ DebugForcedReset
        MOVNE   r2, #Reset_PoduleOrCallBackCorrupt
 ]
        BNE     hard_reset_forced
Jeffrey Lee's avatar
Jeffrey Lee committed
1432
        LDR     R2, =ZeroPage+PIRQ_Chain
Neil Turton's avatar
Neil Turton committed
1433
        CMP     R11, R2
1434
        LDR     R2, =ZeroPage+PFIQasIRQ_Chain
Neil Turton's avatar
Neil Turton committed
1435 1436
        MOVEQ   R11, R2
        CMPNE   r11, r2
Jeffrey Lee's avatar
Jeffrey Lee committed
1437
        LDREQ   r11, =ZeroPage+CallBack_Vector
Neil Turton's avatar
Neil Turton committed
1438 1439 1440 1441 1442 1443 1444
    [ PodDesp_Link <> 0
        MOVEQ   r4, #0
    ]
        BEQ     losepirqchain


doobry  Pull    "R1"                    ; IOCControl restoration
Jeffrey Lee's avatar
Jeffrey Lee committed
1445
        LDR     R0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1446
        STRB    R1, [R0, #IOCControlSoftCopy]
Jeffrey Lee's avatar
Jeffrey Lee committed
1447
        ASSERT  :LNOT: HAL
Neil Turton's avatar
Neil Turton committed
1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464
        MOV     R0, #IOC                ; and bash the hardware
        STRB    R1, [R0, #IOCControl]

        MOV     R0, #SoftReset
        B       ResetPart1Done

 |

; if soft resets are disabled, drop thru into hard reset code

 ] ; end of code to do with soft resets

hard_reset
 [ DebugForcedReset
        MOV     r2, #0                  ; indicate normal hard reset
 ]
hard_reset_forced
1465
        LDR     r8, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1466
 [ DebugForcedReset
Jeffrey Lee's avatar
Jeffrey Lee committed
1467
        STR     r2, [r8]                ; store to logical address zero
Neil Turton's avatar
Neil Turton committed
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477
 ]

        Pull    "R2"                    ; discard old IOC state

; fill in relevant CamMap entries, so can soft start.

        LDR     R8, [R8, #Page_Size]
        ADRL    R1, PageShifts-1
        LDRB    R1, [R1, R8, LSR #12]

Jeffrey Lee's avatar
Jeffrey Lee committed
1478
        LDR     r2, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1479 1480 1481 1482 1483 1484 1485 1486 1487
        LDR     r0, [r2, #VideoSize]    ; offset from start of physical pages to static part
        MOV     r0, r0, LSR r1          ; r0 := cam entry number
        MOV     r0, r0, LSL #3          ; r0 := offset into CAM map for start of static part

        MOV     R7, #32*1024*8
        MOV     R7, R7, LSR R1          ; r7 := cam entry offset for 32K

        LDR     R12, [R2, #RAMLIMIT]    ; R12 = total RAM size

1488
 [ :LNOT:HAL
Neil Turton's avatar
Neil Turton committed
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
                                        ; new code which allows for MEMC2's small pages
        MOV     R1, R12, LSR R1         ; R1 = number of pages
        CMP     R1, #256                ; but if fewer than 128 (eg 64 on A305) (NB if <256 then <=128)
        MOVCC   R1, #128                ; then use 128 (all MEMC1's pages need initialising,
                                        ; even if half of them are not in use)

        SUB     R3, R1, #1
        STR     R3, [R2, #MaxCamEntry]

        LDR     R1, =CamEntriesForVicky
        STR     R1, [R2, #CamEntriesPointer]


; On ARM600 we must zap all the soft CAM map before adding any entries,
; since the old contents are used in BangCamUpdate

        Push    "r0"
        ADD     r2, r1, r3, LSL #3      ; r2 -> last entry to do
        LDR     r0, =DuffEntry
        MOV     lr, #AP_Duff            ; PPL = no access
WallopDuffOnes
        STMDA   r2!, {r0, lr}           ; store address, PPL
        CMP     r2, r1
        BCS     WallopDuffOnes
        Pull    "r0"
        ADD     R0, R0, R1

1516
        LDR     R2, =CursorChunkAddress
Neil Turton's avatar
Neil Turton committed
1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
        LDR     r1, =AP_CursorChunk
        BL      AddCamEntries

        CMP     R12, #512*1024
        SUBEQ   R0, R0, R7              ; previous entries
        ADDNE   R0, R0, R7              ; next entries
        MOV     R2, #0
        MOV     r1, #AP_PageZero
        BL      AddCamEntries

        CMP     R12, #512*1024
        SUBEQ   R0, R0, R7              ; previous entries
        ADDNE   R0, R0, R7              ; next entries
1530
        LDR     R2, =SysHeapChunkAddress
Neil Turton's avatar
Neil Turton committed
1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541
        MOV     r1, #AP_SysHeap :OR: PageFlags_Unavailable
        BL      AddCamEntries

        ADD     R0, R0, R7              ; next entries (ignore 512K machines)
        MOV     r7, #0
        LDR     r7, [r7, #L2PTSize]
        MOV     r7, r7, LSR #12-3       ; number of pages * 8
        LDR     R2, =L2PT
        LDR     r1, =AP_L2PT :OR: PageFlags_Unavailable
        BL      AddCamEntries

1542 1543
        ADD     r2, r0, #((L1PT-L2PT):SHR:(12-3))   ; point at PPL for 1st L1 page
        ADD     r2, r2, #4
Neil Turton's avatar
Neil Turton committed
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558
        LDR     r1, =AP_L1PT
        STR     r1, [r2], #8            ; store 4 CAM entries for 4 x 4K = 16K of L1
        STR     r1, [r2], #8            ; mark them as unavailable for removal
        STR     r1, [r2], #8
        STR     r1, [r2], #8

        ADD     R0, R0, R7              ; add on enough pages for L2PT

        MOV     r7, #0
        LDR     r7, [r7, #SoftCamMapSize] ; number of bytes in soft cam map
        ADD     r7, r7, #UndStackSize
        MOV     r7, r7, LSR #12-3       ; number of bytes of cam map for this
        LDR     R2, =UndStackSoftCamChunk
        MOV     r1, #AP_UndStackSoftCam
        BL      AddCamEntries
1559
 ]
1560
        DebugTX "InitDynamicAreas"
Neil Turton's avatar
Neil Turton committed
1561 1562 1563 1564 1565 1566

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

        BL      InitDynamicAreas

1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580
; RMA
        Push    "r0-r12"
        MOV     r1, #ChangeDyn_RMA      ; Area number
        MOV     r2, #4096               ; Initial size
        MOV     r3, #RMAAddress         ; Base address
        MOV     r4, #AP_RMA             ; Area flags
        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
1581
; Screen
Neil Turton's avatar
Neil Turton committed
1582 1583 1584 1585
        Push    "r0-r12"
        MOV     r0, #ScreenSizeCMOS
        BL      Read

Jeffrey Lee's avatar
Jeffrey Lee committed
1586
        LDR     r5, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1587 1588 1589 1590 1591 1592 1593
        LDR     r10, [r5, #Page_Size]   ; needed by MassageScreenSize
        MUL     r0, r10, r0             ; convert to bytes
        LDR     r5, [r5, #VideoSize]    ; maximum size
        BL      MassageScreenSize

        MOV     r1, #ChangeDyn_Screen   ; area number
        MOV     r2, r0                  ; initial size
Kevin Bracey's avatar
Kevin Bracey committed
1594
        MOV     r3, #-1                 ; Base address dynamic
Neil Turton's avatar
Neil Turton committed
1595 1596 1597 1598 1599 1600 1601 1602
        LDR     r4, =AP_Screen          ; area flags
        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
1603
        STR     r3, [r7, #ScreenEndAddr]
Neil Turton's avatar
Neil Turton committed
1604 1605
        Pull    "r0-r12"

1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621
  [ LongCommandLines :LAND: (:LNOT: HAL)
        ;sort out the Kernel buffers dynamic area
        Push    "r0-r12"
        MOV     r1, #ChangeDyn_Kbuffs   ; Area number
        MOV     r2, #KbuffsSize         ; Initial (and in fact permanent) size
        LDR     r3, =KbuffsBaseAddress  ; Base address
        MOV     r4, #AP_Kbuffs          ; Area flags
        MOV     r5, #KbuffsMaxSize      ; Maximum size
        MOV     r6, #0                  ; no handler
        MOV     r7, #0
        ADRL    r8, AreaName_Kbuffs     ; 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
1622
; SpriteArea
Neil Turton's avatar
Neil Turton committed
1623 1624
        Push    "r0-r12"
        MOV     r0, #0                  ; initialise SpriteSize to zero
Jeffrey Lee's avatar
Jeffrey Lee committed
1625
      [ ZeroPage = 0
Neil Turton's avatar
Neil Turton committed
1626
        STR     r0, [r0, #SpriteSize]   ; (fixes bug MED-00811)
Jeffrey Lee's avatar
Jeffrey Lee committed
1627 1628 1629 1630
      |
        LDR     r1, =ZeroPage
        STR     r0, [r1, #SpriteSize]   ; (fixes bug MED-00811)
      ]
Neil Turton's avatar
Neil Turton committed
1631 1632 1633 1634 1635 1636 1637

        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
        MOV     r4, #AP_Sprites         ; Area flags
1638
        MOV     r5, #16*1024*1024       ; Maximum size (changed from -1, address space preservation)
Neil Turton's avatar
Neil Turton committed
1639 1640 1641 1642 1643 1644 1645
        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
1646
; RAMDisc
Neil Turton's avatar
Neil Turton committed
1647 1648 1649 1650 1651 1652
        Push    "r0-r12"
        MOV     r0, #RAMDiscCMOS        ; find out how much RAM disc configured
        BL      GetConfiguredSize       ; in: r0 = CMOS address, out: r2 = size

        MOV     r1, #ChangeDyn_RamFS    ; Area number
        MOV     r3, #-1                 ; Base address dynamic
1653 1654 1655 1656 1657 1658 1659 1660 1661 1662
        ARM_read_ID r4
        AND     r4, r4, #&F000
        CMP     r4, #&A000
        MOVEQ   r4, #AP_RAMDisc_SA      ; Area flags, if StrongARM  (introduced for Ursula)
        MOVNE   r4, #AP_RAMDisc         ; Area flags
      [ {FALSE}
        MOV     r5, #16*1024*1024       ; Limit maximum size to 16MB while fiddling with FileCore
      |
        MOV     r5, #128*1024*1024      ; A trade off between nice big disc and complete waste of address space
      ]
Neil Turton's avatar
Neil Turton committed
1663 1664 1665 1666 1667 1668 1669
        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!
        Pull    "r0-r12"

Kevin Bracey's avatar
Kevin Bracey committed
1670
; FontArea
Neil Turton's avatar
Neil Turton committed
1671 1672 1673 1674 1675 1676 1677
        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
        MOV     r4, #AP_FontArea        ; Area flags
Kevin Bracey's avatar
Kevin Bracey committed
1678 1679
        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
1680 1681 1682 1683 1684 1685 1686 1687 1688
        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"

; get here with R2 = highest CAM entry used (in old model)

1689 1690 1691 1692 1693 1694
; [ HAL32
;        MOV     R0, #0
;        LDR     R0, [R0, #RAMLIMIT]
;        SUB     R0, R0, #32*1024
;        MOV     R0, R0, LSR #12
; |
Neil Turton's avatar
Neil Turton committed
1695
        LDR     R0, =(AplWorkMaxSize-32*1024):SHR:12    ; maximum number of pages in aplspace
1696
; ]
Neil Turton's avatar
Neil Turton committed
1697
        MOV     R3, #32*1024            ; aplwork start
Jeffrey Lee's avatar
Jeffrey Lee committed
1698
        LDR     R1, =ZeroPage+AplWorkSize ; aplwork size
Neil Turton's avatar
Neil Turton committed
1699 1700 1701
        MOV     r11, #AP_AppSpace
        BL      FudgeConfigureRMA       ; put as much as possible in aplspace

Jeffrey Lee's avatar
Jeffrey Lee committed
1702
        LDR     R0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1703 1704 1705 1706 1707
        LDR     R1, [R0, #AplWorkSize]
        ADD     R1, R1, #32*1024
        STR     R1, [R0, #AplWorkSize]
        STR     R1, [R0, #MemLimit]

1708
        DebugTX "InitVectors"
Neil Turton's avatar
Neil Turton committed
1709 1710
        BL      InitVectors               ; ready for OsByte to read mode

Jeffrey Lee's avatar
Jeffrey Lee committed
1711 1712 1713 1714 1715
        LDR     R1, =ZeroPage+ModuleSWI_HashTab
        MOV     R2, #ModuleSHT_Entries
      [ ZeroPage <> 0
        MOV     R0, #0
      ]
Neil Turton's avatar
Neil Turton committed
1716 1717
clearmswis
        SUBS    R2, R2, #1
Jeffrey Lee's avatar
Jeffrey Lee committed
1718 1719 1720 1721 1722 1723
        STR     R0, [R1, R2, LSL #2]
        BGT     clearmswis

      [ ZeroPage <> 0
        LDR     R2, =ZeroPage
      ]
Neil Turton's avatar
Neil Turton committed
1724 1725 1726

     [  International
        MOV     R1, #-1                                 ; We don't have a message file yet !
Jeffrey Lee's avatar
Jeffrey Lee committed
1727 1728
        STRB    R1, [R2, #ErrorSemaphore]               ; Don't translate errors.
        STR     R0, [R2, #KernelMessagesBlock]          ; No message file open.
1729
      [ CacheCommonErrors
Jeffrey Lee's avatar
Jeffrey Lee committed
1730
        STR     R0, [R2, #CachedErrorBlocks]            ; No cached errors
1731
      ]
Neil Turton's avatar
Neil Turton committed
1732 1733
     ]

1734
  [ HAL
Jeffrey Lee's avatar
Jeffrey Lee committed
1735
        LDR     R0, =ZeroPage+HAL_StartFlags
1736 1737 1738
        LDR     R1, [R0]
        TST     R1, #OSStartFlag_POR
  |
Neil Turton's avatar
Neil Turton committed
1739 1740 1741 1742
        MOV     R0, #IOC
        LDRB    R1, [R0, #IOCIRQSTAA]
        ANDS    R1, R1, #por_bit
        STRNEB  R1, [R0, #IOCIRQCLRA]   ; clear POR if set
1743
  ]
Neil Turton's avatar
Neil Turton committed
1744

Kevin Bracey's avatar
Kevin Bracey committed
1745 1746 1747 1748

        ; Make the choice between PowerOn and Hard reset based purely on
        ; the state of the POR bit and NOT on whether memory was cleared.
 [ {FALSE}
Jeffrey Lee's avatar
Jeffrey Lee committed
1749
        LDREQ   R0, =ZeroPage+OsbyteVars + :INDEX: LastBREAK
Neil Turton's avatar
Neil Turton committed
1750 1751
        LDREQB  R0, [R0]
        TSTEQ   R0, #&80                ; tbs set if memory cleared
Kevin Bracey's avatar
Kevin Bracey committed
1752
 ]
Neil Turton's avatar
Neil Turton committed
1753 1754 1755 1756 1757
        MOVNE   R0, #PowerOnReset
        MOVEQ   R0, #ControlReset


ResetPart1Done                          ; R0 is reset type
Kevin Bracey's avatar
Kevin Bracey committed
1758
        WritePSRc SVC_mode + I_bit, r1  ; interrupts off since kbd bash done
Jeffrey Lee's avatar
Jeffrey Lee committed
1759
        LDR     R1, =ZeroPage+OsbyteVars + :INDEX: LastBREAK
Neil Turton's avatar
Neil Turton committed
1760 1761
        STRB    R0, [R1]

Jeffrey Lee's avatar
Jeffrey Lee committed
1762
        LDR     R1, =ZeroPage+InitIRQWs
1763 1764 1765 1766 1767
 [ HAL
        LDR     R0, [R1, #KbdFlags]
        AND     R1, R0, #KbdFlag_Shift
        AND     R0, R0, #KbdFlag_Present
 |
Neil Turton's avatar
Neil Turton committed
1768 1769
        LDRB    R0, [R1, #KB_There_Flag]
        LDRB    R1, [R1, #SHIFT_Down_Flag]
1770
 ]
Neil Turton's avatar
Neil Turton committed
1771 1772
        Push    "R0, R1"                ; save until after MOSInit

1773
        DebugTX "InitIRQ1"
1774
        BL      InitialiseIRQ1Vtable
Neil Turton's avatar
Neil Turton committed
1775

Jeffrey Lee's avatar
Jeffrey Lee committed
1776
        LDR     R3, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1777
        ADRL    R1, Default_PIRQHandler_Node
Jeffrey Lee's avatar
Jeffrey Lee committed
1778 1779
        STR     R1, [R3, #PIRQ_Chain]
        STR     R1, [R3, #PFIQasIRQ_Chain]
Neil Turton's avatar
Neil Turton committed
1780 1781 1782
 ASSERT Default_PFIQasIRQHandler_Node = Default_PIRQHandler_Node

        MOV     R0, #0                  ; put in IRQ handler, word at 0
Jeffrey Lee's avatar
Jeffrey Lee committed
1783 1784 1785
        STRB    r0, [r3, #FIQclaim_interlock]
        STRB    r0, [r3, #CallBack_Flag]
        STR     r0, [r3, #CallBack_Vector]
Neil Turton's avatar
Neil Turton committed
1786

1787 1788 1789 1790 1791 1792 1793
; 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
1794
        LDRVC   R0, =ZeroPage
1795 1796
        STRVC   R2, [R0, #ProcVec_Branch0]

Kevin Bracey's avatar
Kevin Bracey committed
1797
 [ :LNOT: No26bitCode
Neil Turton's avatar
Neil Turton committed
1798 1799 1800

; we're poking locations 0 and &18 here, so we'd best go back to SVC32

1801
        MRS     r2, CPSR
Neil Turton's avatar
Neil Turton committed
1802 1803
        BIC     r3, r2, #&1F
        ORR     r3, r3, #SVC32_mode
1804
        MSR     CPSR_c, r3
Neil Turton's avatar
Neil Turton committed
1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
 ]

 [ DebugForcedReset
        LDR     R1, [R0]
        TEQ     R1, #0                                  ; if normal hard reset
        LDREQ   R1, BranchThroughZeroInstruction2       ; then get branchthruzero code
 |
        LDR     R1, BranchThroughZeroInstruction2
 ]
        STR     R1, [R0]                                ; put branch through 0 code at 0

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

Jeffrey Lee's avatar
Jeffrey Lee committed
1819
        LDR     R2, =ZeroPage+InitIRQWs                 ; clear temp ws
1820 1821 1822 1823
        MOV     R3, #0
        MOV     R4, #0
        STMIA   R2!, {R3,R4}
        STMIA   R2!, {R3,R4}
1824
        DebugTX "IMB_Full"
1825

1826 1827 1828 1829
   ;we need to do an IMB type thing for modifying code in vector area,
   ;and for copying irq handler code
   ;
        ARMop   IMB_Full,,,r0
Kevin Bracey's avatar
Kevin Bracey committed
1830
        ChangedProcVecs r0
Jeffrey Lee's avatar
Jeffrey Lee committed
1831
        LDR     r0,=ZeroPage
Neil Turton's avatar
Neil Turton committed
1832

Kevin Bracey's avatar
Kevin Bracey committed
1833

Kevin Bracey's avatar
Kevin Bracey committed
1834
 [ :LNOT:No26bitCode
Neil Turton's avatar
Neil Turton committed
1835 1836 1837

; now back to SVC26

1838
        MSR     CPSR_c, r2
Neil Turton's avatar
Neil Turton committed
1839
 ]
1840

Neil Turton's avatar
Neil Turton committed
1841 1842
        MOV     R1, #&100
        STR     R1, [R0, #RCLimit]
Jeffrey Lee's avatar
Jeffrey Lee committed
1843 1844 1845
        MOV     R1, #0
        STR     R1, [R0, #ReturnCode]
        STR     R1, [R0, #TickNodeChain]
Neil Turton's avatar
Neil Turton committed
1846

1847
; clear the keyboard workspace (tidy!)
Jeffrey Lee's avatar
Jeffrey Lee committed
1848
        ADD     R0, R0, #&1C
Kevin Bracey's avatar
Kevin Bracey committed
1849
        MOV     R2, #InitWsEnd - &1C
1850 1851
        BL      memset

Neil Turton's avatar
Neil Turton committed
1852 1853 1854 1855
;now put in error handler and escape handler
        BL      DEFHAN
        BL      DEFHN2
        MOV     R0, #ExceptionDumpArea
Jeffrey Lee's avatar
Jeffrey Lee committed
1856
        LDR     R1, =ZeroPage+DUMPER
Neil Turton's avatar
Neil Turton committed
1857 1858 1859
        SWI     XOS_ChangeEnvironment

        VDWS    WsPtr                   ; main MOS initialisation
1860
        DebugTX "VduInit"
Neil Turton's avatar
Neil Turton committed
1861
        BL      VduInit
1862
        DebugTX "ExecuteInit"
Neil Turton's avatar
Neil Turton committed
1863
        BL      ExecuteInit
1864
        DebugTX "KeyInit"
Neil Turton's avatar
Neil Turton committed
1865
        BL      KeyInit
1866
        DebugTX "MouseInit"
Neil Turton's avatar
Neil Turton committed
1867
        BL      MouseInit
1868
        DebugTX "OscliInit"
Neil Turton's avatar
Neil Turton committed
1869 1870
        BL      OscliInit               ; before initialising modules

1871
        DebugTX "Enabling IRQs"
Kevin Bracey's avatar
Kevin Bracey committed
1872
        WritePSRc SVC_mode, R14         ; enable IRQs
1873
        DebugTX "IRQs on"
Neil Turton's avatar
Neil Turton committed
1874

Kevin Bracey's avatar
Kevin Bracey committed
1875 1876 1877
 [ DebugTerminal
        MOV     R0, #RdchV
        ADRL    R1, DebugTerminal_Rdch
Jeffrey Lee's avatar
Jeffrey Lee committed
1878
        LDR     R2, =ZeroPage
Kevin Bracey's avatar
Kevin Bracey committed
1879 1880 1881 1882 1883
        LDR     R2, [R2, #HAL_Workspace]
        SWI     XOS_Claim
        MOV     R0, #WrchV
        ADRL    R1, DebugTerminal_Wrch
        SWI     XOS_Claim
1884
        DebugTX "Debug terminal on"
Kevin Bracey's avatar
Kevin Bracey committed
1885 1886
 ]

1887
        [ DoInitialiseMode :LOR: :LNOT: Embedded_UI
Neil Turton's avatar
Neil Turton committed
1888 1889
        BL      InitialiseMode          ; select correct screen mode, in case any
                                        ; module prints anything in initialisation
Neil Turton's avatar
Neil Turton committed
1890
        ]
Neil Turton's avatar
Neil Turton committed
1891 1892 1893 1894 1895 1896 1897 1898 1899

        MOV     R0, #&FD                ; read last reset type
        MOV     R1, #0
        MOV     R2, #&FF
        SWI     XOS_Byte
        CMP     R1, #SoftReset          ; soft reset?
        BEQ     SkipHardResetPart2

; HardResetPart2
Ben Avison's avatar
Ben Avison committed
1900
 [ HAL
1901
        DebugTX "HAL_InitDevices"
Ben Avison's avatar
Ben Avison committed
1902 1903
        AddressHAL
        MOV     R0, #0
Jeffrey Lee's avatar
Jeffrey Lee committed
1904
      [ ZeroPage = 0
Ben Avison's avatar
Ben Avison committed
1905 1906
        STR     R0, [R0, #DeviceCount]
        STR     R0, [R0, #DeviceTable]
Jeffrey Lee's avatar
Jeffrey Lee committed
1907 1908 1909 1910 1911
      |
        LDR     R1, =ZeroPage
        STR     R0, [R1, #DeviceCount]
        STR     R0, [R1, #DeviceTable]
      ]
Ben Avison's avatar
Ben Avison committed
1912
        CallHAL HAL_InitDevices         ; get HAL to register any devices it has
1913
        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
Ben Avison's avatar
Ben Avison committed
1914
 |
Neil Turton's avatar
Neil Turton committed
1915
        BL      L1L2PTenhancements      ; little tricks on cacheability etc for performance
1916
 ]
1917
        DebugTX "InitVariables"
Neil Turton's avatar
Neil Turton committed
1918
        BL      InitVariables
1919
        DebugTX "AMBControl_Init"
Neil Turton's avatar
Neil Turton committed
1920
        BL      AMBControl_Init         ; initialise AMBControl section
1921
        DebugTX "ModuleInit"
Neil Turton's avatar
Neil Turton committed
1922 1923 1924 1925 1926 1927 1928 1929 1930 1931
        BL      ModuleInit              ; initialise modules
                                        ; scan podules, copy modules.

        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
1932
        LDR     R0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945
        LDR     R0, [R0, #Page_Size]
        MULTIPLY R3, R0, R2             ; size spare wanted
        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

1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961
        ; 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)
        MOV     R0, #9
        MOV     R1, #2
        SWI     XOS_ReadSysInfo

  [ UseNewFX0Error
        ; Also, *FX 0
        BL      InitNewFX0Error
  ]

Neil Turton's avatar
Neil Turton committed
1962 1963 1964 1965 1966
  [ DebugROMInit
        SWI     XOS_WriteS
        =       "Service_PostInit",0
        SWI     XOS_NewLine
  ]
Neil Turton's avatar
Neil Turton committed
1967 1968 1969 1970
        MOV     r1, #Service_PostInit   ; issue post-initialisation service
        BL      Issue_Service

; New code added here by TMD 01-Apr-92
Ben Avison's avatar
Ben Avison committed
1971
; Changed to use OS_LeaveOS 16-Oct-02
Neil Turton's avatar
Neil Turton committed
1972

Neil Turton's avatar
Neil Turton committed
1973 1974 1975 1976 1977
  [ DebugROMInit
        SWI     XOS_WriteS
        =       "callbacks",0
        SWI     XOS_NewLine
  ]
Ben Avison's avatar
Ben Avison committed
1978
        SWI     XOS_LeaveOS
Neil Turton's avatar
Neil Turton committed
1979
        SWI     XOS_EnterOS             ; switch back to SVC mode (IRQs, FIQs enabled)
Kevin Bracey's avatar
Kevin Bracey committed
1980
  [ :LNOT: HAL :LAND: RO371Timings
1981 1982
        BL      finalmemoryspeed
  ]
Neil Turton's avatar
Neil Turton committed
1983 1984
; end of added code

Jeffrey Lee's avatar
Jeffrey Lee committed
1985 1986
     [ International                    ; Open the kernel messages file.
        LDR     r0, =ZeroPage+KernelMessagesBlock+4
Neil Turton's avatar
Neil Turton committed
1987 1988 1989 1990
        ADR     r1, MessageFileName
        MOV     r2, #0                  ; Use file directly.
        SWI     XMessageTrans_OpenFile
        MOVVC   r0, #-1
Jeffrey Lee's avatar
Jeffrey Lee committed
1991
      [ ZeroPage = 0
Neil Turton's avatar
Neil Turton committed
1992
        STRVC   r0, [r0, #KernelMessagesBlock+1]  ; Message file is now open.
Jeffrey Lee's avatar
Jeffrey Lee committed
1993 1994 1995
      |
        LDR     lr, =ZeroPage
        STRVC   r0, [lr, #KernelMessagesBlock]  ; Message file is now open.
Neil Turton's avatar
Neil Turton committed
1996
      ]
Jeffrey Lee's avatar
Jeffrey Lee committed
1997
     ]
Neil Turton's avatar
Neil Turton committed
1998 1999 2000

SkipHardResetPart2                      ; code executed on all types of reset
      [ International
Jeffrey Lee's avatar
Jeffrey Lee committed
2001
        LDR     r0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
2002 2003
        LDR     r1, [r0, #KernelMessagesBlock] ; if we've managed to open message file
        TEQ     r1, #0
Jeffrey Lee's avatar
Jeffrey Lee committed
2004
        ASSERT  (ZeroPage :AND: 255) = 0
Neil Turton's avatar
Neil Turton committed
2005 2006 2007
        STRNEB  r0, [r0, #ErrorSemaphore] ; then allow errors to be translated
      ]

Robert Sprowson's avatar
Robert Sprowson committed
2008
      [ DoInitialiseMode :LOR: :LNOT: Embedded_UI
Neil Turton's avatar
Neil Turton committed
2009
        BL      InitialiseMode
Robert Sprowson's avatar
Robert Sprowson committed
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034
      ]
    [ :LNOT: Embedded_UI
        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
        MOV     R0, #124
        SWI     XOS_Byte                ; Clear the condition
        SWI     XOS_WriteI+12           ; Clear the screen
12
Neil Turton's avatar
Neil Turton committed
2035 2036 2037 2038
        SWI     XOS_WriteS
        =       10, "$SystemName ", 0   ; now RISC OS (no +) again
        ALIGN

Kevin Bracey's avatar
Kevin Bracey committed
2039 2040 2041 2042
        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
2043 2044 2045

        LDR     R0, =ZeroPage
        LDR     R0, [R0, #RAMLIMIT]
Kevin Bracey's avatar
Kevin Bracey committed
2046 2047 2048
        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
2049 2050 2051 2052 2053 2054 2055
        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
2056

2057
        BL      ARM_PrintProcessorType
Robert Sprowson's avatar
Robert Sprowson committed
2058 2059 2060
    |
        ! 0,    "Banner & printing of processor type disabled"
    ]
Neil Turton's avatar
Neil Turton committed
2061

Robert Sprowson's avatar
Robert Sprowson committed
2062
        MOV     r0, #0                  ; Set DomainId to 0 every reset
Jeffrey Lee's avatar
Jeffrey Lee committed
2063
      [ ZeroPage = 0
Neil Turton's avatar
Neil Turton committed
2064
        STR     r0, [r0, #DomainId]     ; before calling anyone
Jeffrey Lee's avatar
Jeffrey Lee committed
2065 2066 2067 2068
      |
        LDR     r1, =ZeroPage
        STR     r0, [r1, #DomainId]     ; before calling anyone
      ]
Neil Turton's avatar
Neil Turton committed
2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082

; 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

Neil Turton's avatar
Neil Turton committed
2083 2084
 [ SoftResets :LAND: STB
        ! 0, "!!!! SoftReset is true => resets close all open files !!!!"
Neil Turton's avatar
Neil Turton committed
2085 2086
        MOV     R0, #FSControl_Shut     ; Open files get closed at reset
        SWI     XOS_FSControl
Neil Turton's avatar
Neil Turton committed
2087
 ]
Neil Turton's avatar
Neil Turton committed
2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100

        BL      PostInit

        MOV     r0, #&FD                ; read last reset type (again!)
        MOV     r1, #0
        MOV     r2, #&FF
        SWI     XOS_Byte
        CMP     r1, #SoftReset          ; a softie?
        SWINE   XOS_WriteI+7            ; go beep! Yaay!

        CMP     r1, #PowerOnReset
        BNE     %FT75

2101
 [ HAL :LAND: CheckProtectionLink
Jeffrey Lee's avatar
Jeffrey Lee committed
2102
        LDR     r1, =ZeroPage+HAL_StartFlags
2103 2104 2105 2106
        LDR     r1, [r1]
        TST     r1, #OSStartFlag_NoCMOSReset
        BNE     %FT75
 |
2107
      [ CheckProtectionLink
Neil Turton's avatar
Neil Turton committed
2108 2109 2110 2111
        LDR     r1, =IOMD_MonitorType   ; check link bit again
        LDRB    r1, [r1]                ; no need to preload bus, since should
        TST     r1, #IOMD_ProtectionLinkBit ; be still there from earlier
        BEQ     %FT75                   ; zero => protected
2112
      ]
2113
 ]
Neil Turton's avatar
Neil Turton committed
2114 2115 2116 2117 2118 2119


; if any monitor key pressed, reconfigure, otherwise hang around for a bit
; till keys get a chance to come in again after being reset for the umpteenth
; time by yet another keyboard handler! SKS 07-Jun-88

Jeffrey Lee's avatar
Jeffrey Lee committed
2120
        LDR     r3, =ZeroPage
Neil Turton's avatar
Neil Turton committed
2121
        LDR     r3, [r3, #MetroGnome]
2122 2123 2124 2125
 [ EmulatorSupport
        ARM_on_emulator r0
        ADDEQ   r3, r3, #1
        ADDNE   r3, r3, #10             ; Hang about for a little while
Neil Turton's avatar
Neil Turton committed
2126
 |
Neil Turton's avatar
Neil Turton committed
2127
        ADD     r3, r3, #10             ; Hang about for a little while
Neil Turton's avatar
Neil Turton committed
2128
 ]
Neil Turton's avatar
Neil Turton committed
2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167

KeypadStar_key  * -92

HorologicalDelayLoop1
        MOV     r0, #&79                        ; scan keyboard
        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
        BEQ     %FT70                           ; then check if we've run out of time

        ADR     r2, MonitorKeypadTable
62
        LDRB    r14, [r2], #2                   ; search for key in table
        TEQ     r14, #&FF
        BEQ     %FT70
        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
2168
    [ DoInitialiseMode :LOR: :LNOT: Embedded_UI
Neil Turton's avatar
Neil Turton committed
2169
        BL      InitialiseMode
Neil Turton's avatar
Neil Turton committed
2170

Neil Turton's avatar
Neil Turton committed
2171 2172
      [ International
        SWI     XOS_WriteI+10
Robert Sprowson's avatar
Robert Sprowson committed
2173 2174 2175
        BVS     %FT65
        BL      WriteS_Translated
        =       "MonType:Monitor type reconfigured",10,13,10,0
Neil Turton's avatar
Neil Turton committed
2176
        ALIGN
Robert Sprowson's avatar
Robert Sprowson committed
2177
65
Neil Turton's avatar
Neil Turton committed
2178 2179
      |
        SWI     XOS_WriteS
Robert Sprowson's avatar
Robert Sprowson committed
2180
        =       10,"Monitor type reconfigured",10,13,10,0
Neil Turton's avatar
Neil Turton committed
2181 2182
        ALIGN
      ]
Neil Turton's avatar
Neil Turton committed
2183
    ]
Neil Turton's avatar
Neil Turton committed
2184 2185 2186 2187 2188 2189
        B       %FT75

BranchThroughZeroInstruction2
 [ ProcessorVectors
        LDR     PC, .+ProcVec_Branch0
 |
2190
        B       .+Branch0_Trampoline
Neil Turton's avatar
Neil Turton committed
2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205
 ]

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
2206 2207
        ALIGN 32

Robert Sprowson's avatar
Robert Sprowson committed
2208 2209 2210 2211 2212 2213
      [ International
MessageFileName DCB     "Resources:$.Resources.Kernel.Messages",0
        ALIGN
      ]

 [ StrongARM :LAND: :LNOT: HAL
Neil Turton's avatar
Neil Turton committed
2214 2215 2216 2217 2218 2219
cputable
        DCD &6000,0,0
        DCD &6100,1,0
        DCD &7000,2,0
        DCD &7100,3,0
        DCD &8100,4,2_11101
2220
        DCD &a100,5,2_11011 ;corrected for 3.71 (SA does not abort for vector reads in 26-bit mode)
2221 2222
        DCD &7500,6,0
        DCD &7501,7,0
Neil Turton's avatar
Neil Turton committed
2223 2224 2225
        DCD -1

Processor_Type
2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239
        MOV     r0,#IOMD_Base
        LDRB    r1,[r0,#IOMD_ID0]
        CMP     r1,#&E7
        LDRB    r1,[r0,#IOMD_ID1]
        CMPEQ   r1,#&D4
        BEQ     PT_RiscPC               ; E7,D4 means Risc PC
        CMP     r1,#&5B
        MOVEQ   r0,#&7500               ; 5B means 7500
        BEQ     PT_lookup
        CMP     r1,#&AA
        MOVEQ   r0,#&7500
        ORREQ   r0,r0,#&0001            ; AA means 7500FE - mark as 7501
        BEQ     PT_lookup
PT_RiscPC
Neil Turton's avatar
Neil Turton committed
2240 2241 2242 2243 2244
        ReadCop  R0,CR_ID               ; see data sheets for values
        ; ARM 600 funny
        TST     R0,#&f000
        MOVEQ   R0,R0, LSL #4
        AND     R0,R0,#&ff00
2245
PT_lookup
Neil Turton's avatar
Neil Turton committed
2246 2247 2248 2249 2250
        ADR     R1,cputable
66
        LDR     R2,[R1],#4
        TEQ     R2,#0
        MOVMI   R0,#0
2251
        STRMI   R2,[R0,#ProcessorType]
Neil Turton's avatar
Neil Turton committed
2252 2253 2254 2255 2256 2257 2258
        MOVMI   PC,LR
        TEQ     R2,R0
        ADDNE   R1,R1,#8
        BNE     %BT66
        LDMIA   R1,{R0,R2}
        MOV     R1,#0
        STRB    R0,[R1,#ProcessorType]
2259
        STR     R2,[R1,#ProcessorFlags]
Neil Turton's avatar
Neil Turton committed
2260 2261 2262
        MOV     PC,LR
 ]

Neil Turton's avatar
Neil Turton committed
2263
70
Jeffrey Lee's avatar
Jeffrey Lee committed
2264
        LDR     r14, =ZeroPage
Neil Turton's avatar
Neil Turton committed
2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
        LDR     r14, [r14, #MetroGnome]
        CMP     r14, r3
        BLO     HorologicalDelayLoop1
75


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

        Pull    "R0"                    ; first check kbd there

        CMP     R0, #0
        BEQ     AutoBootCosNoKbd

        MOV     R0, #&FF
        MOV     R1, #0
        MOV     R2, #&FF                ; read shifty state
        SWI     XOS_Byte
        AND     R0, R1, #8              ; picka da bit
        EOR     R0, R0, #8              ; invert sense
        Pull    "R1"
        CMP     R1, #0
        MOVNE   R1, #8
        EORS    R1, R1, R0
        BEQ     %FT80

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
; if either * pressed, drop into * prompt, otherwise hang around for a bit
; till keys get a chance to come in again after being reset for the umpteenth
; time by yet another keyboard handler! SKS 01-Jun-88

Jeffrey Lee's avatar
Jeffrey Lee committed
2312
        LDR     r3, =ZeroPage
Neil Turton's avatar
Neil Turton committed
2313
        LDR     r3, [r3, #MetroGnome]
2314 2315 2316 2317 2318
 [ EmulatorSupport
        ARM_on_emulator r1
        ADDEQ   r3, r3, #1
        ADDNE   r3, r3, #10             ; Hang about for a little while
 |
Neil Turton's avatar
Neil Turton committed
2319
        ADD     r3, r3, #10             ; Hang about for a little while
Neil Turton's avatar
Neil Turton committed
2320
 ]
Neil Turton's avatar
Neil Turton committed
2321 2322 2323 2324 2325 2326

HorologicalDelayLoop2
        MOV     r1, #KeypadStar_key :AND: &FF
        BL      IsKeyPressedAtReset
        BEQ     DoStartSuper            ; EQ -> start up supervisor

Jeffrey Lee's avatar
Jeffrey Lee committed
2327
        LDR     r0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360
        LDR     r0, [r0, #MetroGnome]
        CMP     r0, r3
        BLO     HorologicalDelayLoop2


; 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
        LDR     R2, [R3, #Module_Title]
        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


str_booterror   DCB     "Boot$Error",0
                ALIGN


AutoBootCosNoKbd
2361
    [ :LNOT: Embedded_UI
Neil Turton's avatar
Neil Turton committed
2362 2363
      [ International
        SWI     XOS_WriteI+7
Robert Sprowson's avatar
Robert Sprowson committed
2364 2365
        BVS     %FT81
        BL      WriteS_Translated
Neil Turton's avatar
Neil Turton committed
2366 2367
        =       "NoKbd:No keyboard present - autobooting", 10,13,0
        ALIGN
Robert Sprowson's avatar
Robert Sprowson committed
2368
81
Neil Turton's avatar
Neil Turton committed
2369 2370 2371 2372 2373
      |
        SWI     XOS_WriteS
        =       7, "No keyboard present - autobooting", 10,13,0
        ALIGN
      ]
Neil Turton's avatar
Neil Turton committed
2374
    ]
Neil Turton's avatar
Neil Turton committed
2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390
        B       Hortoculture_Kicking


RealIRQHandler
 [ ProcessorVectors
        LDR     PC, .-&18+ProcVec_IRQ
 |
        B     Initial_IRQ_Code+.-&18
 ]

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    r1 = INKEY -ve key code to look for

; Out   EQ: key pressed
;       NE: key not pressed

2391
IsKeyPressedAtReset Entry "r0-r2"
Neil Turton's avatar
Neil Turton committed
2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403

        MOV     r0, #129
        MOV     r2, #&FF
        SWI     XOS_Byte
        TEQ     r1, #&FF
        TEQEQ   r2, #&FF
        EXIT

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    [ AddTubeBashers
TubeDumpR0     ROUT
Kevin Bracey's avatar
Kevin Bracey committed
2404
        EntryS  "R1, R2"
Neil Turton's avatar
Neil Turton committed
2405 2406 2407 2408 2409 2410 2411 2412 2413
        ADR   lr, HexTable
        TubeChar r0, r1, "MOV r1, #"" """
        MOV    R1, #7
01      MOV    R0, R0, ROR #28
        AND    R2, R0, #&F
        TubeChar R0, R1, "LDRB R1, [lr, R2]"
        SUBS   R1, R1, #1
        BPL    %BT01
        TubeChar r0, r1, "MOV r1, #"" """
Kevin Bracey's avatar
Kevin Bracey committed
2414
        EXITS
Neil Turton's avatar
Neil Turton committed
2415 2416

TubeNewl
Kevin Bracey's avatar
Kevin Bracey committed
2417
        EntryS
Neil Turton's avatar
Neil Turton committed
2418 2419
        TubeChar R0, R1, "MOV R1, #10"
        TubeChar R0, R1, "MOV R1, #13"
Kevin Bracey's avatar
Kevin Bracey committed
2420
        EXITS
Neil Turton's avatar
Neil Turton committed
2421 2422 2423 2424 2425 2426 2427

HexTable = "0123456789ABCDEF"

    ]

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2428 2429
 [ HAL
LookForHALRTC
2430
        Push "R0-R2,R8,R12,R14"
Jeffrey Lee's avatar
Jeffrey Lee committed
2431
        LDR     R0, =ZeroPage
2432 2433
        LDR     R0, [R0, #RTCFitted]
        CMP     R0, #0
2434
        Pull "R0-R2,R8,R12,PC",NE ; We already have an RTC
2435 2436
        LDR     R0, =(0:SHL:16)+HALDeviceType_SysPeri+HALDeviceSysPeri_RTC
        MOV     R1, #0
2437
        MOV     R8, #OSHW_DeviceEnumerate
2438
01
2439
        SWI     XOS_Hardware
Ben Avison's avatar
Ben Avison committed
2440
        Pull "R0-R2,R8,R12,PC",VS
2441
        CMP     R1, #-1
Ben Avison's avatar
Ben Avison committed
2442
        Pull "R0-R2,R8,R12,PC",EQ
2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455
        LDR     R14, [R2, #HALDevice_Location]
        ; Currently, we only support devices located on IIC bus 0
        CMP     R14, #HALDeviceBus_Ser+HALDeviceSerBus_IIC
        BNE     %BT01
        ; Try activating
        Push "R0-R3"
        MOV     R0, R2
        MOV     LR, PC
        LDR     PC, [R2, #HALDevice_Activate]
        CMP     R0, #1
        Pull "R0-R3"
        BNE     %BT01
        DebugTX "HAL RTC detected!"
Jeffrey Lee's avatar
Jeffrey Lee committed
2456
        LDR     R0, =ZeroPage
2457 2458 2459 2460 2461 2462
        STR     R2, [R0, #RTCFitted]
        ; Read the time from the RTC into RealTime, and fixup YearCMOS if needed
        BYTEWS  WsPtr
        BL      CheckYear
        DebugTX "Leaving LookForHALRTC"
        Pull "R0-R2,R8,R12,PC"
2463 2464
 ]

Neil Turton's avatar
Neil Turton committed
2465
        END