Pascal Compiler for 8051 Microcontrollers
You can force placing a procedure at absolute address with the absolute directive. This way you can also reserve some bytes at fixed addresses in code segment. There is no need to call procedures at absolute addresses, linker will place them where they should be - of course, you can call them if you need to. See some examples below:
Program AbsoluteProcedures;
{ Usless program just to demonstrate procedures/functions at absolute addersses }
{ This procedure will be placed at code address $1000 and will occupy just one byte (RET) }
Procedure MustBeFixed absolute $1000;
begin
end;
{ This procedure will also occupy just one byte at code address $0045 }
Procedure JustOneByte absolute $45; Assembler;
Asm
DB $00
{$NoReturn } { Don't generate RET instruction }
end;
{ This procedure will be placed at code address $F000 }
Procedure Restart absolute $F000;
begin
Asm
LJMP $0000
end;
end;
begin
// no need to call procedures at absolute addresses, linker will just put them where they should be
end.
Ccompiled code:
; Turbo51 version 0.1.3.10, Copyright 2000 - 2011 Igor Funa
$REGISTERBANK (0)
_CODE SEGMENT CODE
EXTRN IDATA (StackStart)
; Program AbsoluteProcedures;
;
; { Usless program just to demonstrate procedures/functions at absolute addersses }
;
;
; { This procedure will be placed at code address $1000 and will occupy just one byte (RET) }
;
; Procedure MustBeFixed absolute $1000;
CSEG AT $1000
USING 0
MustBeFixed:
; begin
; end;
RET
;
;
; { This procedure will also occupy just one byte at code address $0045 }
;
; Procedure JustOneByte absolute $45; Assembler;
CSEG AT $0045
JustOneByte:
; Asm
; DB $00
DB 0
; {$NoReturn } { Don't generate RET instruction }
; end;
;
;
; { This procedure will be placed at code address $F000 }
;
; Procedure Restart absolute $F000;
CSEG AT $F000
Restart:
; begin
; Asm
; LJMP $0000
LJMP 0
; end;
; end;
CSEG AT $0000
AJMP AbsoluteProcedures
RSEG _CODE
AbsoluteProcedures:
;
; begin
MOV SP, #StackStart-1
; // no need to call procedures at absolute addresses, linker will just put them where they should be
; end.
L_0006:
SJMP L_0006
RSEG _CONST
END