fox32os/bootloader/reloc.asm

59 lines
1.1 KiB
NASM

; FXF relocation routines
const FXF_CODE_SIZE: 0x00000004
const FXF_CODE_PTR: 0x00000008
const FXF_RELOC_SIZE: 0x0000000C
const FXF_RELOC_PTR: 0x00000010
; relocate a FXF binary
; inputs:
; r0: pointer to memory buffer containing a FXF binary
; outputs:
; r0: relocation address
fxf_reloc:
; calculate relocation address
mov r5, r0
add r5, FXF_CODE_PTR
mov r5, [r5]
add r5, r0
; get the number of entries in the reloc table
mov r1, r0
add r1, FXF_RELOC_SIZE
mov r1, [r1]
div r1, 4
mov r31, r1
; get the pointer to the table
mov r1, r0
add r1, FXF_RELOC_PTR
mov r1, [r1]
add r1, r0
; get the pointer to the code
mov r2, r0
add r2, FXF_CODE_PTR
mov r2, [r2]
add r2, r0
; loop over the reloc table entries and relocate the code
fxf_reloc_loop:
; get the reloc table entry
mov r3, [r1]
; point to the location in the code
mov r4, r2
add r4, r3
; relocate
add [r4], r5
; increment the reloc table pointer
add r1, 4
loop fxf_reloc_loop
; return relocation address
mov r0, r5
ret