Const pointers problems ....

Discuss about beta versions of mikroPascal compiler.
Post Reply
Author
Message
yo2lio
Posts: 1878
Joined: 19 Sep 2006 12:57
Location: Romania, Arad City
Contact:

Const pointers problems ....

#1 Post by yo2lio » 12 Mar 2008 13:10

Hi,

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.
Tested on P18, (PIC18F8722).

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:
Tested in MC and it's OK.

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);
}
Best regards, Florin Andrei Medrea.

http://www.microelemente.ro/
http://www.microelemente.ro/produse-si-servicii/
http://www.microelemente.ro/custom-software/

mail : florin@microelemente.ro

User avatar
zristic
mikroElektronika team
Posts: 6608
Joined: 03 Aug 2004 12:59
Contact:

Re: Const pointers problems ....

#2 Post by zristic » 17 Mar 2008 15:06

We will check this. Thanks.

janni
Posts: 5373
Joined: 18 Feb 2006 13:17
Contact:

Re: Const pointers problems ....

#3 Post by janni » 18 Mar 2008 15:24

yo2lio wrote:Tested in MC and it's OK.

Code: Select all

void Get_Address(const char *dd1,const char *dd2,const char *dd3)
Defined in the same way in mP it also works:

Code: Select all

procedure get_address(const dd1: ^byte;const dd2: ^byte;const dd3: ^byte);
Looks like the compiler 'forgets' it's dealing with constants (i.e. flash, not RAM), if the const declaration is not repeated.

User avatar
zristic
mikroElektronika team
Posts: 6608
Joined: 03 Aug 2004 12:59
Contact:

Re: Const pointers problems ....

#4 Post by zristic » 18 Mar 2008 17:20

Thank you. Consider it fixed.

Post Reply

Return to “mikroPascal Beta testing”