Microsoft Small Basic

Program Listing: MWQ039
' Binary Add Computer
' Version 0.1
' Copyright © 2016 Nonki Takahashi. The MIT License.
'
GraphicsWindow.Title = "Binary Add Machine"
Form()
GraphicsWindow.KeyDown = OnKeyDown
While "True"
j = 1
SetNumber()
j = 2
SetNumber()
AddNumber()
EndWhile
Sub AddNumber
num[3] = num[2] + num[1]
If 255 < num[3] Then
num[3] = num[3] - 256
EndIf
Shapes.SetText(txtNum[3], num[3])
j = 3
For i = 8 To 1 Step -1
bit = Math.Remainder(num[3], 2)
If bit = 1 Then
Shapes.SetOpacity(lamp[j][i], 100)
Else
Shapes.SetOpacity(lamp[j][i], 30)
EndIF
num[3] = Math.Floor(num[3] / 2)
EndFor
EndSub
Sub ClearNumber
num[j] = 0
Shapes.SetText(txtNum[j], num[j])
For i = 1 To 8
Shapes.SetOpacity(lamp[j][i], 30)
switch[j][i] = "OFF"
EndFor
EndSub
Sub SetNumber
input = "True"
While input
If keyDown Then
If key = "D9" Or key = "NumPad9" Then
i = 9
Toggle()
input = "False"
ElseIf key = "D0" Or key = "NumPad0" Then
i = 10
Toggle()
ClearNumber()
Else
For i = 1 To 8
If key = "D" + i Or key = "NumPad" + i Then
Toggle()
i = 8 ' exit For
EndIf
EndFor
EndIf
keyDown = "False"
Else
Program.Delay(200)
EndIf
EndWhile
EndSub
Sub Toggle
' param j
' param i
If switch[j][i] = "ON" Then
SwitchOff()
Else
SwitchOn()
EndIf
If i <= 8 Then
num[j] = 0
For i = 1 To 8
num[j] = num[j] * 2
If switch[j][i] = "ON" Then
num[j] = num[j] + 1
EndIf
EndFor
ShowNum()
EndIf
EndSub
Sub ShowNum
Shapes.SetText(txtNum[j], num[j])
EndSub
Sub OnKeyDown
key = GraphicsWindow.LastKey
keyDown = "True"
EndSub
Sub Form
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
GraphicsWindow.BackgroundColor = "Blue"
GraphicsWindow.PenWidth = 0
xo = 70
yo = 100
gap = 50
len = 15
r = 6
r2 = r * 1.5
y = yo
For j = 1 To 3
x = xo
For i = 1 To 8
GraphicsWindow.BrushColor = "Gray"
GraphicsWindow.FillEllipse(x - r2, y - r2, 2 * r2, 2 * r2)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FillEllipse(x - r, y - r, 2 * r, 2 * r)
GraphicsWindow.BrushColor = "Red"
lamp[j][i] = Shapes.AddEllipse(2 * r, 2 * r)
Shapes.Move(lamp[j][i], x - r, y - r)
Shapes.SetOpacity(lamp[j][i], 30)
x = x + gap
EndFor
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FillRectangle(x, y - 2 * r, 8 * r, 4 * r)
GraphicsWindow.BrushColor = "Red"
txtNum[j] = Shapes.AddText("")
Shapes.Move(txtNum[j], x + 2 * r, y - r)
y = y + gap
EndFor
y = yo + 3 * gap
x = xo
For i = 1 To 10
GraphicsWindow.PenWidth = 2
GraphicsWindow.BrushColor = "Gray"
GraphicsWindow.FillEllipse(x - r2, y - r2, 2 * r2, 2 * r2)
GraphicsWindow.DrawEllipse(x - r, y - r, 2 * r, 2 * r)
GraphicsWindow.BrushColor = "#444444"
on1[i] = Shapes.AddRectangle(2 * r + 2, len + 2)
Shapes.Move(on1[i], x - r - 1, y - len - 1)
GraphicsWindow.PenWidth = 0
on2[i] = Shapes.AddEllipse(2 * r - 2, 2 * r - 2)
Shapes.Move(on2[i], x - r + 1, y - r + 1)
GraphicsWindow.PenWidth = 2
GraphicsWindow.BrushColor = "Gray"
on3[i] = Shapes.AddEllipse(2 * r + 2, 2 * r + 2)
Shapes.Move(on3[i], x - r - 1, y - r - len - 1)
GraphicsWindow.BrushColor = "Black"
If i = 9 Then
GraphicsWindow.DrawText(x - r * 1.7, y + 2 * r, "Set")
ElseIf i = 10 Then
GraphicsWindow.DrawText(x - r * 2.7, y + 2 * r, "Reset")
Else
GraphicsWindow.DrawText(x - r / 2, y + 2 * r, i)
EndIf
SwitchOff()
x = x + gap
EndFor
EndSub
Sub SwitchOn
' param j
' param i
switch[j][i] = "ON"
Shapes.ShowShape(on1[i])
Shapes.ShowShape(on2[i])
Shapes.ShowShape(on3[i])
Sound.PlayClickAndWait()
Shapes.HideShape(on1[i])
Shapes.HideShape(on2[i])
Shapes.HideShape(on3[i])
Shapes.SetOpacity(lamp[j][i], 100)
EndSub
Sub SwitchOff
' param j
' param i
switch[j][i] = "OFF"
Shapes.ShowShape(on1[i])
Shapes.ShowShape(on2[i])
Shapes.ShowShape(on3[i])
Sound.PlayClickAndWait()
Shapes.HideShape(on1[i])
Shapes.HideShape(on2[i])
Shapes.HideShape(on3[i])
Shapes.SetOpacity(lamp[j][i], 30)
EndSub