• AVR Freaks

Hot!Accessing fixed text.

Author
peterg1000
Super Member
  • Total Posts : 203
  • Reward points : 0
  • Joined: 2009/01/29 13:07:52
  • Location: Flamstead, Herts, UK
  • Status: offline
2020/10/25 03:05:11 (permalink)
0

Accessing fixed text.

My latest project uses a 4x20 LCD  to show different lines of fixed text.  These are stored in programme space (using "asciz") and accessed using "#psvpage" and "psvoffset" to transfer the text into a RAM buffer before processing to write to the display (in 4 bit nibbles). 
I've written a very long winded test routine to prove the principle, and wondered if there was a more elegant way of achieving the same ends?
 
; ; ; ; ; ; ; ; ; ; ; ; 
; File: Main.s *
; First issue 22/10/20 *
; Target: PIC24FJ64KA202 *
; IDE: MPLABX V5.40 *
; Compiler: XC16 v1.41 *
;---------------------------------------------------------------------------------------*
;Revision History: *
;First Issue 24/10/2020 *
; *
;=========================================================================================
; Description: Text string recovery for 4 x 20 lcd display *
;=========================================================================================
 .nolist
 .include "..\inc\p24FJ64GA202.inc"
 .list
 .eject
 .psize 80,120
;
;=========================================================================================
; Note - stack starts IMMEDIATELY after Ascii buffer. Any buffer overrun is disaster!!
 .data
 .section Text_buffer
RS232S: .space 38 ; Test buffer for 40 characters
RS232F: .space 2 ;
Messg: .space 2 ; Message number requiring transmission
;
;=========================================================================================
 .text
 .section Start, code ;
;
;-----------------------------------------------------------------------------------------
 .global __reset
;
;-----------------------------------------------------------------------------------------
__reset:
 mov #__SP_init,w15 ; Initalize the Stack Pointer
 mov #__SPLIM_init,w0 ; Initialize the Stack Pointer Limit Register
 mov w0,SPLIM ; Values are calculated by linker
 nop ; Add NOP to follow SPLIM initialization
;
; call _PIC_init ; Initialize this PIC
; call _wreg_init ; Set all working registers to zero
; call _ram_init ; Ensure all working RAM cleared
;
; Function test - to recover characters from ASCII string(s) in programme memory
; space and transfer to RS232 transmit buffer in RAM.
Init_reg:
 mov #psvpage(Text_00),w1 ; Fetch PSVPAG page containing "Text_00"
 mov w1,DSRPAG ; Save to SFR
 mov Messg,w0 ; Fetch message number
 call Calc_offset ; Calculate offset and exit with pointer in (w2)
 mov #RS232S,w3 ; Set pointer (w3) to start of RS232 output buffer
 mov #0x00FF,w4 ; Mask for byte read
;
; Fetch character string and transfer to RS232 output buffer until null found.
GetChar:
 mov.b [w2++],w0 ; Get byte and post inc pointer in w3
 mov.b w0,[w3++] ; Set byte and post inc pointer
  and w0,w4,w0 ; Set flags on latest character
 bra NZ,GetChar ; Loop until null found
 nop ; Can break here for functionality test
;
;-----------------------------------------------------------------------------------------
Loop: nop
 nop
 nop
 bra Loop
;
;=========================================================================================
; Subroutines
;-----------------------------------------------------------------------------------------
Calc_offset:
 bra w0 ; Access jump table
;
 bra M00 ;
 bra M01 ;
 bra M02 ;
 bra M03 ;
 bra M04 ;
 bra M05 ;
 bra M06 ;
 bra M07 ;
 bra M08 ;
 bra M09 ;
 bra M10 ;
 bra M11 ;
 bra M12 ;
 bra M13 ;
 bra M14 ;
 bra M15 ;
;
;-----------------------------------------------------------------------------------------
M00: mov #psvoffset(Text_00),w2 ; Set pointer (w2)
 return ;
M01: mov #psvoffset(Text_01),w2 ; Set pointer (w2)
 return ;
M02: mov #psvoffset(Text_02),w2 ; Set pointer (w2)
 return ;
M03: mov #psvoffset(Text_03),w2 ; Set pointer (w2)
 return ;
M04: mov #psvoffset(Text_04),w2 ; Set pointer (w2)
 return ;
M05: mov #psvoffset(Text_05),w2 ; Set pointer (w2)
 return ;
M06: mov #psvoffset(Text_06),w2 ; Set pointer (w2)
 return ;
M07: mov #psvoffset(Text_07),w2 ; Set pointer (w2)
 return ;
M08: mov #psvoffset(Text_08),w2 ; Set pointer (w2)
 return ;
M09: mov #psvoffset(Text_09),w2 ; Set pointer (w2)
 return ;
M10: mov #psvoffset(Text_10),w2 ; Set pointer (w2)
 return ;
M11: mov #psvoffset(Text_11),w2 ; Set pointer (w2)
 return ;
M12: mov #psvoffset(Text_12),w2 ; Set pointer (w2)
 return ;
M13: mov #psvoffset(Text_13),w2 ; Set pointer (w2)
 return ;
M14: mov #psvoffset(Text_14),w2 ; Set pointer (w2)
 return ;
M15: mov #psvoffset(Text_15),w2 ; Set pointer (w2)
 return ;
;
;=========================================================================================
 .end
;=========================================================================================




Apologies for formatting - screwed by posting
 
 
#1

18 Replies Related Threads

    T Yorky
    Super (Thick) Member
    • Total Posts : 573
    • Reward points : 0
    • Joined: 2012/08/28 02:07:35
    • Location: UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/25 09:35:49 (permalink)
    4.67 (3)
    I suggest using 'C'.
    The compiler is free. Why subject yourself to all that hurt.
    T Yorky
    #2
    peterg1000
    Super Member
    • Total Posts : 203
    • Reward points : 0
    • Joined: 2009/01/29 13:07:52
    • Location: Flamstead, Herts, UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/25 15:42:21 (permalink)
    0
    Sorry T Yorky - don't "do" C!! 
     
    Enjoy programming in assembler having been a hardware and systems engineer throughout my working life. 
    I started with Intel 4004, 8008 and 8080's when they were first introduced - in the good old days.grin: grin  
     
    No IDE's  or ICE's in those early days, had to make ones own debug tools and enter programmes (in assembler!) via switches or eventually using a teletype with paper tape. It was a great time - every step forward was an adventure !!
    #3
    ric
    Super Member
    • Total Posts : 28941
    • Reward points : 0
    • Joined: 2003/11/07 12:41:26
    • Location: Australia, Melbourne
    • Status: offline
    Re: Accessing fixed text. 2020/10/25 15:57:49 (permalink)
    5 (2)
    I'm not far behind you, started on Z80s in the 1970s, but I saw the light, and shifted to C (Hitech C for PIC16) about ten years ago, after 12 years of pure assembly on the PIC16 family, and I'm glad I did.
    You do need a good understanding of assembly code to get the most out of it, but embedded compilers are very close to "bare metal", and take care of all the boring housekeeping duties for you. It's easy to use some embedded assembler anywhere you need some raw speed.
     

    I also post at: PicForum
    Links to useful PIC information: http://picforum.ric323.co...opic.php?f=59&t=15
    NEW USERS: Posting images, links and code - workaround for restrictions.
    To get a useful answer, always state which PIC you are using!
    #4
    1and0
    Access is Denied
    • Total Posts : 11501
    • Reward points : 0
    • Joined: 2007/05/06 12:03:20
    • Location: Harry's Gray Matter
    • Status: offline
    Re: Accessing fixed text. 2020/10/25 16:06:55 (permalink)
    0
    There are three methods to access data in program memory. Read the "Accessing Data in Program Memory" section in your XC16 Assembler User's Guide.
     
    #5
    dan1138
    Super Member
    • Total Posts : 3990
    • Reward points : 0
    • Joined: 2007/02/21 23:04:16
    • Location: 0
    • Status: offline
    Re: Accessing fixed text. 2020/10/25 16:47:51 (permalink)
    0
    @peterg1000,

    In the code you posted there is a comment that identifies the target controller as "PIC24FJ64KA202".

    I cannot find this part in the Microchip web site.

    At a guess I'm going to show you an example for the PIC24FJ64GA202:
        .nolist 
    .title " Sample PIC24FJ64GA202 Assembler Source Code"
    .sbttl " PORTB bit pulser"
    .psize 1000,132
    .list
    ;
    ; File: main.S
    ; Target: PIC24FJ64GA202
    ; IDE: MPLABX v5.40
    ; Compiler: XC16 v1.60
    ;
    ; Description:
    ; This is a simple "hello world" demo
    ; it pulses the bits on PORTB from
    ; bit 0 to bit 15.
    ;
    ; PIC24FJ64GA202
    ; +-------------------:_:-------------------+
    ; ICD_VPP --> : 1 MCLR VDD 28 : <-- 3v3
    ; < > : 2 RA0/AN0 VSS 27 : <-- GND
    ; < > : 3 RA1/AN1 AN9/RP15/RB15 26 : < >
    ; < > : 4 RB0/RP0/PGD1/AN2 AN6/RP14/RB14 25 : < >
    ; < > : 5 RB1/RP1/PGC1/AN3 AN7/RP13/RB13 24 : < >
    ; < > : 6 RB2/RP2/SDA2/AN4 AN8/RP12/RB12 23 : < >
    ; < > : 7 RB3/RP3/SCL2/AN5 PGC2/RP11/RB11 22 : <*>
    ; - > : 8 VSS PGD2/RP10/RB10 21 : <*>
    ; < > : 9 RA2/OSCI VCAP 20 : <-- 10uF
    ; < > : 10 RA3/OSCO VBAT 19 : <-- 3v3
    ; -*> : 11 RB4/RPI4/SOSCI SDA1/RP9/RB9 18 : < >
    ; <*> : 12 RA4/SCLKI/SOSCO SCL1/RP8/RB8 17 : <*>
    ; 3v3 --> : 13 VDD RP7/RB7 16 : <*>
    ; ICD_PGD <*> : 14 RB5/RP5/PGD3 PGC3/RP6/RB6 15 : <*> ICD_PGC
    ; +-----------------------------------------+
    ; DIP-28
    ; * Indicates 5.5V tolerant input pins.
    ;
    ; Note: RB4 is an input only GPIO.
    ;
    ;
    ; Because Microchip hates all assembly language programmers the
    ; configuration words are initialized in a C language source
    ; file. For this project that file name is: config.c
    ;
    .include "p24FJ64GA202.inc"
    .text

    ; ============================================================================
    ; This is the Power-On-Reset entry point
    ;
    .global __reset
    __reset:
    disi #16383 ; disable all interrupts
    clr IEC0 ; Turn off all interrupt sources
    clr IEC1
    clr IEC2
    clr IEC3
    clr IEC4
    clr IEC5
    clr IEC6
    clr IEC7
    disi #0
    mov #__SP_init,w15 ; Initalize the Stack Pointer
    mov #__SPLIM_init,w0 ; Initialize the Stack Pointer Limit Register
    mov w0, SPLIM
    nop ; Add NOP to follow SPLIM initialization
    goto main

    ; ============================================================================
    ; Begin main application
    ;
    main:
    call _PIC_init ; Initialize this PIC

    mov #0x0000,w0 ; Set all of PORTB pins as outputs
    mov w0,TRISB
    ;
    ; Do a simple "hello world" bit pulser
    ;
    ; Note: For the PIC24FJ64GA202 RB4 is an input only GPIO pin.
    ; You will not see this pin go high on a real part.
    ; Also RB5 and RB6 are used by the ICD so these outputs
    ; will no go high when in a denug session on a real part.
    ;
    mov #0x01,w5
    HelloLoop:
    mov w5,LATB ; Simulator bug RB12 does not go high.
    call delay
    rlnc w5,w5
    mov #0,w0
    call GetMessage
    mov #1,w0
    call GetMessage
    bra HelloLoop
    ; ============================================================================
    ; Delay loop
    ;
    delay:
    mov #0x7fff,w6
    dloop:
    dec w6,w6
    cp0 w6
    bra nz,dloop
    return
    ; ============================================================================
    ; Initialize W registers to zero
    ;
    _wreg_init:
    clr w0
    mov w0,w14
    repeat #12
    mov w0,[++w14]
    clr w14
    return
    ; ============================================================================
    ; Initialize this PIC
    ;
    _PIC_init:
    mov #0,w0
    mov.w w0,CLKDIV ; Set for default clock operations and FRC at 8MHz

    bset INTCON1,#NSTDIS ; Disable interrupt nesting

    mov #0x0000,w0
    mov.w w0,ANSA ; Set for digital I/O
    mov.w w0,ANSB

    return
    ; ============================================================================
    ; Setup the interrupt vectors
    ; for system traps.
    ;
    .global __OscillatorFail
    .global __AddressError
    .global __StackError
    .global __MathError

    .global __AltOscillatorFail
    .global __AltAddressError
    .global __AltStackError
    .global __AltMathError


    .text

    ; Default Exception Vector handlers if ALTIVT(INTCON2<15>) = 0

    ; Oscillator Fail Trap
    __OscillatorFail:
    btsc INTCON1, #OSCFAIL
    bra $-4
    nop
    bclr INTCON1, #OSCFAIL
    retfie

    ; Address Error Trap
    __AddressError:
    btsc INTCON1, #ADDRERR
    bra $-4
    nop
    bclr INTCON1, #ADDRERR
    retfie

    ; Stack Error Trap
    __StackError:
    btsc INTCON1, #STKERR
    bra $-4
    nop
    bclr INTCON1, #STKERR
    retfie

    ; Math Error Trap
    __MathError:
    btsc INTCON1, #MATHERR
    bra $-4
    nop
    bclr INTCON1, #MATHERR
    retfie


    ; Alternate Exception Vector handlers if ALTIVT(INTCON2<15>) = 1

    ; Alternate Oscillator Fail Trap
    __AltOscillatorFail:
    btsc INTCON1, #OSCFAIL
    bra $-4
    nop
    bclr INTCON1, #OSCFAIL
    retfie

    ; Alternate Address Error Trap
    __AltAddressError:
    btsc INTCON1, #ADDRERR
    bra $-4
    nop
    bclr INTCON1, #ADDRERR
    retfie

    ; Alternate Stack Error Trap
    __AltStackError:
    btsc INTCON1, #STKERR
    bra $-4
    nop
    bclr INTCON1, #STKERR
    retfie

    ; Alternate Math Error Trap
    __AltMathError:
    btsc INTCON1, #MATHERR
    bra $-4
    nop
    bclr INTCON1, #MATHERR
    retfie
    ;
    ; Look up message and copy to buffer
    ;
    ; Input: w0 = message number
    ;
    ; Output: Message copied to buffer
    ;
    #define LCD_BUFFER_SIZE (40)
    GetMessage:
    mov #LCD_Message,w3
    mov.b w0,[w3]
    mov #LCD_Buffer,w3
    mov #LCD_BUFFER_SIZE,w1
    ClearLoop:
    clr.b [w3++]
    dec w1,w1
    bra NZ,ClearLoop
    mov #tblpage(MessageHandles),w1
    mov w1,_TBLPAG
    mov #tbloffset(MessageHandles),w1
    sl w0,w0 ; Convert message number to offset in message handles
    add w0,w1,w1 ; Add offset to pointer to message handles
    tblrdl.w [w1],w1
    mov #LCD_Buffer,w3
    CopyLoop:
    tblrdl.b [w1++],w2
    cp0 w2
    bra Z,CopyLoopExit
    mov.b w2,[w3++]
    bra CopyLoop
    CopyLoopExit:
    return
    ;
    ; LCD static messages
    ;
    MessageHandles:
    .word Message0
    .word Message1

    Message0: .ascii "This is ASCII text\0"
    Message1: .ascii "Second message\0"
    ;
    ; Data space for buffer
    ;
    .data
    .global LCD_Message
    .global LCD_Buffer
    ;
    LCD_Message:
    .space 1
    LCD_Buffer:
    .space LCD_BUFFER_SIZE
    .end

    Attached is the complete project I used to tested this.
    #6
    dan1138
    Super Member
    • Total Posts : 3990
    • Reward points : 0
    • Joined: 2007/02/21 23:04:16
    • Location: 0
    • Status: offline
    Re: Accessing fixed text. 2020/10/25 19:28:41 (permalink)
    0
    This is how I did it using the PSV window:
    ;
    ; Look up message and copy to buffer
    ;
    ; Input: w0 = message number
    ;
    ; Output: Message copied to buffer
    ;
    #define LCD_BUFFER_SIZE (40)
    GetMessage:
        mov     #LCD_Message,w3
        mov.b   w0,[w3]
        mov     #LCD_Buffer,w3
        mov     #LCD_BUFFER_SIZE,w1
    ClearLoop:
        clr.b   [w3++]
        dec     w1,w1
        bra     NZ,ClearLoop
        mov     #psvpage(MessageHandles),w1
        mov     w1,_DSRPAG
        mov     #psvoffset(MessageHandles),w1
        sl      w0,w0       ; Convert message number to offset in message handles
        mov.w   [w1+w0],w1
        
        mov     #LCD_Buffer,w3
    CopyLoop:
        mov.b   [w1++],w2
        cp0     w2
        bra     Z,CopyLoopExit
        mov.b   w2,[w3++]
        bra     CopyLoop
    CopyLoopExit:
        return
    ;
    ; LCD static messages
    ;
    ; WARNING:  This code uses the PSV window.
    ;
    ;           The PSV windows spans 32768 bytes, the
    ;           result is the the entire block of handles
    ;           and message text must fit in one of two
    ;           address ranges in the PIC23FJ64GA202 code
    ;           space: 0x0000 to 0x7FFF, or 0x8000 to 0xABF7.
    ;
    ;           This table must not span these two blocks.
    ;
    MessageHandles:
        .word  psvoffset(Message0)
        .word  psvoffset(Message1)

    Message0: .ascii "This is ASCII text\0"
    Message1: .ascii "Second message\0"
    ;
    ; Data space for buffer
    ;
        .data
        .global LCD_Message
        .global LCD_Buffer
    ;
    LCD_Message:
        .space  1
    LCD_Buffer:
        .space  LCD_BUFFER_SIZE
        .end

    #7
    peterg1000
    Super Member
    • Total Posts : 203
    • Reward points : 0
    • Joined: 2009/01/29 13:07:52
    • Location: Flamstead, Herts, UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 02:25:55 (permalink)
    0
    @dan1138
    Stupid typo - thanks for pointing it out, at least I got the name of the .inc file correct !  Thank too for the code snippets, looks  much more compact than my brute force effort
     
    @1and0
    Thanks for that - I found the EDS information most confusing though.  I must read it a few more times to see if it gets any clearer.
     
    @ric
    Guess we are what the wizz kids of today would call "The  Ancients"!!  I did once attend a training course on "C", courtesy of my employer, but never had any reason at the time to pursue it further.  At least it provided me with a complementary copy of K & R  - wonderful bedtime reading, can get to sleep in minutes now!!
    #8
    T Yorky
    Super (Thick) Member
    • Total Posts : 573
    • Reward points : 0
    • Joined: 2012/08/28 02:07:35
    • Location: UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 08:17:48 (permalink)
    0
    Hey peter,
    Don't go as far back as that but are those the good old days when if you made a mistake programming a PROM you would have to throw it in the bin? grin: grin
    I understand your 'adventure' approach. Are you intending moving up to the PIC24FJ1024? A whole megabyte of assembly programming !!!! Just teasing.
    Although I am not familiar with your chip just a little snippet of info, some chips have a few nasties in them to do with the instruction set. The C compilers actually avoid these for you, either do not generate the instruction or the instruction sequence. In assembly you have to do this yourself.
    T Yorky.
    #9
    1and0
    Access is Denied
    • Total Posts : 11501
    • Reward points : 0
    • Joined: 2007/05/06 12:03:20
    • Location: Harry's Gray Matter
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 14:44:42 (permalink)
    4 (1)
    Don't go down the C vs ASM hole!!! Just use whatever programming language you're comfortable with and able to get your job and projects done. ;)
    #10
    peterg1000
    Super Member
    • Total Posts : 203
    • Reward points : 0
    • Joined: 2009/01/29 13:07:52
    • Location: Flamstead, Herts, UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 14:48:52 (permalink)
    0
    @ T Yorky
    Think we used UV erasable proms - 1702's. as the main memory.  Can't remember the exact date those appeared, but it must have been in the early 1970's.  RAM chips of 256x8 were the latest must have chips too.
     
    If the programme was wrong then into the UV eraser it went for up to an hour - then into the programmer and finally into the target hardware.
     
    Think I've still got an example of an 8080 based industrial control system among my prized possessions.  I did  all the hardware design personally and wrote a 2 stage bootstrap loader that resided in a 1702 UVPROM.  Going to leave it to a museum when the time comes!!  I like to think I coined the phrase "bootstrap loader" in the early 1970's - delusions of grandeur!!
     
    Thanks for the warning on chip nasties - hope Microchip exposes them in some documentation.
     
    Peter
     
    #11
    dan1138
    Super Member
    • Total Posts : 3990
    • Reward points : 0
    • Joined: 2007/02/21 23:04:16
    • Location: 0
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 15:59:40 (permalink)
    4 (1)
    peterg1000
    Thanks for the warning on chip nasties - hope Microchip exposes them in some documentation.

    Microchip is usually good about documenting core problems in the errata documents of each controller.
     
    Should you persist with assembly language coding for the PIC24 controllers you will need to learn to find all of the errata for the controllers you will be using.
     
    As T Yorky has mentioned some are "extremely nasty".
     
    (Quote from the Monty Python "Crunchy Frog" sketch about the Whizzo Quality Assortment)
    #12
    ric
    Super Member
    • Total Posts : 28941
    • Reward points : 0
    • Joined: 2003/11/07 12:41:26
    • Location: Australia, Melbourne
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 16:17:35 (permalink)
    5 (1)
    They didn't implement the famous HCF (halt and catch fire) instruction did they? ;)
     

    I also post at: PicForum
    Links to useful PIC information: http://picforum.ric323.co...opic.php?f=59&t=15
    NEW USERS: Posting images, links and code - workaround for restrictions.
    To get a useful answer, always state which PIC you are using!
    #13
    1and0
    Access is Denied
    • Total Posts : 11501
    • Reward points : 0
    • Joined: 2007/05/06 12:03:20
    • Location: Harry's Gray Matter
    • Status: offline
    Re: Accessing fixed text. 2020/10/26 17:19:40 (permalink)
    #14
    peterg1000
    Super Member
    • Total Posts : 203
    • Reward points : 0
    • Joined: 2009/01/29 13:07:52
    • Location: Flamstead, Herts, UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/27 02:32:19 (permalink)
    5 (1)
    Ric,  I think you have mild dyslexia - surely it catches fire first!!wink: wink
    #15
    T Yorky
    Super (Thick) Member
    • Total Posts : 573
    • Reward points : 0
    • Joined: 2012/08/28 02:07:35
    • Location: UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/27 03:22:24 (permalink)
    3 (2)
    @peterg1000, I was doing some work for United Utilities about 4 years ago. They had a control system operating one of their water treatment plants that looked as if it was an 8080 based controller. You may consider leaving your unit to them. They need the spares base. I'm sure the people of Bolton will appreciate it. Smile: Smile
    @Ric, always use the HCF instruction without fail, it is generic and works in all microcontrollers. Some of the larger devices have the FFB instruction (Fizzle Flash Bang).
    #16
    dan1138
    Super Member
    • Total Posts : 3990
    • Reward points : 0
    • Joined: 2007/02/21 23:04:16
    • Location: 0
    • Status: offline
    Re: Accessing fixed text. 2020/10/27 18:50:34 (permalink)
    0
    peterg1000
    Ric,  I think you have mild dyslexia - surely it catches fire first!!wink: wink

    You could be right. It's not halted until all of the fan noise stops.
    #17
    peterg1000
    Super Member
    • Total Posts : 203
    • Reward points : 0
    • Joined: 2009/01/29 13:07:52
    • Location: Flamstead, Herts, UK
    • Status: offline
    Re: Accessing fixed text. 2020/10/28 02:40:42 (permalink)
    0
    @T Yorky.
     
    Good grief - if that system system is still working after the best part of 35 years then I must have seriously over designed it !!!!!!  If you still have contacts there, then PM me - I would have no problems passing on useful hardware if it's helpful to them. 
     
    I must admit I don't remember a "Sequel" system being installed near Bolton (or is that the name of the organisation?) - there was at least one installation for SWWA, near Torridge if I recall correctly.
     
    Peter
     
     
     
    post edited by peterg1000 - 2020/10/28 02:46:33
    #18
    Jump to:
    © 2020 APG vNext Commercial Version 4.5