; CC8E Version 1.3, Copyright (c) B Knudsen Data ; C compiler for the PIC18 microcontrollers ; ************ 24. Jun 2009 9:08 ************* processor PIC18C252 radix DEC TBLPTR EQU 0xFF6 TABLAT EQU 0xFF5 Carry EQU 0 i EQU 0x00 t EQU 0x01 p EQU 0x03 si EQU 0x04 strID EQU 0x02 i_2 EQU 0x00 m EQU 0x01 ci EQU 0x05 GOTO main ; FILE 18\demo-rom.c ;// DATA STORED IN PROGRAM MEMORY ; ;#pragma chip PIC18C252 ; ;// THE 'const' TYPE MODIFIER IS RECOMMENDED FOR ALL ROM DATA ;const int16 tx[10] = { 1, 2, 1000, -34, -30000, 2, 100, 23, 0, 0}; ; ;const char str[] = "String 1"; ; ;const struct { ; const char *str; ;} txtp[] = { ; "A table of pointer to strings", ; "Monday", "Tuesday", ; "MyString", ; "MyString", // equal strings and substrings are merged to save space ; "String", // merged with substring ;}; ; ; ;// NOTE: const data that are not read are NOT stored! ;const char notAccessed[] = "This data is not stored because it is not read"; ; ;void sub(uns8 i) ;{ sub MOVWF i,0 ; // reading the 'const' table ; int16 t = tx[i]; BCF 0xFD8,Carry,0 RLCF i,W,0 CALL _const1 MOVWF t,0 TBLRD +* MOVF TABLAT,W,0 MOVWF t+1,0 ; ; const char *p = str; MOVLW 20 MOVWF p,0 ; i = *p; CALL _const1 MOVWF i,0 ; p = "Hello world"; MOVLW 89 MOVWF p,0 ; i = *p; CALL _const1 MOVWF i,0 ; ; char si; ; p = txtp[si].str; MOVLW 29 ADDWF si,W,0 CALL _const1 MOVWF p,0 ; i = *p; CALL _const1 MOVWF i,0 ;} RETURN ; ; ; ; ;// DATA CAN BE STORED DIRECTLY IN PROGRAM MEMORY ;// NOTE: This is for special needs, when 'const' tables is not sufficient ; ;#define CDATA_START 0x3000 ;#pragma cdata[CDATA_START] // start of cdata block ; ;// STORE 16 bits data ;#pragma cdata[] = 0xFFFF, 0x2000, 0x1000 ; ;// CONSTANT EXPRESSIONS ARE EVALUATED BEFORE STORING ;#pragma cdata[] = 0x100, (10<<4) + 3456,\ ; 10, 456, 10000 ; ; ;#define D8(l,h) l + h*128 ;#define D32(x) x%0x10000, x/0x10000 ; ;// STORE 8 AND 32 BITS DATA ;#pragma cdata[] = D8(10,20), D32(10234543) ; ;// AUTOMATIC ADDRESS CALCULATION ;#pragma cdata.ID0 = 0x10, 200+3000 ;#pragma cdata.ID1 = "Hello world\0" ;#pragma cdata.ID2 = "Another string\r\n" "merged" ; ;// STORE A TABLE OF 16 BIT ADDRESSES TO ROM CODE ;#pragma cdata.ID_TABLE = ID0, ID1, ID2 // store addresses ; ;#pragma cdata.CDATA_END // end of cdata block ; ; ;#pragma origin CDATA_END // program code follow right after ORG 0x3042 ; ; ;void write(uns16 strID) ;{ write ; // .. ;} RETURN ; ; ;/* NOTE: functions using labels in the directly stored data must be ; defined after the data definitions */ ; ;void pointers( void) ;{ pointers ; write(ID1); MOVLW 26 MOVWF strID,0 MOVLW 48 MOVWF strID+1,0 RCALL write ; write(ID2); MOVLW 38 MOVWF strID,0 MOVLW 48 MOVWF strID+1,0 RCALL write ; ; char i = 2; // index of ID2 MOVLW 2 MOVWF i_2,0 ; TBLPTR = i * 2; CLRF TBLPTR+1,0 CLRF TBLPTR+2,0 BCF 0xFD8,Carry,0 RLCF i_2,W,0 MOVWF TBLPTR,0 ; TBLPTR += ID_TABLE; MOVLW 60 ADDWF TBLPTR,1,0 MOVLW 48 ADDWFC TBLPTR+1,1,0 MOVLW 0 ADDWFC TBLPTR+2,1,0 ; write( *TBLPTR); TBLRD * MOVFF TABLAT,strID CLRF strID+1,0 RCALL write ; ; // low level access of program memory: ; TBLPTR = ID0; MOVLW 22 MOVWF TBLPTR,0 MOVLW 48 MOVWF TBLPTR+1,0 CLRF TBLPTR+2,0 ; char m = *TBLPTR; // READ PROGRAM MEMORY TBLRD * MOVFF TABLAT,m ; m = *TBLPTR++; // READ PROGRAM MEMORY AND INCREMENT POINTER TBLRD *+ MOVFF TABLAT,m ; m = *TBLPTR--; // READ PROGRAM MEMORY AND DECREMENT POINTER TBLRD *- MOVFF TABLAT,m ; m = *++TBLPTR; // INCREMENT POINTER AND READ PROGRAM MEMORY TBLRD +* MOVFF TABLAT,m ;} RETURN ; ;void main(void) ;{ main ; sub(3); MOVLW 3 CALL sub ; pointers(); RCALL pointers ;} SLEEP RESET _const1 MOVWF ci,0 ADDLW 192 MOVWF TBLPTR,0 MOVLW 48 CLRF TBLPTR+1,0 ADDWFC TBLPTR+1,1,0 CLRF TBLPTR+2,0 TBLRD * MOVF TABLAT,W,0 RETURN DW 0x1 DW 0x2 DW 0x3E8 DW 0xFFDE DW 0x8AD0 DW 0x2 DW 0x64 DW 0x17 DW 0x0 DW 0x0 DW 0x7453 DW 0x6972 DW 0x676E DW 0x3120 DW 0x2300 DW 0x4841 DW 0x5050 DW 0x4152 DW 0x7420 DW 0x6261 DW 0x656C DW 0x6F20 DW 0x2066 DW 0x6F70 DW 0x6E69 DW 0x6574 DW 0x2072 DW 0x6F74 DW 0x7320 DW 0x7274 DW 0x6E69 DW 0x7367 DW 0x4D00 DW 0x6E6F DW 0x6164 DW 0x79 DW 0x7554 DW 0x7365 DW 0x6164 DW 0x79 DW 0x794D DW 0x7453 DW 0x6972 DW 0x676E DW 0x4800 DW 0x6C65 DW 0x6F6C DW 0x7720 DW 0x726F DW 0x646C DW 0x0 ORG 0x3000 DATA 0xFFFF DATA 0x2000 DATA 0x1000 DATA 0x0100 DATA 0x0E20 DATA 0x000A DATA 0x01C8 DATA 0x2710 DATA 0x0A0A DATA 0x2AAF DATA 0x009C DATA 0x0010 DATA 0x0C80 DATA 0x6548 DATA 0x6C6C DATA 0x206F DATA 0x6F77 DATA 0x6C72 DATA 0x0064 DATA 0x6E41 DATA 0x746F DATA 0x6568 DATA 0x2072 DATA 0x7473 DATA 0x6972 DATA 0x676E DATA 0x0A0D DATA 0x656D DATA 0x6772 DATA 0x6465 DATA 0x3016 DATA 0x301A DATA 0x3026 END ; *** KEY INFO *** ; 0x000004 28 word(s) 0 % : sub ; 0x0030AC 61 word(s) 0 % : _const1 ; 0x003042 1 word(s) 0 % : write ; 0x003044 46 word(s) 0 % : pointers ; 0x0030A0 6 word(s) 0 % : main ; RAM usage: 6 bytes (6 local), 1530 bytes free ; Maximum call level: 2 ; Total of 177 code words (1 %)