home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / riscbsd / datafile / _btriscbsd / booter / s / swiv < prev   
Encoding:
Text File  |  1994-09-30  |  2.9 KB  |  78 lines

  1.     GET    h.asmregs
  2.  
  3.     AREA    |C$$code|, CODE, READONLY
  4.  
  5. SWIReturnInst   LDR     pc, [sp, #0*4]
  6.  
  7.         EXPORT  swix
  8. swix    ROUT
  9.         ORR     r0, r0, #&20000
  10.  
  11.         EXPORT  swi
  12. swi     ROUT
  13.  
  14. ; Construct a stack frame that looks something like this:
  15. ;       returnval
  16. ;       LDMIA   r12!, {r0..rn}
  17. ;       SWI     xxxxxx
  18. ;       LDR     pc, [sp]
  19. ;       saved r4-r11,lr
  20. ;       saved r1
  21. ;       saved input values (r2...rn)
  22.  
  23.         STMFD   sp!, {r1-r3}            ; Save r1 and put 1st two variadic args on stack
  24.         BIC     r2, r0, #&ff000000
  25.         ORR     r2, r2, #&ef000000      ; Construct SWI instruction
  26.         ADR     r0, SWIReturn
  27.         TST     r1, #&200000            ; bit for write flags
  28.         ADRNE   r0, SWIReturnFlags
  29.         BIC     r1, r1, #&ff000000      ; Construct LDMIA R12!, {regs} instruction, if
  30.         BICS    r1, r1, #&00ff0000      ; {regs} = {} (IE no input regs) we must not
  31.         ORRNE   r1, r1, #&e8000000      ; use an LDMIA R12!, {} instruction as this is an
  32.         ORRNE   r1, r1, #&00bC0000      ; invalid instruction, we use a suitable NOP instead
  33.         MOVEQ   r1, #0                  ; 0 = opcode for ANDEQ r0, r0, r0 (a suitable NOP)
  34.         LDR     r3, SWIReturnInst
  35.         STMFD   sp!, {r0-r9,r11,lr}     ; Save regs and set up SWI call routine (in R0-R3)
  36.         ADD     r12, sp, #(12+1)*4      ; Point R12 at input regs on stack.
  37.         ADD     pc, sp, #4              ; Call routine on stack
  38. SWIReturnFlags
  39.         LDR     r11, [r12], #4
  40.         STR     pc, [r11]               ; write flags
  41. SWIReturn
  42.         LDR     lr, [sp, #(12+0)*4]     ; Fetch reg mask again
  43.         MOVS    lr, lr, ASL #1          ; Shift out setting C if R0 to be written, N
  44.         LDRCS   r11, [r12], #4          ; if R1 to be written.
  45.         STRCS   r0, [r11]
  46.         LDRMI   r11, [r12], #4
  47.         STRMI   r1, [r11]
  48.         MOVS    lr, lr, ASL #2          ; Shift 2 bits each time for the next 2 regs
  49.         LDRCS   r11, [r12], #4
  50.         STRCS   r2, [r11]
  51.         LDRMI   r11, [r12], #4
  52.         STRMI   r3, [r11]
  53.         MOVS    lr, lr, ASL #2
  54.         LDRCS   r11, [r12], #4
  55.         STRCS   r4, [r11]
  56.         LDRMI   r11, [r12], #4
  57.         STRMI   r5, [r11]
  58.         MOVS    lr, lr, ASL #2
  59.         LDRCS   r11, [r12], #4
  60.         STRCS   r6, [r11]
  61.         LDRMI   r11, [r12], #4
  62.         STRMI   r7, [r11]
  63.         MOVS    lr, lr, ASL #2
  64.         LDRCS   r11, [r12], #4
  65.         STRCS   r8, [r11]
  66.         LDRMI   r11, [r12], #4
  67.         STRMI   r9, [r11]
  68.         LDR     r1, [sp, #2*4]
  69.         TST     r1, #&20000             ; X-bit clear
  70.         CMPEQ   pc, #&80000000          ; SET V flag if so, so R0 not cleared
  71.         MOVVC   r0, #0                  ; Clear R0 if no error (or X-bit clear)
  72.         ADD     sp, sp, #4*4            ; Drop SWI call routine
  73.         LDMIA   sp!, {r4-r9,r11,lr}
  74.         ADD     sp, sp, #3*4            ; Drop saved R1 and 1st two variadic args.
  75.         MOVS    pc, lr
  76.  
  77.         END
  78.