REM **************************************
REM *        32 Channel A/I Card         *
REM *       Demonstration Program        *
REM *            Version 1.0             *
REM *      Copyright (c) June 1999       *
REM *        by George Vastianos         *
REM *  email:robofreak@technologist.com  *
REM * http://members.xoom.com/robofreak/ *
REM **************************************

DECLARE SUB PRINTPAGE ()
DECLARE SUB CARD32AI (COMADDRESS!, CHANNEL!())

START:
 
  DIM CH(0 TO 31)
  COMADDR = &H3F8
  CALL PRINTPAGE

MAINLOOP:
 
  CALL CARD32AI(COMADDR, CH())

  FOR GROUP = 0 TO 3
    FOR GROUPCHANNEL = 0 TO 7
      LOCATE (14 + GROUPCHANNEL), (14 + GROUP * 12)
      CHDATA = CH(GROUP * 8 + GROUPCHANNEL)
      CHDATA$ = RIGHT$(STR$(CHDATA), LEN(STR$(CHDATA)) - 1)
      PRINT STRING$(4 - LEN(CHDATA$), "0") + CHDATA$
    NEXT GROUPCHANNEL
  NEXT GROUP

  INK$ = INKEY$
    IF INK$ = "1" THEN
      LOCATE 20, 63
      PRINT "3F8"
      COMADDR = &H3F8
    END IF
    IF INK$ = "2" THEN
      LOCATE 20, 63
      PRINT "2F8"
      COMADDR = &H2F8
    END IF
    IF INK$ = "3" THEN
      LOCATE 20, 63
      PRINT "3E8"
      COMADDR = &H3E8
    END IF
    IF INK$ = "4" THEN
      LOCATE 20, 63
      PRINT "2E8"
      COMADDR = &H2E8
    END IF
    IF INK$ = CHR$(27) THEN
      COLOR 7, 0, 0
      CLS
      END
    END IF

GOTO MAINLOOP

REM **************************************
REM *        32 Channel A/I Card         *
REM *   CARD32AI Communication Routine   *
REM *      Copyright (c) June 1999       *
REM *        by George Vastianos         *
REM *  email:robofreak@technologist.com  *
REM * http://members.xoom.com/robofreak/ *
REM **************************************
'
SUB CARD32AI (COMADDRESS, CHANNEL())

  DIM CTRLBYTE(0 TO 7)
  CTRLBYTE(0) = 142: CTRLBYTE(1) = 206
  CTRLBYTE(2) = 158: CTRLBYTE(3) = 222
  CTRLBYTE(4) = 174: CTRLBYTE(5) = 238
  CTRLBYTE(6) = 190: CTRLBYTE(7) = 254
 
  FOR CH = 0 TO 7
   
    GOSUB SRSTLO
    GOSUB SCLKLO
    GOSUB SDINLO
   
    FOR BIT = 7 TO 0 STEP -1
     
      IF (CTRLBYTE(CH) AND 2 ^ BIT) = (2 ^ BIT) THEN
        GOSUB SDINHI
      ELSE
        GOSUB SDINLO
      END IF
     
      GOSUB SCLKHI
      GOSUB SCLKLO
   
    NEXT BIT
   
    GOSUB SDINLO
    GOSUB SRSTHI
    GOSUB SRSTLO
   
    CHANNEL(CH) = 0
    CHANNEL(CH + 8) = 0
    CHANNEL(CH + 16) = 0
    CHANNEL(CH + 24) = 0

    GOSUB SCLKHI
    GOSUB SCLKLO

    FOR BIT = 11 TO 0 STEP -1
     
      OUT COMADDRESS + 1, 0
      OUT COMADDRESS + 2, 0
     
      INDATA = INP(COMADDRESS + 6) AND 240
     
      CHANNEL(CH) = CHANNEL(CH) + (((INDATA AND 16) / 16) * (2 ^ BIT))
      CHANNEL(CH + 8) = CHANNEL(CH + 8) + (((INDATA AND 32) / 32) * (2 ^ BIT))
      CHANNEL(CH + 16) = CHANNEL(CH + 16) + (((INDATA AND 64) / 64) * (2 ^ BIT))
      CHANNEL(CH + 24) = CHANNEL(CH + 24) + (((INDATA AND 128) / 128) * (2 ^ BIT))
     
      GOSUB SCLKHI
      GOSUB SCLKLO

    NEXT BIT
     
    CHANNEL(CH) = 4095 - CHANNEL(CH)
    CHANNEL(CH + 8) = 4095 - CHANNEL(CH + 8)
    CHANNEL(CH + 16) = 4095 - CHANNEL(CH + 16)
    CHANNEL(CH + 24) = 4095 - CHANNEL(CH + 24)
   
    GOSUB SRSTHI

  NEXT CH

  GOTO ENDCONV

SRSTLO:
    IF (INP(COMADDRESS + 3) AND 64) = 0 THEN
      OUT (COMADDRESS + 3), INP(COMADDRESS + 3) XOR 64
    END IF
  RETURN

SRSTHI:
    IF (INP(COMADDRESS + 3) AND 64) = 64 THEN
      OUT (COMADDRESS + 3), INP(COMADDRESS + 3) XOR 64
    END IF
  RETURN

SCLKLO:
    IF (INP(COMADDRESS + 4) AND 1) = 0 THEN
      OUT (COMADDRESS + 4), INP(COMADDRESS + 4) XOR 1
    END IF
  RETURN

SCLKHI:
    IF (INP(COMADDRESS + 4) AND 1) = 1 THEN
      OUT (COMADDRESS + 4), INP(COMADDRESS + 4) XOR 1
    END IF
  RETURN

SDINLO:
    IF (INP(COMADDRESS + 4) AND 2) = 0 THEN
      OUT (COMADDRESS + 4), INP(COMADDRESS + 4) XOR 2
    END IF
  RETURN

SDINHI:
    IF (INP(COMADDRESS + 4) AND 2) = 2 THEN
      OUT (COMADDRESS + 4), INP(COMADDRESS + 4) XOR 2
    END IF
  RETURN

ENDCONV:

END SUB

SUB PRINTPAGE
 
  CLS
  COLOR 15, 10, 0
    PRINT "                                                                                ";

  COLOR 0, 10, 0
  FOR COUNT = 1 TO 23
    PRINT "  ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ  ";
  NEXT COUNT

  COLOR 15, 10, 0
  LOCATE 25, 1
    PRINT "   <Esc> Quit ³ <1> COM1:3F8h ³ <2> COM2:2F8h ³ <3> COM3:3E8h ³ <4> COM4:2E8h   ";

  COLOR 0, 7, 0
  FOR COUNT = 2 TO 3
  LOCATE COUNT, 3
    PRINT "°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°";
  NEXT COUNT
  FOR COUNT = 4 TO 9
  LOCATE COUNT, 3
    PRINT "°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°ÛÛ°°°";
  NEXT COUNT
  LOCATE 10, 3
    PRINT "°°°°°°ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ°°°";
  FOR COUNT = 11 TO 12
  LOCATE COUNT, 3
    PRINT "°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°";
  NEXT COUNT
  FOR COUNT = 13 TO 22
  LOCATE COUNT, 3
    PRINT "°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°ÛÛ°°°";
  NEXT COUNT
  LOCATE 23, 3
    PRINT "°°°°°°ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ°°°";
  LOCATE 24, 3
    PRINT "°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°";

  COLOR 14, 1, 0
  LOCATE 3, 7
    PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
  LOCATE 4, 7
    PRINT "³                   32 CHANNEL ANALOG INPUT CARD                  ³"
  LOCATE 5, 7
    PRINT "³               Demonstration Program - Version 1.0               ³"
  LOCATE 6, 7
    PRINT "³           Copyright (c) June 1999 by George Vastianos           ³"
  LOCATE 7, 7
    PRINT "³                 email:robofreak@technologist.com                ³"
  LOCATE 8, 7
    PRINT "³                http://members.xoom.com/robofreak/               ³"
  LOCATE 9, 7
    PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"

  LOCATE 12, 7
    PRINT "ÚÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
  LOCATE 13, 7
    PRINT "³ CH ³ DATA ³ CH ³ DATA ³ CH ³ DATA ³ CH ³ DATA ³                 ³"
  LOCATE 14, 7
    PRINT "³ 00 ³ 0000 ³ 08 ³ 0000 ³ 16 ³ 0000 ³ 24 ³ 0000 ³                 ³"
  LOCATE 15, 7
    PRINT "³ 01 ³ 0000 ³ 09 ³ 0000 ³ 17 ³ 0000 ³ 25 ³ 0000 ³   COM ADDRESS   ³"
  LOCATE 16, 7
    PRINT "³ 02 ³ 0000 ³ 10 ³ 0000 ³ 18 ³ 0000 ³ 26 ³ 0000 ³                 ³"
  LOCATE 17, 7
    PRINT "³ 03 ³ 0000 ³ 11 ³ 0000 ³ 19 ³ 0000 ³ 27 ³ 0000 ³                 ³"
  LOCATE 18, 7
    PRINT "³ 04 ³ 0000 ³ 12 ³ 0000 ³ 20 ³ 0000 ³ 28 ³ 0000 ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´"
  LOCATE 19, 7
    PRINT "³ 05 ³ 0000 ³ 13 ³ 0000 ³ 21 ³ 0000 ³ 29 ³ 0000 ³                 ³"
  LOCATE 20, 7
    PRINT "³ 06 ³ 0000 ³ 14 ³ 0000 ³ 22 ³ 0000 ³ 30 ³ 0000 ³       3F8       ³"
  LOCATE 21, 7
    PRINT "³ 07 ³ 0000 ³ 15 ³ 0000 ³ 23 ³ 0000 ³ 31 ³ 0000 ³                 ³"
  LOCATE 22, 7
    PRINT "ÀÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"

  COLOR 15, 13, 0
  LOCATE 13, 9
    PRINT "CH"
  LOCATE 13, 14
    PRINT "DATA"
  LOCATE 13, 21
    PRINT "CH"
  LOCATE 13, 26
    PRINT "DATA"
  LOCATE 13, 33
    PRINT "CH"
  LOCATE 13, 38
    PRINT "DATA"
  LOCATE 13, 45
    PRINT "CH"
  LOCATE 13, 50
    PRINT "DATA"
  LOCATE 13, 57
    PRINT "               "
  LOCATE 14, 57
    PRINT "               "
  LOCATE 15, 57
    PRINT "  COM ADDRESS  "
  LOCATE 16, 57
    PRINT "               "
  LOCATE 17, 57
    PRINT "               "
  COLOR 14, 1, 0

END SUB

