home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / utilities / utilst / virtual / !Virtual / s / swiv < prev    next >
Text File  |  1992-05-31  |  3KB  |  95 lines

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