Code in PBPPI18L.LIB, can I ?


+ Reply to Thread
Results 1 to 9 of 9
  1. #1

    Default Code in PBPPI18L.LIB, can I ?

    Trying to have ARRAYREAD read more than 255 chars and in LIB, R6, the max char counter is word and only used as byte for max parse.
    Would changing the DECREMENT to 16 bit work without messing up something ?


    ArrayRead in LIB 18L
    Code:
    ;****************************************************************
    ;* ARRAYREAD  : Read char from array                            *
    ;*                                                              *
    ;* Input      : R5 = pointer to next char in array              *
    ;*            : R6 = number of chars left in array (timeout)    *
    ;* Output     : W                                               *
    ;*                                                              *
    ;* Notes      : C clear if timed out.                           *
    ;****************************************************************
        ifdef ARRAYREADTO_USED
      LIST
    ARRAYREADTO movf R6, F        ; Check for no chars left in array
        bcf    STATUS, C    ; Preset for timed out (C clear)
        bz    arrayreaddone    ; No chars left
        decf    R6, F        ; Count down the characters left and fall through to ARRAYREAD
      NOLIST
    ARRAYREAD_USED = 1
        endif

    Code to DECREMENT 16 bit val,
    Code:
    The Decrement of a 16 Bit value isn't quite so simple: 
    
    CODE
    movf Reg, f ;Set "Z" if LOW "Reg" == 0 btfsc STATUS, Z decf Reg + 1, f ; If Low byte is Zero, Decrement High decf Reg, f
    To make count up to 16bit
    Code:
      To make count up to 16bit
      ifdef ARRAYREADTO_USED LIST ARRAYREADTO movf R6, F ; Check for no chars left in array bcf STATUS, C ; Preset for timed out (C clear) bz arrayreaddone ; No chars left movf R6, f ; Set "Z" if LOW "Reg" == 0 btfsc STATUS, Z decf R6 + 1, f ; If Low byte is Zero, Decrement High decf R6, f NOLIST ARRAYREAD_USED = 1 endif
    I want to check with experts before I screw things up.
    Thanks
    Don
    amgen

  2. #2

    Default Re: Code in PBPPI18L.LIB, can I ?

    Are you even allowed to reply to your own thread. Seems like talking to yourself..Oh well....

    Tried successfully to make MAX chars to word, although all you can have 500, 1000 or 2000 array depending on ram (I think),

    Code:
    ;****************************************************************
    ;* ARRAYREAD  : Read char from array                            *
    ;*                                                              *
    ;* Input      : R5 = pointer to next char in array              *
    ;*            : R6 = number of chars left in array (timeout)    *
    ;* Output     : W                                               *
    ;*                                                              *
    ;* Notes      : C clear if timed out.                           *
    ;****************************************************************
        ifdef ARRAYREADTO_USED
      LIST
    ARRAYREADTO movf R6, F        ; Check for no chars left in array
        bcf    STATUS, C       ; Preset for timed out (C clear)
        btfsc STATUS, Z
        movf  R6+1, F
        bz    arrayreaddone    ; No chars left
        
           movf   R6, F           ; Set "Z" if LOW "Reg" == 0
    btfsc  STATUS, Z 
       decf  R6+1, F       ; If Low byte is Zero, Decrement High
         decf    R6, F           ; Count down the characters left and fall through to ARRAYREAD
      NOLIST
    ARRAYREAD_USED = 1
        endif
    
    Code:
    arrayread arr1,500,done,[wait("123qwe")]
    Don
    (does anyone see redundent code ?)

  3. #3
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default Re: Code in PBPPI18L.LIB, can I ?

    Well, I don't see redundant code. But there's probably not enough code.
    I was running it in proteus and found that it stops reading the array whenever a borrow occurs from the high byte of R6.

    At points like 1023, 767, 511, 255 bytes remaining, it exits the ARRAYREAD.

    It uses the carry flag (STATUS,C) to indicate the "Timeout", which should only be cleared when both bytes are 0.

    HTH,
    DT

  4. #4

    Default Re: Code in PBPPI18L.LIB, can I ?

    Preface...... I think,

    Max readarray would/could TRY to be 65K, (word)...... too long for any possible array to read in PIC.
    So, is your check looping thru 64KB ??? (I assssume no one wants to parse flash)

    example of my code
    Code:
    array1Test:    ' arr1 has INDX chars that is < ARR1[declared legnth]
    Flag1=0
    arrayread arr1,INDX,done,[wait("1qwe")]:Flag1=1 'found match
    done:      'no match
    My little array is 1000, and the arrayread matched the match anywhere from begining to the end.
    But, I was wondering if a "MATCH-TO-EXIT" compare char code, could be added. Like arraywrite, then tested on each pass, without extensive code addition.

    Then it would be;
    ARRAYREAD array_to_read, max_legnth, compare_char_to_exit, escape_labl[.....xyz....]

    As you stated somewhere, array read & write is making string usage much more practical.
    Don

  5. #5

    Default Re: Code in PBPPI18L.LIB, can I ?

    forget misinterpreted last post,
    not sure if you saw,
    In second post I had added the check for 16 bit =0,at top of routine, few lines asm for that
    Code:
     LIST
    ARRAYREADTO movf R6, F                       ; Check for no chars left in array    hi & low R6
                         bcf STATUS, C                   ; Preset for timed out (C clear)   
                         btfsc STATUS, Z          ; Set "Z" if LOW "Reg" == 0
                         movf  R6+1, F    
                         bz    arrayreaddone               ; No chars left
                         movf   R6, F                   
                btfsc  STATUS, Z      ;decrement high and low
               decf  R6+1, F         ;If Low byte is Zero, Decrement High
                          decf    R6, F                          ; Count down the characters left and fall through to ARRAYREAD  
    
    NOLISTARRAYREAD_USED = 1    
    endif
    hard to format text in code window.

    Don
    Last edited by amgen; - 28th September 2011 at 19:52.

  6. #6
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default Re: Code in PBPPI18L.LIB, can I ?

    OK, and you can forget my misinterpreted last post too.
    After further testing, your changes do work as advertised. My test was flawed.

    Back to the redundant code question, I think you can save 1 WORD by changing the second part to ...
    Code:
    ;        movf   R6, F
            decf    R6, F          ; Count down the characters left and fall through to ARRAYREAD  
            btfss  STATUS, C       ; If Low byte borrowed
            decf  R6+1, F          ; Decrement High
    It's not much, but ...
    Last edited by Darrel Taylor; - 29th September 2011 at 00:37.
    DT

  7. #7
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default Re: Code in PBPPI18L.LIB, can I ?

    Don,

    Would you like melabs to include your changes in the next update to PBP3?
    DT

  8. #8

    Default Re: Code in PBPPI18L.LIB, can I ?

    By all means,
    I would feel honored.

    Don

  9. #9
    Join Date
    Mar 2005
    Location
    CROATIA
    Posts
    38

    Default Re: Code in PBPPI18L.LIB, can I ?

    Hi, I just seen this post, but i already post my problem regarding array.0(word-sized-variable)
    as this isue is similar for reading, can someone give me hint how can we patch writing routine
    to have array.0(word-sized-variable) working, as now only byte size index works....

    regards, & thenx for any kind oh help

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts