'===========================================================================
' Subject: EXPERIMENTAL PROG LANGUAGE V.01    Date: 10-18-98 (15:12)       
'  Author: L. Jones                           Code: QB, QBasic, PDS        
'  Origin: ljones@lineone.net               Packet: MISC.ABC
'===========================================================================
' Prog language
' Experimental!!!
' v0.01
' (c) L Jones,1998 ljones@lineone.net
'
' This is an experimental programming langauge that I may write. This
' version is an experimental version, not even a "pre-release". Just like
' an "artist's" preliminary sketch, if you like!
'
' "A","X","Y" (i.e. from LDA,TXA,TAY, etc) are internal and not variables.
' So a variable called "A" and the "A" in STA are different. Careful!
' Do not use "A","X" or "Y" as your variable names!!
'
' Commands are little like 6502, although this is *not* an attempt to
' emulate or simulate a 6502. All commands are 3 letters with either 2,1
' or no extra parameters. Only use ONE space between a parameter and its
' command (do not miss it out or use 2 spaces, for example:)
' INC 4 (correct)
' INC    4 (invalid, won't work at all!)
' INC4 (also invalid!)
' In the VAR command there should be no spaces around the "," for example:
' VAR Message,"Hello" (correct)
' VAR Message , "Hello" (invalid!)
'
' Work to do:
' The "language" may or may not look like the commands I've used (probably
' yes). One problem that I know of is going to be the subject of arrays -
' how???
'
' Listed below is a test program. To use, cut it out, remove the "'" (REM)
' statements and save in a file called "TEST.PRG".
'
'; Test program
'
'VAR FirstMessage,"Enter first number?"
'VAR SecondMessage,"Enter second number?"
'VAR LastMessage,"The result is "
'VAR Num1,0
'VAR Num2,0
'VAR Total,0
'
'WDS FirstMessage
'INP Num1
'
'WDS SecondMessage
'INP Num2
'
'WDS LastMessage
'LDA Num1
'ADA Num2
'STA Total
'WDS Total
'LDA 0
'RTS
'
' Commands so far:
'
' VAR [name]     Setup variable [name]
' VAR [name],<d> Setup variable [name] with <d>ata ("string" or numeric)
' LAB [name]     Label
' RTS            End program
' JMP [label]    Go to [label]
' LDA [num]      A=[number]
' LDA ".."       A=".." (string)
' LDA [var]      A=[var]
' STA [var]      [var]=A
' INC [var]      Add 1 to [var]
' INC [num]      Add [num] to A
' TAX            Transfer A to X
' TAY            Transfer A to Y
' TXA            Transfer X to A
' TYA            Transfer Y to A
' INP [var]      Read input from keyboard, store in [var]
' ADA <n>        Add to A - either a [variable] or <n>umber
' WRA            Write value in A to screen
' WDS            Writes text, numbers or var's onto screen (not int.A,X,Y)
'
Setup:
    CLS
    maxlab% = 16
    maxlines% = 25
    maxvar% = 8
    DIM label$(maxlab%), labpos%(maxlab%)
    DIM var$(maxvar%), vardat$(maxvar%)
    DIM prg$(maxlines%)

    varx$ = "": REM "x"
    vary$ = "": REM "y"
    vara$ = "": REM "a"

Readfile:
    ' Get rid of any spaces before commands
    OPEN "test.prg" FOR INPUT AS 1
    WHILE EOF(1) = 0
        LINE INPUT #1, in$
        prg$(ln%) = LTRIM$(in$)
        ln% = ln% + 1
    WEND
    CLOSE 1

    ' Read labels
    OPEN "test.prg" FOR INPUT AS 1
    WHILE EOF(1) = 0
        LINE INPUT #1, in$
        ln2% = ln2% + 1
        cmd$ = UCASE$(MID$(in$, 1, 3))
        IF cmd$ = "LAB" THEN
            label$(lb%) = MID$(in$, 5, LEN(in$))
            labpos%(lb%) = ln2%
            lb% = lb% + 1
        END IF
    WEND
    CLOSE 1

    'Variables
    OPEN "test.prg" FOR INPUT AS 1
    WHILE EOF(1) = 0
        LINE INPUT #1, in$
        ln3% = ln3% + 1
        cmd$ = UCASE$(MID$(in$, 1, 3))
        ' this bit below finds out if there's any data to store in var..
        IF cmd$ = "VAR" THEN
            tmp$ = in$
            scan% = INSTR(1, tmp$, ",")
            IF scan% = 0 THEN scan% = LEN(tmp$) + 1
            var$(lv%) = MID$(in$, 5, scan% - 5)
            ' clear out variable anyway ready for use...
            ' neatly solves the problem if there is NO "," !
            vardat$(lv%) = ""
            dat$ = MID$(in$, scan% + 1, LEN(in$))
            IF dat$ = "0" THEN vardat$(lv%) = "0": lv% = lv% + 1
            IF MID$(dat$, 1, 1) = CHR$(34) THEN
                tmp$ = dat$
                size% = LEN(tmp$) - 1
                vardat$(lv%) = MID$(tmp$, 2, size% - 1)
                lv% = lv% + 1
            END IF
        END IF
    WEND
    CLOSE 1

Runit:
FOR count% = 0 TO ln%
Start2:
in$ = prg$(count%)
cmd$ = UCASE$(MID$(in$, 1, 3))

IF cmd$ = "RTS" THEN
    END
END IF

IF cmd$ = "JMP" THEN
    o1$ = MID$(in$, 5, LEN(in$))
    FOR scan% = 0 TO lb%
    IF label$(scan%) = o1$ THEN
        count% = labpos%(scan%)
        GOTO Start2
    END IF
    NEXT
END IF

IF cmd$ = "INP" THEN
    o1$ = MID$(in$, 5, LEN(in$))
    FOR scan% = 0 TO lv%
    IF var$(scan%) = o1$ THEN
        LINE INPUT "", tmp$
        vardat$(scan%) = tmp$
    END IF
    NEXT
END IF

IF cmd$ = "LDA" THEN
    value = VAL(MID$(in$, 5, LEN(in$)))
    IF value = 0 AND MID$(in$, 5, 1) <> "0" THEN
        o1$ = MID$(in$, 5, LEN(in$))
        FOR scan% = 0 TO lv%
        IF var$(scan%) = o1$ THEN
            vara$ = vardat$(scan%)
        END IF
        NEXT
    END IF
    IF MID$(in$, 5, 1) = CHR$(34) THEN
        tmp$ = MID$(in$, 6, LEN(in$) - 6)
        vara$ = tmp$
    END IF
    IF value > 0 THEN vara$ = STR$(value)
    IF value = 0 AND MID$(in$, 5, 1) = "0" THEN vara$ = "0"
END IF

IF cmd$ = "WDS" THEN
    o1$ = MID$(in$, 5, LEN(in$))
    FOR scan% = 0 TO lv%
    IF var$(scan%) = o1$ THEN
        PRINT vardat$(scan%);
    END IF
    NEXT
    IF MID$(in$, 5, 1) = CHR$(34) THEN
        tmp$ = MID$(in$, 6, LEN(in$) - 6)
        PRINT tmp$;
    END IF
    IF value > 0 THEN PRINT VAL(o1$);
    IF value = 0 AND MID$(in$, 5, 1) = "0" THEN PRINT 0;
END IF

IF cmd$ = "ADA" THEN
    value = VAL(MID$(in$, 5, LEN(in$)))
    IF value = 0 AND MID$(in$, 5, 1) <> "0" THEN
        o1$ = MID$(in$, 5, LEN(in$))
        FOR scan% = 0 TO lv%
        IF var$(scan%) = o1$ THEN
            sum = VAL(vara$) + VAL(vardat$(scan%))
            vara$ = STR$(sum)
        END IF
        NEXT
    END IF
    IF value > 0 THEN
        sum = VAL(vara$) + value
        vara$ = STR$(sum)
    END IF
    IF value = 0 AND MID$(in$, 5, 1) = "0" THEN vara$ = vara$: REM add nothing!
END IF

IF cmd$ = "STA" THEN
    o1$ = MID$(in$, 5, LEN(in$))
    FOR scan% = 0 TO lv%
    IF var$(scan%) = o1$ THEN
        vardat$(scan%) = vara$
    END IF
    NEXT
END IF

IF cmd$ = "INC" THEN
    o1$ = MID$(in$, 5, LEN(in$))
    value = VAL(o1$)
    IF value > 0 THEN
        tmp% = VAL(vara$)
        tmp% = tmp% + value
        vara$ = STR$(tmp%)
    END IF
    FOR scan% = 0 TO lv%
    IF var$(scan%) = o1$ THEN
        tmp% = VAL(vardat$(scan%))
        tmp% = tmp% + 1
        vardat$(scan%) = STR$(tmp%)
    END IF
    NEXT
END IF

IF cmd$ = "TAX" THEN
    varx$ = vara$
END IF

IF cmd$ = "TAY" THEN
    vary$ = vara$
END IF

IF cmd$ = "TXA" THEN
    vara$ = varx$
END IF

IF cmd$ = "TYA" THEN
    vara$ = vary$
END IF

IF cmd$ = "WRA" THEN
    PRINT vara$;
END IF

NEXT
END
