Microsoft Small Basic

Program Listing: RQX345-3
' Graph
' Version 0.5
' Copyright © 2015-2017 Nonki Takahashi. The MIT License.
' Last update 2017-04-10
' Program ID RQX345-3

title = "Graph 0.5"
GraphicsWindow.Title = title
Not = "True=False;False=True;"
Form()
' draw (0,0), (0,1), (1,0) and (1,1)
GraphicsWindow.BrushColor = "Black"
For y = 0 To 1
For x = 0 To 1
Graph_ToGWCoordinate()
GraphicsWindow.FillEllipse(gwx - 2, gwy - 2, 4, 4)
EndFor
EndFor
' fill y=0
GraphicsWindow.PenColor = "#33000000"
gwx1 = gwvp["x"]
gwx2 = gwvp["x"] + gwvp["width"]
gwy1 = gwvp["y"]
gwy2 = gwvp["y"] + gwvp["height"]
n = Array.GetItemCount(b)
index = Array.GetAllIndices(b)
While "True"
For i = 1 To n
func = index[i]
GraphicsWindow.Title = title + " - " + func
Fx_GetProperties()
Shapes.SetText(fx, "y=" + textFx)
For gwy = gwy1 To gwy2
yLast = 1
For gwx = gwx1 To gwx2
Graph_ToLogicalCoordinate()
x1 = x
x2 = y
AN()
If y = 0 And yLast = 1 Then
gwx0 = gwx
started = "True"
EndIf
If (y = 1 And yLast = 0) OR (gwx = gwx2 And started) Then
nLine = nLine + 1
line[nLine] = Shapes.AddLine(gwx0, gwy, gwx - 1, gwy)
started = "False"
EndIf
yLast = y
EndFor
EndFor
Program.Delay(2000)
For iLine = 1 To nLine
Shapes.Remove(line[iLine])
EndFor
nLine = 0
EndFor
EndWhile

Sub Form
b["FALSE"] = -1.2
w["FALSE"] = "1=0.5;2=0.5"
b["AND"] = -0.7
w["AND"] = "1=0.5;2=0.5"
b["NOT IMP"] = -0.2
w["NOT IMP"] = "1=-0.5;2=0.5"
b["X2"] = -0.2
w["X2"] = "1=0;2=0.5"
b["NOT RIMP"] = -0.2
w["NOT RIMP"] = "1=0.5;2=-0.5"
b["X1"] = -0.2
w["X1"] = "1=0.5;2=0"
b["XOR"] = "AND(NAND(x1,x2),OR(x1,x2))"
b["OR"] = -0.2
w["OR"] = "1=0.5;2=0.5"
b["NOR"] = 0.2
w["NOR"] = "1=-0.5;2=-0.5"
b["EQV"] = "OR(NOR(x1,x2),AND(x1,x2))"
b["NOT X1"] = 0.2
w["NOT X1"] = "1=-0.5;2=0"
b["RIMP"] = 0.2
w["RIMP"] = "1=-0.5;2=0.5"
b["NOT X2"] = 0.2
w["NOT X2"] = "1=0;2=-0.5"
b["IMP"] = 0.2
w["IMP"] = "1=0.5;2=-0.5"
b["NAND"] = 0.7
w["NAND"] = "1=-0.5;2=-0.5"
b["TRUE"] = 1.2
w["TRUE"] = "1=-0.5;2=-0.5"
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
GraphicsWindow.BackgroundColor = "LightGray"
GraphicsWindow.FontName = "Arial"
param = "x=10;"
param["width"] = gw - 20
param["y"] = 30
param["height"] = gh - 40
Graph_SetGWViewPort()
GraphicsWindow.BrushColor = "White"
GraphicsWindow.FillRectangle(param["x"], param["y"], param["width"], param["height"])
x1 = -0.5
param["x"] = x1
x2 = 1.58
param["width"] = x2 - x1
param["height"] = -param["width"] / (gw - 20) * (gh - 40)
y1 = -param["height"] * 0.86
y2 = param["height"] * 0.14
param["y"] = y1
Graph_SetLogicalViewPort()
Fx_GetProperties()
GraphicsWindow.BrushColor = "Black"
fx = Shapes.AddText("y=")
Shapes.Move(fx, 10, 10)
GraphicsWindow.PenColor = "#99FFFF"
dx = 0.02
dy = 0.02
Graph_DrawGrid()
GraphicsWindow.PenColor = "#77CCCC"
GraphicsWindow.BrushColor = "#559999"
dx = 0.1
dy = 0.1
num = "True"
Graph_DrawGrid()
GraphicsWindow.PenColor = "Gray"
GraphicsWindow.DrawRectangle(10, 30, gw - 20, gh - 40)
ox = gwx1 + 200
oy = gwy1 + 300
EndSub

Sub AN
If func = "XOR" Then
_func = func
func = "NAND"
AN()
_y = y
func = "OR"
AN()
x1 = _y
x2 = y
func = "AND"
AN()
func = _func
ElseIf func = "EQV" Then
_func = func
func = "NOR"
AN()
_y = y
func = "AND"
AN()
x1 = _y
x2 = y
func = "OR"
AN()
func = _func
Else
a = b[func] + w[func][1] * x1 + w[func][2] * x2
If a <= 0 Then
y = 0
Else
y = 1
EndIf
EndIf
EndSub

Sub Fx_GetProperties
If (func = "XOR") OR (func = "EQV") Then
textFx = b[func]
Else
textFx = "h(b+w1*x1+w2*x2), b=" + b[func] + ", w1=" + w[func][1] + ", w2=" + w[func][2]
EndIf
EndSub

Sub Graph_SetGWViewPort
' param["x"]
' param["y"]
' param["width"]
' param["height"]
gwvp = param
EndSub

Sub Graph_SetLogicalViewPort
' param["x"]
' param["y"]
' param["width"]
' param["height"]
vp = param
EndSub

Sub Graph_ToGWCoordinate
' param x, y - logical co-ordinate
' return gwx, gwy - graphics window co-ordinate
gwx = gwvp["x"] + (x - vp["x"]) / vp["width"] * gwvp["width"]
gwy = gwvp["y"] + (y - vp["y"]) / vp["height"] * gwvp["height"]
EndSub

Sub Graph_ToLogicalCoordinate
' param gwx, gwy - graphics window co-ordinate
' return x, y - logical co-ordinate
x = vp["x"] + (gwx - gwvp["x"]) / gwvp["width"] * vp["width"]
y = vp["y"] + (gwy - gwvp["y"]) / gwvp["height"] * vp["height"]
EndSub

Sub Graph_DrawGrid
' param x1, y1 - logical left top of the grid
' param x2, y2 - logical right bottom of the grid
' param dx, dy - logical grid pitch
x = x1
y = y1
Graph_ToGWCoordinate()
gwx1 = gwx
gwy1 = gwy
x = x2
y = y2
Graph_ToGWCoordinate()
gwx2 = gwx
gwy2 = gwy
x = 0
For y = 0 To y2 Step -dy
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx1, gwy, gwx2, gwy)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, y)
EndIf
EndFor
For y = 0 To y1 Step dy
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx1, gwy, gwx2, gwy)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, y)
EndIf
EndFor
y = 0
For x = 0 To x2 Step dx
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx, gwy1, gwx, gwy2)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, x)
EndIf
EndFor
For x = 0 To x1 Step -dx
Graph_ToGWCoordinate()
GraphicsWindow.DrawLine(gwx, gwy1, gwx, gwy2)
If num Then
GraphicsWindow.DrawText(gwx + 2, gwy, x)
EndIf
EndFor
EndSub