In following case const address pointers is truncated by compilers to 16 bits.
I refer to dd2 and dd3 pointers.
Code: Select all
program Test;
const data_arr1 : array[10] of byte = (1,2,3,4,5,6,7,8,9,0); org 10000;
const data_arr2 : array[10] of byte = (1,2,3,4,5,6,7,8,9,0); org 20000;
const data_arr3 : array[10] of byte = (1,2,3,4,5,6,7,8,9,0); org 70000;
var pt1,pt2,pt3 : dword;
procedure get_address(const dd1,dd2,dd3 : ^byte);
begin
pt1 := dd1;
pt2 := dd2;
pt3 := dd3;
end;
begin
get_address(@data_arr1,@data_arr2,@data_arr3);
end.
Address of dd2 and dd3 is truncated to 16 bits, of course everything it's OK if const data is located in first 64K of ROM.
Same problems tested by me in MikroBasic.
Code: Select all
; ADDRESS OPCODE ASM
; ----------------------------------------------
$0000 $EF1B F000 GOTO _main
$0008 $ _get_address:
;test.ppas,10 :: begin
;test.ppas,11 :: pt1 := dd1;
$0008 $C00D F001 MOVFF FARG_get_address, _pt1
$000C $C00E F002 MOVFF FARG_get_address+1, _pt1+1
$0010 $C00F F003 MOVFF FARG_get_address+2, _pt1+2
$0014 $C010 F004 MOVFF FARG_get_address+3, _pt1+3
;test.ppas,12 :: pt2 := dd2;
$0018 $C011 F005 MOVFF FARG_get_address+4, _pt2
$001C $C012 F006 MOVFF FARG_get_address+5, _pt2+1
$0020 $0E00 MOVLW 0
$0022 $6E07 MOVWF _pt2+2, 0
$0024 $6E08 MOVWF _pt2+3, 0
;test.ppas,13 :: pt3 := dd3;
$0026 $C013 F009 MOVFF FARG_get_address+6, _pt3
$002A $C014 F00A MOVFF FARG_get_address+7, _pt3+1
$002E $0E00 MOVLW 0
$0030 $6E0B MOVWF _pt3+2, 0
$0032 $6E0C MOVWF _pt3+3, 0
$0034 $ test_L_0:
;test.ppas,14 :: end;
$0034 $0012 RETURN
$0036 $ _main:
;test.ppas,16 :: begin
;test.ppas,17 :: get_address(@data_arr1,@data_arr2,@data_arr3);
$0036 $0E10 MOVLW #data_arr1
$0038 $6E0D MOVWF FARG_get_address, 0
$003A $0E27 MOVLW @#data_arr1
$003C $6E0E MOVWF FARG_get_address+1, 0
$003E $0E00 MOVLW @@#data_arr1
$0040 $6E0F MOVWF FARG_get_address+2, 0
$0042 $6A10 CLRF FARG_get_address+3, 0
$0044 $0E20 MOVLW #data_arr2
$0046 $6E4B MOVWF STACK_0, 0
$0048 $0E4E MOVLW @#data_arr2
$004A $6E4C MOVWF STACK_0+1, 0
$004C $0E00 MOVLW @@#data_arr2
$004E $6E4D MOVWF STACK_0+2, 0
$0050 $6A4E CLRF STACK_0+3, 0
$0052 $C04B F011 MOVFF STACK_0, FARG_get_address+4
$0056 $C04C F012 MOVFF STACK_0+1, FARG_get_address+5
$005A $0E70 MOVLW #data_arr3
$005C $6E4B MOVWF STACK_0, 0
$005E $0E11 MOVLW @#data_arr3
$0060 $6E4C MOVWF STACK_0+1, 0
$0062 $0E01 MOVLW @@#data_arr3
$0064 $6E4D MOVWF STACK_0+2, 0
$0066 $6A4E CLRF STACK_0+3, 0
$0068 $C04B F013 MOVFF STACK_0, FARG_get_address+6
$006C $C04C F014 MOVFF STACK_0+1, FARG_get_address+7
$0070 $EC04 F000 CALL _get_address
$0074 $ test_L_1:
Code: Select all
const unsigned char arr1[] = "1234" absolute 10000;
const unsigned char arr2[] = "1234" absolute 20000;
const unsigned char arr3[] = "1234" absolute 70000;
unsigned long pt1,pt2,pt3;
void Get_Address(const char *dd1,const char *dd2,const char *dd3) {
pt1 = dd1;
pt2 = dd2;
pt3 = dd3;
}
//----------------- Main procedure
void main() {
Get_Address(arr1,arr2,arr3);
}