To use this file copy and paste this:    // #URL-lib "http://pin1.org/forthlib/flb/IASI/IASI-L-a.flb"   into BV Terminal 3 or here to download.

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // IASI interface // This is the IASI kibrary for use with all IASI devices, these // are normally BV41xx numbered devices. // NOTE when using these words the IASI device needs // by default a CR (13 emit1) sending to terminate // a command, this tells the IASI to go off and process // the command. // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// HISTORY: // Mar 2008 * replaced [char] : hold with 58 hold, limitation of BVT

// CONSTANTS: // the following constants are for setting the baud rate of UART1 // it will default to 9600, a higher baud rate will not necessarily // make the device go faster &E0010000 constant U1DLL &E0010004 constant U1DLM &E001000C constant U1LCR


Full Contents of File

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// IASI interface
// This is the IASI kibrary for use with all IASI devices, these
// are normally BV41xx numbered devices.
// NOTE when using these words the IASI device needs
// by default a CR (13 emit1) sending to terminate
// a command, this tells the IASI to go off and process
// the command.
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// HISTORY:
// Mar 2008 * replaced [char] : hold with 58 hold, limitation of BVT

// REQUIRED:
// #URL-lib "http://pin1.org/forthlib/flb/General/soft1.flb"
//

// CONSTANTS:
// the following constants are for setting the baud rate of UART1
// it will default to 9600, a higher baud rate will not necessarily
// make the device go faster
&E0010000  constant  U1DLL
&E0010004  constant  U1DLM
&E001000C  constant  U1LCR

// *******************************************************
// History:
// Feb 2007 Removed sign from iu. to stop & being
// sent to the UART1
// March 2007 Updated FOR, NEXT loops for ANSI ver 0.7 code
// removed until0
// Nov 2007 Use of #Library
// *******************************************************

// Communication set up for UART1
// set baud rate with 1 stop and 8 data
// no parity
: baud1  { rate --- }
        rate  16  *  10  / // multiply rate by 1.6
        PCLK  swap  / // divide by PCLK
        5  +  10  / // round up and div by 10
        256  u/mod
        &83  U1LCR  !  // 1 stop 8 bits
        U1DLM  !          // high divisor
        U1DLL  !          // low devisor
        &3  U1LCR  !    // DLAB=0, 1 stop 8 data
;       

// returns baud rate for device 1
// ( --- rate )
: baud1@
        &83  U1LCR  !  // access to U1DLM,LL
        U1DLM  @          // high divisor
        256  *
        U1DLL  @          // low devisor
        +
        &3  U1LCR  !    // DLAB=0, 1 stop 8 data
        // now calculate from these, baud rate
        16  *  pclk  swap  u/mod swap drop
;       

// used for terminating a command, typical use is
// after sending command, example i.' BT"fred"' cr1
: cr113  emit1  ;             

// gets a key form UART1 and will time out
// if no key is available. This saves complex
// code using key1? and prevents system
// crashing, set for time out of 50ms.
// It also has another purpose in that it will wait for a
// device to respond to a command
// meant for ASCII, return 0 if not valid
// ( --- r-val )
: i-in
        0 
        50
        for
                key1?
                if
                        drop
                        key1
                        leave
                then
        1  ms       
        next                                 
;

// prints contents of uart1 buffer if any
// i-buff-dot
// ( --- )
: i-buff.
        begin
                i-in 
                dup 
                if 
                        emit 
                        -1            // dont quit loop
                then
        0=  until
;

// clear buffer contents, does not use
// i-in as this simply needs clearing
// ( --- )
: i-cbuff
        begin
                key1?  if  key1  drop  then
                key1?
        0=  until
;

// Send string to IASI device using UART1
// addr is the address of a 0 terminated string
// max string length 255 chars
: stype1 { addr --- }
        addr  255  +          // end
        addr                      // start
        do
                i  c@  0= 
                if 
                        leave
                else
                        i  c@  emit1         
                then
        next       
; 

// This is the same as u. but uses emit1 and
// stype1 to print to UART1
// prints n as ASCII
// ( n --- )
: iu.<#  #s  #>  stype1  ;               

// This is exactly the same as s" except that
// it uses ' to make it easier for sending
// string commands to IASI devices
// ( -- )
: ,'
int addr1  len
        39  word  dup  =>  addr1        // parse until '
        length  =>  len                      // length
        addr1  here  len  move        // ad1, ad2, len -- to dic
        len  allot                            // move pointer
        0  c,                                      // add string terminator
        align
        1  >in  +!  // only needed when using '
;                             
                       

// specifically for sending text to IASI devices
// uses ' instead of " to make it easier for string commands
// ( -- )
// us in the form i.' BT"Fred"'
: I.'
[']  lit  ,  // compile LIT
here          // address for type
16  +  ,          // offset past STYPE + BRANCH + branch-address
[']  stype1  ,    // compile type
[']  branch  ,  // branch round string
here                // leave address to store fwd br to
0  ,                  // to be resolved after string
,'                    // compile string to dic
here  swap  !      // resolve branch
;  immediate

// simply sends 4 cr to device to establish baud rate
// ( --- )
: i-autobaud
        4  for 
                cr1  100  ms 
        next
        100  ms
        i-cbuff          // clear buffer
;

// ---------- command line words for debugging ------ //
//
// detect configuration
// x = 0 if no response
// 241 if inverted
// 76 if not inverted
// ( --- x)
: i-det
        i-autobaud 
        cr1                          // send cr and see what comes back
        i-in                        // get first char
        i-cbuff                  // clear buffer
;

// detects if device is in inverted mode or not
// as i-det, but this has print out
: i-det.     
        i-det
        dup  214  =  if  ."  Inverted  mode"  cr  then
        dup  76  =  if  ."  Non-inverted  mode"  cr  then
        dup  0=  if  ."  No  response"  cr  then
        drop
;       
// initialises a device that has been configured
// for autobaud, reports success
: i-init
        i-cbuff              // clear buffer
        5  for
            i    .              // try 5 times
            i-det                  // this does work
            dup  214  =
            if
                ."  Device  initialised,  inverted  mode"
                leave
            then
            76  =   
            if
                ."  Device  initialised,  non-inverted  mode"
                leave
            then                   
        next
;                               

// Software factory reset
: i-zf
        ."  Wait"
        i-cbuff                  // just in case
        i-autobaud
        i.'  :00zf'  cr1                // factory defaults, type 1
        46  emit                  // wait..
        500  ms
        i-autobaud
        i.'  zf'  cr1                    // factory defaults, type 2
        46  emit                  // wait..
        500  ms       
        i-autobaud
;       
// device configure
// n = factory configuration 0 to 5
// can use i-zc before this if required
// use: 3 i-config
// ( n --- )
: i-config
        i.'  ZC'
        &30  +    emit1                  // convert stack value to ascii
        i.'    -r'
        cr1
        500  ms
        i-autobaud 
        cr  ."  Device  reports  "  i-det.     
;       

// -- multiple display addressing ---
// emits ":xx" to form the address
// numerical addresses only
// ( address ---)
: i-address           
        <#  #  #  58  hold  #>  stype1    // :addr
;

// This will set a device, using config slot 5
// to give null response at 9600 baud. It is a
// safe option. Supply address for device, must be
// in range 1-99. TEST with i-init, should return
// no response
// NOTE commands will still return values, there is simply
// no prompt.
// ( address --- )
: i-multi
        ."  Wait."
        i.'  ZA'          // set address
        <#  #  #  #>
        stype1            // send as ASCII
        cr1    100  ms              // terminate address command
        i.'  ZB0'  cr1    100  ms    // baud rate 9600
        i.'  ZD0'  cr1    100  ms    // no error reporting
        i.'  ZC5  -w  nnnnnnn'  cr1  // set no response
        46  emit
        500  ms            // device needs to reset
        5  for              // wait for response
                i-det
                0  >  if  leave  then
        next       
        100  ms
        i.'  ZC5  -r'  cr1  // set it
;       

// used for interfacing with device, see i-send
// and i-get, this word is not used on its own
// it gets and sends to UART1 the text in the TIB
// which is the text following the word
: (i-ipb)     
        i-cbuff          // clear ipb
        13  word          // get i/p from stream
        stype1  // send word to uart1
        cr1                  // get IASI to process it
;

// utility for sending and receiving from UART2
// sends text following word, must all be on 1 line
// use: I-SEND bt"hello"
// must be a space following the D of send
// ( --- )
: i-send
        (i-ipb)
        i-buff.          // print result
        cr
;

// for input devices will get the response
// from the command and return it on
// the stack. This expects 2 bytes
// use: i-get2 va*
// ( --- val)
: i-get2
        (i-ipb)           // get and send command following word
        i-in  256  *
        i-in  +
;