Execute Brain****/TI-89 BASIC

From Rosetta Code
Execute Brain****/TI-89 BASIC is an implementation of Brainf***. Other implementations of Brainf***.
Execute Brain****/TI-89 BASIC is part of RCBF. You may find other members of RCBF at Category:RCBF.
Translation of: TI-83 BASIC

This implementation (in TI-89 BASIC) is basically a direct translation of the TI-83 BASIC example. It makes use of some TI-89 features; the program and memory size are given as parameters, and all variables are declared local.

IO is performed with numbers; character IO could be done (using char() and ord() to convert) but the TI-89 has no cursor for user program IO, so it would be necessary to either implement one or buffer output until the program exits or waits for input, in order to display more than one character per line.

Define bf(Raw) = Prgm
  Local valid, raw, BFprog, inst, memory, ip, brackets, memp
  "+-.,[]<>" → valid
  "" → BFprog
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} → memory
  0 → brackets
  1 → memp
  For ip, 1, dim(raw)
    If inString(valid,mid(raw,ip,1))>0 Then
      BFprog & mid(raw,ip,1) → BFprog
      If mid(raw,ip,1) = "["
        brackets+1 → brackets
      If mid(raw,ip,1) = "]"
        brackets-1 → brackets
    EndIf
  EndFor
  If brackets ≠ 0 Then
    Disp "Uneven brackets"
    Stop
  EndIf
  For ip, 2, dim(BFprog)
    mid(BFprog,ip,1) → inst
    If inst = "+" Then
      memory[memp]+1 → memory[memp]
    ElseIf inst = "-" Then
      memory[memp]-1 → memory[memp]
    ElseIf inst = "." Then
      Disp memory[memp]
    ElseIf inst = "," Then
      Input value
      value → memory[memp]
    ElseIf inst = "[" and memory[memp] = 0 Then
      1 → brackets
      ip+1 → ip
      While ip ≤ dim(BFprog) and brackets ≠ 0
        If mid(BFprog,ip,1) = "[" Then
          brackets+1 → brackets
        ElseIf mid(BFprog,ip,1) = "]" Then
          brackets-1 → brackets
        EndIf
        ip+1 → ip
      EndWhile
      ip-1 → ip
    ElseIf inst = "]" and memory[memp] ≠ 0 Then
      1 → brackets
      ip-1 → ip
      While ip≥0 and brackets ≠ 0
        If mid(BFprog,ip,1) = "[" Then
          brackets+1 → brackets
        ElseIf mid(BFprog,ip,1) = "]" Then
          brackets-1 → brackets
        EndIf
        ip-1 → ip
      EndWhile
    ElseIf inst = "<" Then
      memp-1 → memp
      If memp ≤ 0 Then
        Disp "Memory pointer out of range"
        Stop
      EndIf
    ElseIf inst = ">" Then
      memp+1 → memp
      If memp > dim(memory)
        0 → memory[memp]
    EndIf
  EndFor
EndPrgm