SWINaming 21.2 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 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
; 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.
;
        TTL     => SWINaming

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

        MACRO
$l      AddSwiNameToDecodeTab   $name
$l      = "$name", 0
SwisInSystemTable SETA SwisInSystemTable+1
        MEND

;***********************************************************************
;
;       SWI OS_SWINumberToString
;
; in:   R0 = SWI number
;       R1 = buffer pointer
;       R2 = buffer length
;
; out:  Buffer holds SWI name, null-terminated
;

SWINumberToString_Code    ROUT
Kevin Bracey's avatar
Kevin Bracey committed
37
        WritePSRc SVC_mode, r12         ; interrupts on!
Neil Turton's avatar
Neil Turton committed
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
        MOV     r12, lr                 ; keep here so subroutines can update flags
        Push    "r3, r9"
        MOV     r9, r0                  ; r0 to pass back
        MOV     r3, r2                  ; buffer limit
        MOV     r2, #0                  ; characters so far

        TST     r0, #Auto_Error_SWI_bit
        MOVNE   r10, #"X"
        BLNE    AddChar
        BIC     r0, r0, #Auto_Error_SWI_bit
        CMP     r0, #512
        BCS     NotASystemSWI           ; TMD 11-May-89: changed from GE

        ADR     r11, OS_Prefix
        BL      AddString
        MOV     r10, #"_"
        BL      AddChar

        CMP     r0, #256
        BCS     Swi_Is_WriteI           ; TMD 11-May-89: changed from GE
58
        CMP     r0, #NCORESWIS
Neil Turton's avatar
Neil Turton committed
59 60 61 62 63 64 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 97 98 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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
        BCS     SWINotInTable           ; TMD 11-May-89: changed from GE

        ADR     r11, System_Swi_Names
        BL      GetStringFromTable

AddStringAndExit
        BL      AddString

ExitSwiSwi
        MOV     r10, #0
        BL      AddChar

        MOV     r0, r9                  ; error pointer or restoration
        Pull    "r3, r9"
        MOV     lr, r12
        ExitSWIHandler

                  GBLA SwisInSystemTable
SwisInSystemTable SETA -1

OS_Prefix =    "OS",0

System_Swi_Names
        AddSwiNameToDecodeTab WriteC
        AddSwiNameToDecodeTab WriteS
        AddSwiNameToDecodeTab Write0
        AddSwiNameToDecodeTab NewLine
        AddSwiNameToDecodeTab ReadC
        AddSwiNameToDecodeTab CLI
        AddSwiNameToDecodeTab Byte
        AddSwiNameToDecodeTab Word
        AddSwiNameToDecodeTab File
        AddSwiNameToDecodeTab Args
        AddSwiNameToDecodeTab BGet
        AddSwiNameToDecodeTab BPut
        AddSwiNameToDecodeTab GBPB
        AddSwiNameToDecodeTab Find
        AddSwiNameToDecodeTab ReadLine
        AddSwiNameToDecodeTab Control
        AddSwiNameToDecodeTab GetEnv
        AddSwiNameToDecodeTab Exit
        AddSwiNameToDecodeTab SetEnv
        AddSwiNameToDecodeTab IntOn
        AddSwiNameToDecodeTab IntOff
        AddSwiNameToDecodeTab CallBack
        AddSwiNameToDecodeTab EnterOS
        AddSwiNameToDecodeTab BreakPt
        AddSwiNameToDecodeTab BreakCtrl
        AddSwiNameToDecodeTab UnusedSWI
        AddSwiNameToDecodeTab UpdateMEMC
        AddSwiNameToDecodeTab SetCallBack
        AddSwiNameToDecodeTab Mouse

        AddSwiNameToDecodeTab Heap
        AddSwiNameToDecodeTab Module
        AddSwiNameToDecodeTab Claim
        AddSwiNameToDecodeTab Release
        AddSwiNameToDecodeTab ReadUnsigned
        AddSwiNameToDecodeTab GenerateEvent
        AddSwiNameToDecodeTab ReadVarVal
        AddSwiNameToDecodeTab SetVarVal
        AddSwiNameToDecodeTab GSInit
        AddSwiNameToDecodeTab GSRead
        AddSwiNameToDecodeTab GSTrans
        AddSwiNameToDecodeTab BinaryToDecimal
        AddSwiNameToDecodeTab FSControl
        AddSwiNameToDecodeTab ChangeDynamicArea
        AddSwiNameToDecodeTab GenerateError
        AddSwiNameToDecodeTab ReadEscapeState
        AddSwiNameToDecodeTab EvaluateExpression
        AddSwiNameToDecodeTab SpriteOp
        AddSwiNameToDecodeTab ReadPalette
        AddSwiNameToDecodeTab ServiceCall
        AddSwiNameToDecodeTab ReadVduVariables
        AddSwiNameToDecodeTab ReadPoint
        AddSwiNameToDecodeTab UpCall
        AddSwiNameToDecodeTab CallAVector
        AddSwiNameToDecodeTab ReadModeVariable
        AddSwiNameToDecodeTab RemoveCursors
        AddSwiNameToDecodeTab RestoreCursors
        AddSwiNameToDecodeTab SWINumberToString
        AddSwiNameToDecodeTab SWINumberFromString
        AddSwiNameToDecodeTab ValidateAddress
        AddSwiNameToDecodeTab CallAfter
        AddSwiNameToDecodeTab CallEvery
        AddSwiNameToDecodeTab RemoveTickerEvent
        AddSwiNameToDecodeTab InstallKeyHandler
        AddSwiNameToDecodeTab CheckModeValid
        AddSwiNameToDecodeTab ChangeEnvironment
        AddSwiNameToDecodeTab ClaimScreenMemory
        AddSwiNameToDecodeTab ReadMonotonicTime
        AddSwiNameToDecodeTab SubstituteArgs
        AddSwiNameToDecodeTab PrettyPrint
        AddSwiNameToDecodeTab Plot
        AddSwiNameToDecodeTab WriteN
        AddSwiNameToDecodeTab AddToVector
        AddSwiNameToDecodeTab WriteEnv
        AddSwiNameToDecodeTab ReadArgs
        AddSwiNameToDecodeTab ReadRAMFsLimits
        AddSwiNameToDecodeTab ClaimDeviceVector
        AddSwiNameToDecodeTab ReleaseDeviceVector
        AddSwiNameToDecodeTab DelinkApplication
        AddSwiNameToDecodeTab RelinkApplication
        AddSwiNameToDecodeTab HeapSort
        AddSwiNameToDecodeTab ExitAndDie
        AddSwiNameToDecodeTab ReadMemMapInfo
        AddSwiNameToDecodeTab ReadMemMapEntries
        AddSwiNameToDecodeTab SetMemMapEntries
        AddSwiNameToDecodeTab AddCallBack
        AddSwiNameToDecodeTab ReadDefaultHandler
        AddSwiNameToDecodeTab SetECFOrigin
        AddSwiNameToDecodeTab SerialOp
        AddSwiNameToDecodeTab ReadSysInfo
        AddSwiNameToDecodeTab Confirm
        AddSwiNameToDecodeTab ChangedBox
        AddSwiNameToDecodeTab CRC
        AddSwiNameToDecodeTab ReadDynamicArea
        AddSwiNameToDecodeTab PrintChar
        AddSwiNameToDecodeTab ChangeRedirection
        AddSwiNameToDecodeTab RemoveCallBack
        AddSwiNameToDecodeTab FindMemMapEntries
        AddSwiNameToDecodeTab SetColour
        AddSwiNameToDecodeTab ClaimSWI          ; These two are not actually
        AddSwiNameToDecodeTab ReleaseSWI        ; kernel SWIs.
        AddSwiNameToDecodeTab Pointer
        AddSwiNameToDecodeTab ScreenMode
        AddSwiNameToDecodeTab DynamicArea
        AddSwiNameToDecodeTab AbortTrap
        AddSwiNameToDecodeTab Memory
        AddSwiNameToDecodeTab ClaimProcessorVector
        AddSwiNameToDecodeTab Reset
        AddSwiNameToDecodeTab MMUControl
Neil Turton's avatar
Neil Turton committed
191 192 193 194 195 196
        AddSwiNameToDecodeTab ResyncTime
        AddSwiNameToDecodeTab PlatformFeatures
        AddSwiNameToDecodeTab SynchroniseCodeAreas
        AddSwiNameToDecodeTab CallASWI
        AddSwiNameToDecodeTab AMBControl
        AddSwiNameToDecodeTab CallASWIR12
197 198 199 200
        AddSwiNameToDecodeTab SpecialControl
        AddSwiNameToDecodeTab EnterUSR32
        AddSwiNameToDecodeTab EnterUSR26
        AddSwiNameToDecodeTab VIDCDivider
Kevin Bracey's avatar
Kevin Bracey committed
201
        AddSwiNameToDecodeTab NVMemory
Kevin Bracey's avatar
Kevin Bracey committed
202 203 204 205
        AddSwiNameToDecodeTab ClaimOSSWI
        AddSwiNameToDecodeTab TaskControl
        AddSwiNameToDecodeTab DeviceDriver
        AddSwiNameToDecodeTab Hardware
206
        AddSwiNameToDecodeTab IICOp
Kevin Bracey's avatar
Kevin Bracey committed
207 208 209 210
        AddSwiNameToDecodeTab LeaveOS
        AddSwiNameToDecodeTab ReadLine32
        AddSwiNameToDecodeTab SubstituteArgs32
        AddSwiNameToDecodeTab HeapSort32
Neil Turton's avatar
Neil Turton committed
211 212
        = 0

213
 [ SwisInSystemTable+1 <> NCORESWIS
Neil Turton's avatar
Neil Turton committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
 ! 1, :CHR:10:CC::CHR:13:CC::CHR:7:CC::CHR:7:CC:"Swi Disassembly table not consistent with despatch table":CC::CHR:10:CC::CHR:13
 ]

convswitab = "OS",0

Conversion_Swi_Names
        AddSwiNameToDecodeTab  ConvertHex1
        AddSwiNameToDecodeTab  ConvertHex2
        AddSwiNameToDecodeTab  ConvertHex4
        AddSwiNameToDecodeTab  ConvertHex6
        AddSwiNameToDecodeTab  ConvertHex8
        AddSwiNameToDecodeTab  ConvertCardinal1
        AddSwiNameToDecodeTab  ConvertCardinal2
        AddSwiNameToDecodeTab  ConvertCardinal3
        AddSwiNameToDecodeTab  ConvertCardinal4
        AddSwiNameToDecodeTab  ConvertInteger1
        AddSwiNameToDecodeTab  ConvertInteger2
        AddSwiNameToDecodeTab  ConvertInteger3
        AddSwiNameToDecodeTab  ConvertInteger4
        AddSwiNameToDecodeTab  ConvertBinary1
        AddSwiNameToDecodeTab  ConvertBinary2
        AddSwiNameToDecodeTab  ConvertBinary3
        AddSwiNameToDecodeTab  ConvertBinary4
        AddSwiNameToDecodeTab  ConvertSpacedCardinal1
        AddSwiNameToDecodeTab  ConvertSpacedCardinal2
        AddSwiNameToDecodeTab  ConvertSpacedCardinal3
        AddSwiNameToDecodeTab  ConvertSpacedCardinal4
        AddSwiNameToDecodeTab  ConvertSpacedInteger1
        AddSwiNameToDecodeTab  ConvertSpacedInteger2
        AddSwiNameToDecodeTab  ConvertSpacedInteger3
        AddSwiNameToDecodeTab  ConvertSpacedInteger4
        AddSwiNameToDecodeTab  ConvertFixedNetStation
        AddSwiNameToDecodeTab  ConvertNetStation
        AddSwiNameToDecodeTab  ConvertFixedFileSize
        AddSwiNameToDecodeTab  ConvertFileSize
Robert Sprowson's avatar
Robert Sprowson committed
249
        AddSwiNameToDecodeTab  ConvertVariform
Neil Turton's avatar
Neil Turton committed
250 251 252 253 254 255
        =  0
        ALIGN


SWINotInTable
        SUB     r11, r0, #OS_ConvertHex1
Robert Sprowson's avatar
Robert Sprowson committed
256
        CMP     r11, #OS_ConvertVariform - OS_ConvertHex1
Neil Turton's avatar
Neil Turton committed
257 258 259 260 261 262 263 264 265 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
        BHI     %FT10

        MOV     r0, r11
        addr    r11, Conversion_Swi_Names
        BL      GetStringFromTable
        B       AddStringAndExit

10
        ADR     r11, %FT01
        CMP     r0, #OS_ConvertStandardDateAndTime
        ADREQ   r11, %FT05
        CMP     r0, #OS_ConvertDateAndTime
        ADREQ   r11, %FT06
        B       AddStringAndExit
01
        =       "Undefined", 0

othersysswitab
        =       "OS", 0
05
        =       "ConvertStandardDateAndTime", 0
06
        =       "ConvertDateAndTime", 0
        =       0

02
        =       "User", 0

andfiddleaboutwithWriteI
        =       "OS", 0
        =       "WriteI", 0
        =       0
03
        =       "WriteI+", 0

        ALIGN

NotASystemSWI
        Push    "r9, r12"
        BIC     r10, r0, #Module_SWIChunkSize-1
        ModSWIHashvalOffset r9, r10
Jeffrey Lee's avatar
Jeffrey Lee committed
298
      [ ZeroPage = 0
Neil Turton's avatar
Neil Turton committed
299
        LDR     r9, [r9, #ModuleSWI_HashTab]
Jeffrey Lee's avatar
Jeffrey Lee committed
300 301 302 303
      |
        LDR     r12, =ZeroPage+ModuleSWI_HashTab
        LDR     r9, [r9, r12]
      ]
Neil Turton's avatar
Neil Turton committed
304 305 306 307 308 309 310 311 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 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
lohc
        CMP     r9, #0
        BEQ     giveemaboringname
        LDR     r12, [r9, #ModSWINode_Number]
        CMP     r10, r12
        LDRNE   r9, [r9, #ModSWINode_Link]
        BNE     lohc

        LDR     r12, [r9, #ModSWINode_MListNode]
        LDR     r9, [r12, #Module_code_pointer]
        LDR     r10, [r9, #Module_NameTable]
        LDR     r14, [r9, #-4]                          ; get module size
        CMP     r10, #1                                 ; must be non-zero
        CMPCS   r14, r10                                ; and must be within code
        BLS     trymodule_SWIdecode_code
        ADD     r11, r10, r9
        Pull    "r9, r12"
        BL      AddString
        MOV     r10, #"_"
        BL      AddChar
        AND     r0, r0, #Module_SWIChunkSize-1
        Push    "r0"
        BL      GetStringFromTable
        Pull    "r0"
        BVC     AddStringAndExit
        B       AddNumericBit                           ; not in table

trymodule_SWIdecode_code
        LDR     r10, [r9, #Module_NameCode]
        TST     r10, #12,2                              ; test bottom 2 bits and clear carry
        CMPEQ   r10, #1                                 ; must be non-zero
        CMPCS   r14, r10                                ; and must be within code
        BLS     usethemoduletitle

; got r0 is SWI number, r1 buffer pointer, r2 is buffer offset to use
; r3 is buffer limit
        CMP     r2, r3
        BGE     dont_confuse_the_poor_dears
        Push    "r4-r6"
        AND     r0, r0, #Module_SWIChunkSize - 1
        LDR     r12, [r12, #Module_incarnation_list]
        ADDS    r12, r12, #Incarnation_Workspace        ; force V clear
        MOV     lr, pc
        ADD     pc, r9, r10
        Pull    "r4-r6, r9, r12"
        BVC     ExitSwiSwi

dont_confuse_the_poor_dears
      [ International
        Push    "r0"
        ADRL    r0, BufferOFloError
        BL      TranslateError
        MOV     r9,r0
        Pull    "r0"
      |
        ADRL    r9, BufferOFloError
      ]
        ORR     r12, r12, #V_bit
        B       ExitSwiSwi

usethemoduletitle
Robert Sprowson's avatar
Robert Sprowson committed
365
        LDR     r10, [r9, #Module_TitleStr]
Neil Turton's avatar
Neil Turton committed
366 367 368 369 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 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
        ADD     r11, r10, r9
        Pull    "r9, r12"
        BL      AddString
        MOV     r10, #"_"
        BL      AddChar
        AND     r0, r0, #Module_SWIChunkSize-1
        B       AddNumericBit

giveemaboringname                       ; not found anywhere interesting
        Pull    "r9, r12"
        ADR     r11, %BT02
        B       AddStringAndExit

Swi_Is_WriteI
        ADR     r11, %BT03
        BL      AddString

        AND     r0, r0, #255
        CMP     r0, #32
        BLT     AddNumericBit
        CMP     r0, #127
        BCS     AddNumericBit
        MOV     r10, #""""
        BL      AddChar
        MOV     r10, r0
        BL      AddChar
        MOV     r10, #""""
        BL      AddChar
        B       ExitSwiSwi

AddNumericBit
        Push    "r1, r2"
        ADD     r1, r1, r2              ; point at remaining buffer
        SUB     r2, r3, r2              ; buffer left
        SWI     XOS_BinaryToDecimal
        ORRVS   r12, r12, #V_bit
        MOVVS   r9, r0
        MOV     r0, r2
        Pull    "r1, r2"
        ADD     r2, r2, r0              ; adjust chars given
        B       ExitSwiSwi

; AddChar
;
; in:   R1 = buffer pointer
;       R2 = buffer position
;       R3 = buffer size
;       R10 = character
;
; out:  If overflow, V_bit set in R12, and R9 -> error
;       PSR preserved

AddChar ROUT
Kevin Bracey's avatar
Kevin Bracey committed
419
        EntryS
Neil Turton's avatar
Neil Turton committed
420 421 422 423
        CMP     r2, r3
        BGE     %FT01
        STRB    r10, [r1, r2]
        ADD     r2, r2, #1
Kevin Bracey's avatar
Kevin Bracey committed
424
        EXITS
Neil Turton's avatar
Neil Turton committed
425 426 427 428 429 430 431 432 433 434 435

01
      [ International
        Push    "r0,lr"
        ADRL    r0, BufferOFloError
        BL      TranslateError
        MOV     r9,r0
        Pull    "r0,lr"
      |
        ADRL    r9, BufferOFloError
      ]
Kevin Bracey's avatar
Kevin Bracey committed
436
        EXITVS
Neil Turton's avatar
Neil Turton committed
437 438 439 440 441 442 443

; AddString
;
; in:   R11 points at string to add
;
; out:  R10, R11 corrupted

444
AddString Entry
Neil Turton's avatar
Neil Turton committed
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
01
        LDRB    r10, [r11], #1
        CMP     r10, #0
        BLNE    AddChar
        BNE     %BT01
        EXIT

; GetStringFromTable
;
; in:   R0 is table offset
;       R11 points at first SWI name in table
;
; out:  R11 -> string or V set if not in table
;       R0, R10 corrupted

GetStringFromTable ROUT
        LDRB    r10, [r11]
        CMP     r10, #0
Kevin Bracey's avatar
Kevin Bracey committed
463
        BEQ     %FT02                   ; end of table
Neil Turton's avatar
Neil Turton committed
464
        SUBS    r0, r0, #1
Kevin Bracey's avatar
Kevin Bracey committed
465 466 467
        BPL     %FT01
        CLRV
        MOV     pc, lr
Neil Turton's avatar
Neil Turton committed
468 469 470 471 472
01
        LDRB    r10, [r11], #1
        CMP     r10, #0
        BNE     %BT01
        B       GetStringFromTable
Kevin Bracey's avatar
Kevin Bracey committed
473 474 475
02
        SETV
        MOV     pc, lr
Neil Turton's avatar
Neil Turton committed
476 477 478 479 480 481

;***********************************************************************

; R1 pointer to name terminated by char <= " "
; return R0 as SWI number

482
SWINumberFromString_Code Entry "r1,r2"
Neil Turton's avatar
Neil Turton committed
483

Kevin Bracey's avatar
Kevin Bracey committed
484
        WritePSRc SVC_mode, r10                 ; enable interrupts
Neil Turton's avatar
Neil Turton committed
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
        LDRB    R10, [R1]
        CMP     R10, #"X"
        MOVEQ   R0, #Auto_Error_SWI_bit
        ADDEQ   R1, R1, #1
        MOVNE   R0, #0

        MOV     r10, #0                         ; indicate doing OS SWIs, so disallow OS_<number>
        ADRL    r11, OS_Prefix                  ; point at system table
        BL      LookForSwiName
        BVC     GotTheSWIName

        BIC     r0, r0, #255
        ADRL    r11, othersysswitab
        BL      LookForSwiName
        ORRVC   r0, r0, #OS_ConvertStandardDateAndTime
        BVC     GotTheSWIName

        BIC     r0, r0, #255
        ADRL    r11, convswitab
        BL      LookForSwiName
        ADDVC   r0, r0, #OS_ConvertHex1
        BVC     GotTheSWIName

        BIC     r0, r0, #255
        ADRL    r11, andfiddleaboutwithWriteI
        BL      LookForSwiName
        ORRVC   r0, r0, #OS_WriteI
        BVC     GotTheSWIName

Jeffrey Lee's avatar
Jeffrey Lee committed
514
        LDR     r12, =ZeroPage+Module_List
Neil Turton's avatar
Neil Turton committed
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
10
        LDR     r12, [r12]
        CMP     r12, #0
        BEQ     this_swi_nexiste_pas
        LDR     r10, [r12, #Module_code_pointer]
        LDR     r11, [r10, #Module_SWIChunk]            ; first validate swi chunk
        BICS    r11, r11, #Auto_Error_SWI_bit
        BEQ     %BT10                                   ; SWI chunk zero not allowed
        TST     r11, #Module_SWIChunkSize-1
        TSTEQ   r11, #&FF000000
        BNE     %BT10                                   ; invalid SWI chunk

        LDR     r2, [r10, #-4]
        LDR     r11, [r10, #Module_SWIEntry]
        TST     r11, #12,2                              ; test bottom 2 bits and clear carry
        CMPEQ   r11, #1                                 ; must be non-zero
        CMPCS   r2, r11                                 ; and must be within code
        BLS     %BT10

        LDR     r11, [r10, #Module_NameTable]
        CMP     r11, #1                                 ; must be non-zero
        CMPCS   r2, r11                                 ; and must be within code
        BLS     %FT20                                   ; if no name table, try name code

        ADD     r11, r10, r11
        BIC     r0, r0, #Module_SWIChunkSize-1
        BL      LookForSwiName
        BVS     %FT20
gotmodulejobbie
        LDR     r11, [r10, #Module_SWIChunk]
        BIC     r11, r11, #Auto_Error_SWI_bit
        ORR     r0, r0, r11
        B       GotTheSWIName

; call module code if it exists

20
        LDR     r11, [r10, #Module_NameCode]
        TST     r11, #12,2                              ; test bottom 2 bits and clear carry
        CMPEQ   r11, #1                                 ; must be non-zero
        CMPCS   r2, r11                                 ; and must be within code
        BLS     %FT30                                   ; try <module-title>_<numeric>

; got R1 string pointer

        Push    "r0-r6, r12"
        MOV     r0, #-1                                 ; indicate string being given
        LDR     r12, [r12, #Module_incarnation_list]
        ADDS    r12, r12, #Incarnation_Workspace        ; force V clear
        MOV     lr, pc
        ADD     pc, r11, r10
        ADDS    r2, r0, #0                              ; NB clears V for SWI return
        Pull    "r0"
        ADDPL   r0, r0, r2
        Pull    "r1-r6, r12"
        BPL     gotmodulejobbie

; check against module title

30
Robert Sprowson's avatar
Robert Sprowson committed
575
        LDR     r11, [r10, #Module_TitleStr]
Neil Turton's avatar
Neil Turton committed
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
        ADD     r11, r10, r11
        Push    r10
        MOV     r10, #1                                 ; indicate only check for prefix_numeric
        BL      LookForSwiName
        Pull    r10
        BVS     %BT10
        B       gotmodulejobbie

this_swi_nexiste_pas
        SETV
GotTheSWIName
        PullEnv
        ADRVS   r0, ErrorBlock_NoSuchSWI2
      [ International
        Push    "lr",VS
        BLVS    TranslateError
        Pull    "lr",VS
      ]
        B       SLVK_TestV

        MakeErrorBlock NoSuchSWI2


LookForSwiName ROUT
; R11 points at name table
; R1 points at name
; R10 = 0 => allow only prefix_name (for OS_SWI)
; R10 = 1 => allow only prefix_numeric (for checking moduletitle_numeric)
;       otherwise => allow prefix_name or prefix_numeric
; return R0 ORed with number if found
; V set if not

Kevin Bracey's avatar
Kevin Bracey committed
608
        Entry   "r8,r9, r12"
Neil Turton's avatar
Neil Turton committed
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
        MOV     r12, #0                                 ; offset in name

; first check that prefix matches
10
        LDRB    r14, [r1, r12]
        CMP     r14, #" "                               ; if we terminate before we get an "_", then fail
        BLE     %FT50
        ADD     r12, r12, #1
        LDRB    r9, [r11], #1
        CMP     r9, r14
        BEQ     %BT10

        CMP     r14, #"_"                               ; check correct terminators
        CMPEQ   r9,  #0
        BNE     %FT50

; prefix OK: scan table for rest of name

        TEQ     r10, #1                                 ; if doing modulename_numeric
        BEQ     CheckForNumericPostFix                  ; don't look for any names
        MOV     r8, r12                                 ; keep pointer to after prefix
20
        LDRB    r14, [r11], #1
        CMP     r14, #0
        BEQ     CheckForNumericPostFix
30
        LDRB    r9, [r1, r12]
        ADD     r12, r12, #1
        CMP     r14, #0
        CMPEQ   r9, #" "
Kevin Bracey's avatar
Kevin Bracey committed
639 640 641
        BGT     %FT35
        CLRV
        EXIT
Neil Turton's avatar
Neil Turton committed
642

Kevin Bracey's avatar
Kevin Bracey committed
643
35
Neil Turton's avatar
Neil Turton committed
644 645 646 647 648 649 650 651 652 653 654 655
        CMP     r9, r14
        LDREQB  r14, [r11], #1
        BEQ     %BT30

        MOV     r12, r8                                 ; restore name pointer
        ADD     r0, r0, #1                              ; step SWI number
40
        CMP     r14, #0                                 ; find end of failed name
        LDRNEB  r14, [r11], #1
        BNE     %BT40
        B       %BT20
50
Kevin Bracey's avatar
Kevin Bracey committed
656 657
        SETV
        EXIT
Neil Turton's avatar
Neil Turton committed
658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673

CheckForNumericPostFix
; [R1, R12] points at postfix
        Push    "r0-r2"
        ADD     r1, r1, r12
        CMP     r10, #0                                 ; if OS SWI then EQ,VC else NE,VC
        SETV    EQ                                      ; if OS SWI then VS else VC
        MOVVC   r0, #10 + (1 :SHL: 29)
        MOVVC   r2, #Module_SWIChunkSize -1
        SWIVC   XOS_ReadUnsigned
        Pull    "r0"
        BIC     r0, r0, #Module_SWIChunkSize -1
        ADDVC   r0, r0, r2
        Pull    "r1, r2, r8,r9, r12, pc"

        END