_kernel_format_rom_calls.s 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. .xdef __handle_rom_calls_AND___kernel_format_rom_calls_AND___nostub,__ld_insert_kernel_rom_calls
  2. | This file requires cleanup code.
  3. .xdef __ref_all___complex_main
  4. | This file requires the jump table in %a5.
  5. .xdef __ref_all___optimize_rom_calls
  6. .section _st90
  7. __kernel_format_rom_calls:
  8. | Relocate the program.
  9. lea.l __ld_insert_kernel_rom_calls(%pc),%a0
  10. lea.l __ld_entry_point(%pc),%a1
  11. moveq.l #0,%d2
  12. move.w (%a0)+,%d0
  13. __kernel_format_rom_calls_loop_1:
  14. move.w (%a0)+,%d1
  15. lsl.w #2,%d1
  16. move.l (%a5,%d1.w),%d1
  17. __kernel_format_rom_calls_loop_2:
  18. move.w (%a0)+,%d2
  19. beq.s __kernel_format_rom_calls_done_2
  20. add.l %d1,(%a1,%d2.l)
  21. bra.s __kernel_format_rom_calls_loop_2
  22. __kernel_format_rom_calls_done_2:
  23. dbra %d0,__kernel_format_rom_calls_loop_1
  24. .section _st1070
  25. __kernel_format_rom_calls_cleanup:
  26. | Unrelocate the program.
  27. lea.l __ld_insert_kernel_rom_calls(%pc),%a0
  28. lea.l __ld_entry_point(%pc),%a1
  29. moveq.l #0,%d2
  30. move.w (%a0)+,%d0
  31. __kernel_format_rom_calls_loop_3:
  32. move.w (%a0)+,%d1
  33. lsl.w #2,%d1
  34. move.l (%a5,%d1.w),%d1
  35. __kernel_format_rom_calls_loop_4:
  36. move.w (%a0)+,%d2
  37. beq.s __kernel_format_rom_calls_done_4
  38. sub.l %d1,(%a1,%d2.l)
  39. bra.s __kernel_format_rom_calls_loop_4
  40. __kernel_format_rom_calls_done_4:
  41. dbra %d0,__kernel_format_rom_calls_loop_3
  42. .section _st10000, "d"
  43. __ld_insert_kernel_rom_calls:
  44. | The format for the ROM call table is as follows:
  45. | 2 bytes: ROM call count - 1
  46. | For each ROM call used...
  47. | 2 bytes: ROM call number
  48. | For each reloc...
  49. | 2 bytes: offset into the program
  50. | 2 bytes: 0