home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / clib / progs / utilslib / s / Swi < prev    next >
Encoding:
Text File  |  1991-10-20  |  3.9 KB  |  118 lines

  1. ; Alternative SWI functions. These were posted to Usenet by Edward Nevill
  2. ; of Acorn. I have included the start of his posting below (the rest was
  3. ; the code, and a test routine).
  4.  
  5. ; As usual with code I've nicked and included here, any credit (and my
  6. ; thanks) goes to Edward, for the code and for publicly distributing it.
  7. ; I hope I've not introduced any bugs while including it with this library...
  8.  
  9. ; "How to use" documentation is in the C header file, "Swi.h".
  10.  
  11. ; Path: cix!slxsys!uknet!ukc!acorn!enevill
  12. ; From: enevill@acorn.co.uk (Edward Nevill)
  13. ; Newsgroups: comp.sys.acorn
  14. ; Subject: New SWI veneers
  15. ; Message-ID: <10187@acorn.co.uk>
  16. ; Date: 4 Oct 91 17:11:01 GMT
  17. ; Sender: enevill@acorn.co.uk
  18. ; Distribution: comp
  19. ; Organization: Acorn Computers Ltd, Cambridge, England
  20. ; Lines: 212
  21. ;
  22. ; Here is an optimised SWI veneer which can be used instead of _kernel_swi.
  23. ; It is significantly faster than _kernel_swi and is much easier to use
  24. ; (IMHO).
  25. ;
  26. ; Enjoy,
  27. ; Edward.
  28.  
  29. r0      RN      0
  30. r1      RN      1
  31. r2      RN      2
  32. r3      RN      3
  33. r4      RN      4
  34. r5      RN      5
  35. r6      RN      6
  36. r7      RN      7
  37. r8      RN      8
  38. r9      RN      9
  39. r10     RN      10
  40. r11     RN      11
  41. r12     RN      12
  42. sp      RN      13
  43. lr      RN      14
  44. pc      RN      15
  45.  
  46.  
  47.         AREA    |C$$code|, CODE, READONLY
  48.  
  49. SWIReturnInst
  50.         LDR     pc, [sp, #0*4]
  51.  
  52.         EXPORT  swix
  53. swix    ROUT
  54.         ORR     r0, r0, #&20000
  55.  
  56.         EXPORT  swi
  57. swi     ROUT
  58.  
  59. ; Construct a stack frame that looks something like this:
  60. ;       returnval
  61. ;       LDMIA   r12!, {r0..rn}
  62. ;       SWI     xxxxxx
  63. ;       LDR     pc, [sp]
  64. ;       saved r4-r11,lr
  65. ;       saved r1
  66. ;       saved input values (r2...rn)
  67.  
  68.         STMFD   sp!, {r1-r3}            ; Save r1 and put 1st two variadic args on stack
  69.         BIC     r2, r0, #&ff000000
  70.         ORR     r2, r2, #&ef000000      ; Construct SWI instruction
  71.         ADR     r0, SWIReturn
  72.         BIC     r1, r1, #&ff000000      ; Construct LDMIA R12!, {regs} instruction, if
  73.         BICS    r1, r1, #&00ff0000      ; {regs} = {} (IE no input regs) we must not
  74.         ORRNE   r1, r1, #&e8000000      ; use an LDMIA R12!, {} instruction as this is an
  75.         ORRNE   r1, r1, #&00bc0000      ; invalid instruction, we use a suitable NOP instead
  76.         MOVEQ   r1, #0                  ; 0 = opcode for ANDEQ r0, r0, r0 (a suitable NOP)
  77.         LDR     r3, SWIReturnInst
  78.         STMFD   sp!, {r0-r9,r11,lr}     ; Save regs and set up SWI call routine (in R0-R3)
  79.         ADD     r12, sp, #(12+1)*4      ; Point R12 at input regs on stack.
  80.         ADD     pc, sp, #4              ; Call routine on stack
  81. SWIReturn
  82.         LDR     lr, [sp, #(12+0)*4]     ; Fetch reg mask again
  83.         MOVS    lr, lr, ASL #1          ; Shift out setting C if R0 to be written, N
  84.         LDRCS   r11, [r12], #4          ; if R1 to be written.
  85.         STRCS   r0, [r11]
  86.         LDRMI   r11, [r12], #4
  87.         STRMI   r1, [r11]
  88.         MOVS    lr, lr, ASL #2          ; Shift 2 bits each time for the next 2 regs
  89.         LDRCS   r11, [r12], #4
  90.         STRCS   r2, [r11]
  91.         LDRMI   r11, [r12], #4
  92.         STRMI   r3, [r11]
  93.         MOVS    lr, lr, ASL #2
  94.         LDRCS   r11, [r12], #4
  95.         STRCS   r4, [r11]
  96.         LDRMI   r11, [r12], #4
  97.         STRMI   r5, [r11]
  98.         MOVS    lr, lr, ASL #2
  99.         LDRCS   r11, [r12], #4
  100.         STRCS   r6, [r11]
  101.         LDRMI   r11, [r12], #4
  102.         STRMI   r7, [r11]
  103.         MOVS    lr, lr, ASL #2
  104.         LDRCS   r11, [r12], #4
  105.         STRCS   r8, [r11]
  106.         LDRMI   r11, [r12], #4
  107.         STRMI   r9, [r11]
  108.         LDR     r1, [sp, #2*4]
  109.         TST     r1, #&20000             ; X-bit clear
  110.         CMPEQ   pc, #&80000000          ; SET V flag if so, so R0 not cleared
  111.         MOVVC   r0, #0                  ; Clear R0 if no error (or X-bit clear)
  112.         ADD     sp, sp, #4*4            ; Drop SWI call routine
  113.         LDMIA   sp!, {r4-r9,r11,lr}
  114.         ADD     sp, sp, #3*4            ; Drop saved R1 and 1st two variadic args.
  115.         MOVS    pc, lr
  116.  
  117.         END
  118.