unfortunalty the for /next loop of x_scan can be 2 or 3 so not easy to break into even words -mm darn
Printable View
unfortunalty the for /next loop of x_scan can be 2 or 3 so not easy to break into even words -mm darn
interesting results
i now format the data as word value which now stores the data in the correct byte by byte sequance form ,
however readcode reads the address data back incorectly for a given address when reading as byte value
i assume its cos readcode is word based command ???
is there a way to read the data back for each address byte only ?
as can be seen on address 5172, 5173 byte values are incorrect for the given address
part of flash dump of font storedCode:
LG_Font_Base:
' Note gl_x char space need be 12 , not normal 24 when using chr else too big a gap space _
' Code for "-" Asci 45 90 real values _
@ dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000;,0x00
@ dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFC,0x003F,0xFC00,0x3FFC
@ dw 0x003F,0xFC00,0x3FFC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000;,0x00
@ dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
Code:
5170- 0000 3ffc 003f fc00 3ffc 003f fc00 3ffc
5180- 0000 0000 0000 0000 0000 0000 0000 0000
5190- 0000 0000 0000 0000 0000 0000 0000 0000
51a0- 0000
terminal debug dump - for each address read by readcode
5170- 0 , 5171- 0,
5172- FC, 5173- 3F,
5174- 3F, 5175- 0,
5176- 0 , 5177- FC,
5178- FC, 5179- 3F,
517A- 3F, 517B- 0,
517C- 0 , 517D- FC,
517E- FC, 517F- 3F,
5180- 0 , 5181- 0
I will see if I can explain it
pic18 pgm mem is stored as words , so if the bytes are not an even number the last byte is padded with 00
if we store this @ db "say",34,"hello",34,0
then its stored like this lst file extract
00014A 6173 2279 6568 db "say",34,"hello",34,0 ; note order looks reversed but its really lowbyte first
6C6C 226F 0000
when readcode reads it back
its lowbyte, highbyte
so the string is returned in order as say"hello",0
when stored as words
@ dw 0x0000,0x0000,0x53d7,0x53d7,0x53d7,0x53d7,0x53d7,0 x53d7,0x53d7,0x53d7,0x53d7,0x0000,0x0000,0x0000,0x 0000,0x0000
lst file looks like this
003CF6 0000 0000
53D7 06827
0000,0x0000
53D7 53D7 53D7
53D7 53D7 53D7
53D7 53D7 0000
0000 0000 0000
0000
note the order is now not reversed
ok what i dont follow is
if readcode can read a byte back based on a word address ,
and the data is written to flash as a word , and therefore are stored in the way i want to read them byte by byte based on address i should be able to get each byte of the word
what i am finding is that the byte returned is not correct for the address given
work just fine for me
Code:
pause 2000
Serout2 PORTb.7,84,["ready",13,10]
addr var word
inbuff var byte[30]
buff var byte[30] $4f0
lb var byte
hb var byte
lc var byte
Clear
goto StartLoop ' Required
String1:
@ data "may \"Hello\"\0"
String2:
@ db "say",34,"hello",34,0
String3:
@ dw 0x003F,0xFC00,0x3FFC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000;,0x00
'------------Flash2Ram Macro - Location insensitive -------------------------
ASM
Flash2Ram macro buffer, msg ; Fills the buffer from flash msg
movlw UPPER msg
movwf TBLPTRU
movlw HIGH msg
movwf TBLPTRH
movlw LOW msg
movwf TBLPTRL
movlw low buffer
movwf FSR2L
movlw High buffer
movwf FSR2H
L?CALL _bfill
endm
ENDASM
ASM
GetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw High Label ; get high byte
movwf Wout + 1
endm
ENDASM
StartLoop: ' This loop repeats continuously just as a test.
@ Flash2Ram _buff,_String1' Get a String from flash memory
Serout2 PORTb.7,84, ["buff ",str buff ,13,10] ' and print it
@ Flash2Ram _inbuff,_String2' Get a String from flash memory
Serout2 PORTb.7,84, ["inbuff ",str inbuff ,13,10] '
pause 500
@ GetAddress _String3 ,_addr
for lc=0 to 3
readcode addr ,lb
addr=addr+1
readcode addr ,hb
addr=addr+1
Serout2 PORTb.7,84, ["hb ",hex2 hb," lb ",hex2 lb,13,10]
next
goto StartLoop ' Repeat
end
bfill:
ASM
Next_Char
tblrd *+
movf TABLAT,w
movwf POSTINC2
btfss STATUS,Z
goto Next_Char
return
ENDASM
output
Quote:
buff may "Hello"
inbuff say"hello"
hb 00 lb 3F
hb FC lb 00
hb 3F lb FC
hb 00 lb 00
buff may "Hello"
inbuff say"hello"
hb 00 lb 3F
hb FC lb 00
hb 3F lb FC
hb 00 lb 00
buff may "Hello"
inbuff say"hello"
hb 00 lb 3F
to read as words
Code:
pause 2000
Serout2 PORTb.7,84,["ready",13,10]
addr var word
inbuff var byte[30]
buff var byte[30] $4f0
lb var byte
hb var byte
lc var byte
lp var word
Clear
goto StartLoop ' Required
String1:
@ data "may \"Hello\"\0"
String2:
@ db "say",34,"hello",34,0
String3:
@ dw 0x003F,0xFC00,0x3FFC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000;,0x00
'------------Flash2Ram Macro - Location insensitive -------------------------
ASM
Flash2Ram macro buffer, msg ; Fills the buffer from flash msg
movlw UPPER msg
movwf TBLPTRU
movlw HIGH msg
movwf TBLPTRH
movlw LOW msg
movwf TBLPTRL
movlw low buffer
movwf FSR2L
movlw High buffer
movwf FSR2H
L?CALL _bfill
endm
ENDASM
ASM
GetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw High Label ; get high byte
movwf Wout + 1
endm
ENDASM
StartLoop: ' This loop repeats continuously just as a test.
@ Flash2Ram _buff,_String1' Get a String from flash memory
Serout2 PORTb.7,84, ["buff ",str buff ,13,10] ' and print it
@ Flash2Ram _inbuff,_String2' Get a String from flash memory
Serout2 PORTb.7,84, ["inbuff ",str inbuff ,13,10] '
pause 500
@ GetAddress _String3 ,_addr
for lc=0 to 3
readcode addr ,lb
addr=addr+1
readcode addr ,hb
addr=addr+1
Serout2 PORTb.7,84, ["hb ",hex2 hb," lb ",hex2 lb,13,10]
next
@ GetAddress _String3 ,_addr
for lc=0 to 3
readcode addr ,lp
addr=addr+2
Serout2 PORTb.7,84, ["lp ",hex4 lp,13,10]
next
goto StartLoop ' Repeat
end
bfill:
ASM
Next_Char
tblrd *+
movf TABLAT,w
movwf POSTINC2
btfss STATUS,Z
goto Next_Char
return
ENDASM
output
Quote:
lp 3FFC
lp 0000
buff may "Hello"
inbuff say"hello"
hb 00 lb 3F
hb FC lb 00
hb 3F lb FC
hb 00 lb 00
lp 003F
lp FC00
lp 3FFC
lp 0000
buff may "Hello"
inbuff say"hello"
hb 00 lb 3F
h
yes i thought about doing it that way where i get a word then use high, lowbyte , and thats ok when the for/next loop is for x = 1 to 2 , 4,6 etc so it uses the 2 bytes of the word per loop
but my for/next loop 1-3 depending on the font so not even word use of 2 bytes is possible
and if you just get 1 byte using readcode addresss , byte ,
it will appears to get low byte for an even address , high byte for odd address - regardless of the data stored at that specific address
eg my listing i put in post - address in flash at 5172,73 = 3FFC
USING READCODE at address $5172 = $FC -not $3F as stored in flash
5170- 0000 3ffc 003f fc00 3ffc 003f fc00 3ffc
5180- 0000 0000 0000 0000 0000 0000 0000 0000
5190- 0000 0000 0000 0000 0000 0000 0000 0000
51a0- 0000
terminal debug dump - for each address read by readcode
5170- 0 , 5171- 0,
5172- FC, 5173- 3F,
5174- 3F, 5175- 0,
5176- 0 , 5177- FC,
5178- FC, 5179- 3F,
517A- 3F, 517B- 0,
517C- 0 , 517D- FC,
517E- FC, 517F- 3F,
5180- 0 , 5181- 0
if you put this your example of string 3 in
so if say address return is adress 1234 say 0000
Code:@ GetAddress _String3 ,_addr
for lc=0 to 3
readcode addr ,lb
addr=addr+1
readcode addr ,hb
addr=addr+1
Serout2 PORTb.7,84, ["hb ",hex2 hb," lb ",hex2 lb,13,10]
next
sorry but I can't make any sense of what you saying
can I suggest you make a small program that demonstrates the problem
what about this
Code:
pause 2000
Serout2 PORTb.7,84,["ready",13,10]
addr var word
inbuff var byte[30]
buff var byte[30] $4f0
lb var byte
hb var byte
lc var byte
lp var word
Clear
goto StartLoop ' Required
String1:
@ data "may \"Hello\"\0"
String2:
@ db "say",34,"hello",34,0
'------------Flash2Ram Macro - Location insensitive -------------------------
ASM
Flash2Ram macro buffer, msg ; Fills the buffer from flash msg
movlw UPPER msg
movwf TBLPTRU
movlw HIGH msg
movwf TBLPTRH
movlw LOW msg
movwf TBLPTRL
movlw low buffer
movwf FSR2L
movlw High buffer
movwf FSR2H
L?CALL _bfill
endm
ENDASM
ASM
GetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw High Label ; get high byte
movwf Wout + 1
endm
ENDASM
StartLoop: ' This loop repeats continuously just as a test.
@ Flash2Ram _buff,_String1' Get a String from flash memory
Serout2 PORTb.7,84, [13,10,"buff ",str buff ,13,10] ' and print it
@ Flash2Ram _inbuff,_String2' Get a String from flash memory
Serout2 PORTb.7,84, ["inbuff ",str inbuff ,13,10] '
pause 500
;@ GetAddress _String3 ,_addr
'
addr =$5170
for lc=0 to 3
Serout2 PORTb.7,84, [13,10,"address ",hex4 addr ]
readcode addr ,lb
addr=addr+1
;Serout2 PORTb.7,84, [13,10,"address ",hex4 addr ]
readcode addr ,hb
Serout2 PORTb.7,84, [" hb ",hex2 hb ]
Serout2 PORTb.7,84, [" lb ",hex2 lb ]
addr=addr+1
next
;@ GetAddress _String3 ,_addr
addr =$5170
for lc=0 to 3
Serout2 PORTb.7,84, [13,10,"address ",hex4 addr ]
readcode addr ,lp
addr=addr+2
Serout2 PORTb.7,84, [" lp ",hex4 lp]
next
addr =$5177
readcode addr ,lb
Serout2 PORTb.7,84, [13,10,"odd address ",hex4 addr ]
Serout2 PORTb.7,84, [" b ",hex2 lb ]
addr =$5176
readcode addr ,lb
Serout2 PORTb.7,84, [13,10,"even address ",hex4 addr ]
Serout2 PORTb.7,84, [" b ",hex2 lb ]
goto StartLoop ' Repeat
end
bfill:
ASM
Next_Char
tblrd *+
movf TABLAT,w
movwf POSTINC2
btfss STATUS,Z
goto Next_Char
return
ENDASM
String3:
asm
org 0x5170
dw 0x003F,0xFC00,0x3FFC,0x5566,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000;,0x00
ENDASM
output
Quote:
buff may "Hello"
inbuff say"hello"
address 5170 hb 00 lb 3F
address 5172 hb FC lb 00
address 5174 hb 3F lb FC
address 5176 hb 55 lb 66
address 5170 lp 003F
address 5172 lp FC00
address 5174 lp 3FFC
address 5176 lp 5566
odd address 5177 b 55
even address 5176 b 66
@5172 = $FC = LOW BYTEQuote:
eg my listing i put in post - address in flash at 5172,73 = 3FFC
USING READCODE at address $5172 = $FC -not $3F as stored in flash
@5173 = $3F = HIGH BYTE
$3FFC $FC = LOW BYTE $3F = HIGH BYTE
where is the PROBLEM , IT's all consistent
org 0x5170
dw 0x003F,0xFC00,0x3FFC
i must not be showing it well , the data seq of the font is the only thing that matters - not how it stored , only how it is read back in sequance i need ,
it has been split over a lot of posts so ill try re show it in one post
data was orginally poke /peek
this uses 2x the space than the data alone in flash
depeding on the font , data is read back as 3 or 2 bytes for each x scan line accross so cant be out of sequance
tryed changeing to @ db command using the font data bytes ,Code:pokecode $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3F,$FC,$00,$3F,$FC,$00,$3F,$FC,_
$00,$3F,$FC,$00,$3F,$FC,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
@ db 0x00 , 0x3F, 0x10, 0xFF..............
this stores in flash as address - 3F00 , FF10 is NOT stored at same sequance address as font DB command as it is entered
readcode gives address = $3f , address + 1 = $00 - no good cos the data is not in the font seq required
tryied
@ dw 0x003F , 0x10FF
this stores in flash as address = 003F , 10FF - excellent follows the same data seq as the font bytes and is correct in flash so reading sequantial address should get each byte in sequance
readcode address 0 , byte = $3F - wrong - it recovers address +1 or low byte
readcode address +1 , byte = $00 - wrong - it recovers address -1 or high byte
hope i am showing this better for the issue at hand
to confirm if the problem is solved by swapping low/ high byte of the font data resolve - it does , but this is alot of work as well
wrongQuote:
tryed changeing to @ db command using the font data bytes ,
@ db 0x00 , 0x3F, 0x10, 0xFF..............
this stores in flash as address - 3F00 , FF10 is NOT stored at same sequance address as font DB command as it is entered
it is stored exactly in that order low byte first then high byte , you are feeding in the data high byte first
readcode will retrieve it in the same order low byte then high byte
wrongQuote:
@ dw 0x003F , 0x10FF
readcode address 0 , byte = $3F - wrong - it recovers address +1 or low byte
readcode address +1 , byte = $00 - wrong - it recovers address -1 or high byte
@ dw places the data the same way low byte then high byte
readcode will retrieve it in the same order low byte then high byte
outputCode:
pause 2000
Serout2 PORTb.7,84,["ready",13,10]
addr var word
inbuff var byte[30]
buff var byte[30] $4f0
lb var byte
hb var byte
lc var byte
lp var word
Clear
goto StartLoop ' Required
String2:
@ db 0x3f,0,0,0xfc,0xfc,0x3f,0x66,0x55,0,0
asm
org 0x5170
dw 0x003F,0xFC00,0x3FFC,0x5566,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000;,0x00
org 0x0200
ENDASM
asm
GetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw High Label ; get high byte
movwf Wout + 1
endm
ENDASM
StartLoop:
Serout2 PORTb.7,84, [13,10,"db data " ]
@ GetAddress _String2 ,_addr
for lc=0 to 3
Serout2 PORTb.7,84, [13,10,"address ",hex4 addr ]
readcode addr ,lb
addr=addr+1
Serout2 PORTb.7,84, [" lb ",hex2 lb," address ",hex4 addr ]
readcode addr ,hb
Serout2 PORTb.7,84, [" hb ",hex2 hb ]
addr=addr+1
next
Serout2 PORTb.7,84, [13,10,"dw data as byte " ]
addr =$5170
for lc=0 to 3
Serout2 PORTb.7,84, [13,10,"address ",hex4 addr ]
readcode addr ,lb
addr=addr+1
Serout2 PORTb.7,84, [" lb ",hex2 lb," address ",hex4 addr ]
readcode addr ,hb
Serout2 PORTb.7,84, [" hb ",hex2 hb ]
addr=addr+1
next
Serout2 PORTb.7,84, [13,10,"dw data as word " ]
;@ GetAddress _String3 ,_addr
addr =$5170
for lc=0 to 3
Serout2 PORTb.7,84, [13,10,"address ",hex4 addr ]
readcode addr ,lp
addr=addr+2
Serout2 PORTb.7,84, [" lp ",hex4 lp]
next
addr =$5177
readcode addr ,lb
Serout2 PORTb.7,84, [13,10,"odd address ",hex4 addr ]
Serout2 PORTb.7,84, [" high ",hex2 lb ]
addr =$5176
readcode addr ,lb
Serout2 PORTb.7,84, [13,10,"even address ",hex4 addr ]
Serout2 PORTb.7,84, [" low ",hex2 lb ]
goto StartLoop ' Repeat
end
Quote:
db data
address 0184 lb 3F address 0185 hb 00
address 0186 lb 00 address 0187 hb FC
address 0188 lb FC address 0189 hb 3F
address 018A lb 66 address 018B hb 55
dw data as byte
address 5170 lb 3F address 5171 hb 00
address 5172 lb 00 address 5173 hb FC
address 5174 lb FC address 5175 hb 3F
address 5176 lb 66 address 5177 hb 55
dw data as word
address 5170 lp 003F
address 5172 lp FC00
address 5174 lp 3FFC
address 5176 lp 5566
odd address 5177 high 55
even address 5176 low 66
sorry richard the result i am seeing does not support what your are saying and the results show on the GLCD and debug terminal show the seqaunce for @ db option and @ dw to be incorrect when using readcode i have at the moment , a it gets 1 byte at a time
remember the whole goel is to
a. not change the font original data sequence of values
b. store only the font data values , and not add any other values to flash to get the data back - unlike pokecode does
try it for your self
this is font chr "0" , where the font is 24 bits wide for (X) and 30 lines (Y)high
LG font values for Common_font routine then are
Y_scan = 29 ' 30 - Y scan lines - 1 - Cos "for " starts at 1
X_scan = 3 ' 3 - X scan x 8 bits ( 24 bits)
Font_lookup = 1 ' Use LG_Font_lookup
gosub Font_Common ' not using flash chip
with poke/peek it works ok with this code
terminal should show the same data format and exact seq as the pokecode data
code to place the code on glcd and terminal - terminal should show the address and data in the same sequance as the data input hereCode:
' Code for "0" Asci 48 90 real values _
pokecode $00,$00,$00,$00,$FF,$00,$03,$FF,$C0,$0F,$FF,$F0,$1F,$FF,$F8,$1F,$FF,$F8,$3F,$C3,$FC,$3F,$81,$FC,$3F,_
$81,$FC,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,_
$FE,$7F,$00,$FE,$7F,$00,$FE,$7F,$00,$FE,$3F,$81,$FC,$3F,$81,$FC,$3F,$C3,$FC,$1F,$FF,$F8,$1F,$FF,$F8,_
$0F,$FF,$F0,$03,$FF,$C0,$00,$FF,$00,$00,$00,$00,$00,$00,$00
Code:'=================== FONT COMMON ROUTINE - pokecode use ==========================
' Assumes gl_x, gl_y,X_scan,Y_scan,Font_lookup
' ALL FONTS MUST BE gl_x = 8 , 16 , 24 etc
' Inv_font = 0 = normal 1= inverse
Font_Common:
x_save = gl_x ' save the gl_x start point value
y_save = gl_y ' save the gl_y start point value
gl_yb = y_save + Y_scan ' number of y scans for the char from y starting point(0)
gl_xb = 0
Address = 0
if Font_lookup = 1 then
@ GetAddress _LG_Font_Base, _Font_Base_Address ; gets base start address of LG_font into Font_Base_Address varable
Font_Index = (LG_font - 45)* (90*2) ' remove the ascii chr value 45 offset 0 * font chr length x 2 cos of RETLW INSTRUCTION for each byte read in index
HSEROUT [13,10,"lg Font_Base_Address = ",hex Font_Base_Address," font index = ",dec Font_Index, 13,10] 'debug
endif
if Font_lookup = 2 then ' remove the offset of the first symbol $2D / 45 so start at 0
@ GetAddress _Med_Font_Base, _Font_Base_Address
Font_Index = (Med_font - 45)* (40*2) ' remove the ascii chr value 45 offset * font chr length in index
endif
Address = Font_Base_Address + Font_Index 'gets you to the start of the glyph
for gl_y = y_save to gl_yb ' y scan lines, start to finish values
gl_x = x_save ' clear x position to start point (keep it an 8bit multiple)
gosub gl_gaddr ' Set address
for gl_xb = 1 to X_scan ' gl_x byte x X scan bytes on each line
peekcode Address,gl_byte ' read the indexed byte in
HSEROUT [hex Address,"- ",hex gl_byte, ","]
glcd_msb = gl_byte
glcd_cmd = DATA_WR_INC ' write and increment
gosub send_1 ' send to glcd
Address = Address+2 ' inc address here +2 cos each byte includes intruction code , as data start at 0
next gl_xb ' next byte of font
next gl_y ' next scan line of font
gl_y = y_save ' Restore the Y location
gl_x = x_save ' Restore the X location
return
to use @ db data format the poke code data is changed to this format
routine to get this data out and into the corect sequance - BUT THIS DOES NOT WORK AS THE DATA IS OUT OF SEQUANCE cos of readcode of low high readingCode:
' Code for "0" Asci 48 90 real values _
@ db 0x00,0x00,0x00,0x00,0xFF,0x00,0x03,0xFF,0xC0,0x0F,0xFF,0xF0,0x1F,0xFF,0xF8,0x1F,0xFF,0xF8,0x3F,0xC3,0xFC,0x3F,0x81,0xFC,0x3F
@ db 0x81,0xFC,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00
@ db 0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFE,0x3F,0x81,0xFC,0x3F,0x81,0xFC,0x3F,0xC3,0xFC,0x1F,0xFF,0xF8,0x1F,0xFF,0xF8
@ db 0x0F,0xFF,0xF0,0x03,0xFF,0xC0,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00
same data joined to make word values ,Code:Font_Common:
x_save = gl_x ' save the gl_x start point value
y_save = gl_y ' save the gl_y start point value
gl_yb = y_save + Y_scan ' number of y scans for the char from y starting point(0)
gl_xb = 0
Address = 0
if Font_lookup = 1 then
@ GetAddress _LG_Font_Base, _Font_Base_Address ; gets base start address of LG_font into Font_Base_Address varable
Font_Index = (LG_font - 45)* 90 ' remove the ascii chr value 45 offset 0 * font chr length
HSEROUT [13,10,"lg Font_Base_Address = ",hex Font_Base_Address," font index = ",dec Font_Index, 13,10] 'debug
endif
if Font_lookup = 2 then ' remove the offset of the first symbol $2D / 45 so start at 0
@ GetAddress _Med_Font_Base, _Font_Base_Address
Font_Index = (Med_font - 45)*40 ' remove the ascii chr value 45 offset * font chr length in index
endif
Address = Font_Base_Address + Font_Index 'gets you to the start of the glyph
for gl_y = y_save to gl_yb ' y scan lines, start to finish values
gl_x = x_save ' clear x position to start point (keep it an 8bit multiple)
gosub gl_gaddr ' Set address
for gl_xb = 1 to X_scan ' gl_xb byte x X scan bytes can be 2 or 3 on each line
readcode Address,gl_byte
HSEROUT [hex Address,"- ",hex gl_byte, ","]
glcd_msb = gl_byte ' put in 1st byte - stored as
glcd_cmd = DATA_WR_INC ' write and increment
gosub send_1 ' send to glcd
Address = Address + 1 ' inc address + 1
next gl_xb ' next byte of font
next gl_y ' next scan line of font
gl_y = y_save ' Restore the Y location
gl_x = x_save ' Restore the X location
return
these are stored in flash correct seq in flash as the font data shown here
recovery routine is same as above - and has the same issue readcode gets the data not in correct seq required
Code:
' Code for "0" Asci 48 90 real values _
@ dw 0x0000,0x0000,0xFF00,0x03FF,0xC00F,0xFFF0,0x1FFF,0xF81F,0xFFF8,0x3FC3,0xFC3F,0x81FC ;,0x3F
@ dw 0x3F81,0xFC7F,0x00FE,0x7F00,0xFE7F,0x00FE,0x7F00,0xFE7F,0x00FE,0x7F00,0xFE7F,0x00FE,0x7F00
@ dw 0xFE7F,0x00FE,0x7F00,0xFE7F,0x00FE,0x3F81,0xFC3F,0x81FC,0x3FC3,0xFC1F,0xFFF8,0x1FFF ;,0xF8
@ dw 0xF80F,0xFFF0,0x03FF,0xC000,0xFF00,0x0000,0x0000,0x0000
as a test i reversed high to low byte in the font structure
unfortunately it worked , and this is supported by the data dumps as shown in previous posts , so to make the font common routine work i would have to reverse all the data stucture for each font chr - which if i dont have abetter option will need to be done
Code:
' Code for "0" Asci 48 90 real values _
@ dw 0x0000,0x0000,0x00FF,0xFF03,0x0FC0,0xF0FF,0xFF1F,0x1FF8,0xF8FF,0xC33F,0x3FFC,0xFC81;,0x3F
@ dw 0x813F,0x7FFC,0xFE00,0x007F,0x7FFE,0xFE00,0x007F,0x7FFE,0xFE00,0x007F,0x7FFE,0xFE00,0x007F ;swaped low high bytes arround
@ dw 0x7FFE,0xFE00,0x007F,0x7FFE,0xFE00,0x813F,0x3FFC,0xFC81,0xC33F,0x1FFC,0xF8FF,0xFF1F;,0xF8
@ dw 0x0FF8,0xF0FF,0xFF03,0x00C0,0x00FF,0x0000,0x0000,0x0000
If you can write to that area your program could swap the data and write it back,
then set a flag somewhere in a spare EEPROM bit to flag not to do it again.
That’s if you can’t write something to spit it out a serial terminal in the format you want it.
If the pic can read that and also has a serial terminal, you should be able to get it to format the lines as code you have above.
thats what i ended up doing art and swapped the lot arround , although pain in butt readcode is the best option for the fonts that are not loaded in the spi flash , fortunately there are only 30 font chrs like this
has anyone a way to use 2 word value varables to accumulate an math value with out using longs or floating point
Hi,
Depends on your particular needs, here's one way to be used when the value to be added fits within a WORD:
If the value to be added is always one then:Code:HW VAR WORD
LW VAR WORD
Temp VAR WORD
AddValue VAR WORD
Temp = LW ' Copy low word
LW = LW + AddValue
IF LW < Temp THEN ' Low word wrapped around
HW = HW + 1
ENDIF
/Henrik.Code:HW VAR WORD
LW VAR WORD
LW = LW + 1
IF LW = 0 THEN 'Low word wrapped around.
HW = HW + 1
ENDIF
Why you don't try N-Bit_MATH?
http://www.picbasic.co.uk/forum/show...2694#post82694
I use this code to store result as string in array
Code:'Convert 64Bit to string
@ MOVE?CP 10, _Tmp64bit ; copy a CONSTANT to a Pvar
FOR i=19 TO 0 STEP -1
@ MATH_DIV _Int64Bit, _Tmp64bit, _Res64bit ; Res = A / B; Remainder in REG_Z
ValueStr[i]=REG_Z+48
@ MOVE?PP _Res64bit, _Int64Bit ; copy a Pvar to a Pvar
NEXT i
hi thanks for the input guys
to get it to do what i want i used longs ;(
which i would like to change to 2 x word variables for this one long variable "Event_Dist_Speed "
i thinking perhaps the nbit math may work but not sure how it may be done with the calculations i have now
Code:' routine to calc speed based on sec under 18 hours
Distance_Calc_Speed0:
if Event_Dist_Timebase = 0 then Event_Dist_Speed = Event_Dist_Value ' calculate speed with base in secs
if Event_Dist_Timebase = 1 then Event_Dist_Speed = Event_Dist_Value*60 ' calculate speed with base in mins
Event_Dist_Speed = Event_Dist_Speed*100/(EL1_Seconds + (EL1_Minutes + EL1_Hours*60)*60)
if Event_Dist_Timebase = 2 then gosub Distance_Speed_Calc2 ' calculate speed with base in hours - gosub becuase it is called as a seprate display
' HSEROUT [" Event_Dist_Speed = ",dec Event_Dist_Speed, 10,13] ' debug
return
' ----------------------------------------------------------------
' routine to calc speed based on sec 's
' used when time is >18 hours so that value is < word max size
Distance_Calc_Speed1:
return
' ------------------------------------------------------------------
' show KPH or MPH on every base reading formular
' calculate speed with hours base
' called as 2nd speed display details
Distance_Speed_Calc2:
Event_Dist_Speed = Event_Dist_Value*360
if Event_Dist_Measure = 0 then Event_Dist_Speed = (Event_Dist_Speed*1000/5280)/(EL1_Seconds + (EL1_Minutes + EL1_Hours*60)*60) ' if feet distance base
if Event_Dist_Measure = 1 then Event_Dist_Speed = Event_Dist_Speed*100 /(EL1_Seconds + (EL1_Minutes + EL1_Hours*60)*60)/100 ' if meters distance base
if Event_Dist_Measure > 1 then Event_Dist_Speed = Event_Dist_Speed*1000 /(EL1_Seconds + (EL1_Minutes + EL1_Hours*60)*60) ' if Miles or KM distance base
' HSEROUT [" hour reading Event_Dist_Speed = ",dec Event_Dist_Speed ,10,13] ' debug
return
'------------------------------------------------------------------
Show_Speed_Value:
gl_x = 0
gl_y = 48
gl_k = 0
for gl_k = 0 to 7
lookup gl_k,[" x.xx"],Sml_font ' 8 chrs
gosub Get_Sml_font ' Get Font in K9_Fonts_banners.bas
gl_x = gl_x+8
next gl_k
gl_x = 0 ' puts 5 digits of speed 00000.xx
g_num = Event_Dist_Speed /100 ' get the base value 00000.xx
gosub Sml_put_5dig
gl_x = 48 ' put first 2 digits of speed xxxxx.00
g_num = Event_Dist_Speed
gosub Sml_put_2dig
return
varable ranges information
Event_Dist_Speed input = 1 - 4096
time = combined values of EL1 varables - time range = 1sec - 8 days ' note days varable not used as yet , base time calculations based on secs
expect that if hours >18 then the secs will be droped and time caclulation base of mins - not tested yet
looking at the Nmath caclualtions
can a math action be done directly without copy a pbp var to a Pvar first ?
A var byte
Tmp32bit_1 var byte[PRECISION]
Tmp32bit_2 var byte[PRECISION]
Result var byte[PRECISION]
eg - direct method
@ MATH_ADD A, Tmp32bit_2, Result ; A+B =Res
or do i always need to get the standard PBP var byte into a Pvar before the math calculation
eg
@ MOVE?BP A , Tmp32bit_1 ' copy byte PBP to Pvar
@ MATH_ADD Tmp32bit_1, Tmp32bit_2, Result ; A+B =Res
cheers
sheldon
re reading the post make it clearQuote:
DT - ALL math done with these routines are done at the PRECISION level, and all variables used with the MATH functions must be (PRECISION) bytes in length.
well i ended up changing all the posted code that needed the long varable to work out speed to Nbit math
it took some work time ,but the rewards are there in size of the reduced compile size - in my case i saved 8.5k over using longs
although i needed only 1 long varable - the speed value - selecting longs added 10.5k to compile size as soon as you tick the box , and that is a very big overhead when flash space is very tight
Nbit math has it high overheads as well - the include is compiled about 700bytes , but the real overhead is in having to use multi 32bit PRESISON varables( 4 were needed) to do the step by step math operations that can be avoided when using longs , as a result more ram space is used , and it is noticeably slower than using longs when showing the results, even when at 64Mhz.
Also having to do multi divides , the separate remainder value needs to be reincorporated into any following math which adds extra code and where possible should be avoided until you need the result reading back into PBP
anyone having to add longs , where only1 or 2 longs may be need should look at Nbit math as a possible alternative , more so when flash space is tight and longs are an expensive overhead in compile space.
cheers
Sheldon