%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%Subtraction                %
 
%Kostia Palanski            %
 
%Mr. Wong                   %
 
%Binary Subtraction Program %
 
%Done: Feb. 20th 2005       %
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
%Graphics Settings
 
View.Set ("graphics:400;400,position:bottom;left,nobuttonbar")
 
drawfillbox (0, 0, maxx, maxy, black)
 
colorback (black)
 
color (yellow)
 
%Variable Declaration
 
var snum1, snum2 : string
 
var lsnum1, lsnum2 : int
 
var msnum1, msnum2 : string
 
var streamin, streamout : int
 
var osubput : string
 
var queryn1, queryn2, query : string
 
var neg1, neg2, neg : int := 0
 
var aosnum2 : array 1 .. 8 of int
 
var aosnum1 : array 1 .. 8 of int
 
var finalAnswer : array 1 .. 8 of int
 
var finalAnswerint : int
 
var oflow : int := 0
 
%TwosCompliment Variables
 
var twoC : string := "00000001"
 
var aotwoC : array 1 .. 8 of int
 
for f : 1 .. 8
 
    aotwoC (f) := strint (twoC (f))
 
end for
 
%Ones Compliment for Num2
 
procedure onesComplimentNum2
 
    for e : 1 .. 8
 
        if aosnum2 (e) = 1 then
 
            aosnum2 (e) := 0
 
        elsif aosnum2 (e) = 0 then
 
            aosnum2 (e) := 1
 
        end if
 
    end for
 
end onesComplimentNum2
 
%Ones Compliment for Num1
 
procedure onesComplimentNum1
 
    for e : 1 .. 8
 
        if aosnum1 (e) = 1 then
 
            aosnum1 (e) := 0
 
        elsif aosnum1 (e) = 0 then
 
            aosnum1 (e) := 1
 
        end if
 
    end for
 
end onesComplimentNum1
 
%Ones Compliment for FinalAnswer
 
procedure onesComplimentFA
 
    for e : 1 .. 8
 
        if finalAnswer (e) = 1 then
 
            finalAnswer (e) := 0
 
        elsif finalAnswer (e) = 0 then
 
            finalAnswer (e) := 1
 
        end if
 
    end for
 
end onesComplimentFA
 
%Twos Compliment for aosnum1
 
procedure twosComplimentNum1
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    var final : array 1 .. 8 of int
 
    var fdigit : int := 0
 
    var carry : int := 0
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    for decreasing g : 8 .. 1
 
        if g = 1 and aosnum1 (g) + aotwoC (g) = 0 and carry = 0 then
 
            fdigit := 0
 
        elsif g = 1 and aosnum1 (g) + aotwoC (g) = 1 and carry = 0 then
 
            fdigit := 1
 
        elsif g = 1 and aosnum1 (g) + aotwoC (g) = 1 and carry = 1 then
 
            fdigit := 10
 
        elsif g = 1 and aosnum1 (g) + aotwoC (g) = 2 and carry = 0 then
 
            fdigit := 10
 
        elsif g = 1 and aosnum1 (g) + aotwoC (g) = 2 and carry = 1 then
 
            fdigit := 11
 
        end if
 
        %%%%%%%%%%%%%%%%%%%%%%%%
 
        if aosnum1 (g) + aotwoC (g) = 0 and carry = 0 then
 
            final (g) := 0
 
            carry := 0
 
        elsif aosnum1 (g) + aotwoC (g) = 0 and carry = 1 then
 
            final (g) := 1
 
            carry := 0
 
        elsif aosnum1 (g) + aotwoC (g) = 1 and carry = 0 then
 
            final (g) := 1
 
            carry := 0
 
        elsif aosnum1 (g) + aotwoC (g) = 1 and carry = 1 then
 
            final (g) := 0
 
            carry := 1
 
        elsif aosnum1 (g) + aotwoC (g) = 2 and carry = 0 then
 
            final (g) := 0
 
            carry := 1
 
        elsif aosnum1 (g) + aotwoC (g) = 2 and carry = 1 then
 
            final (g) := 1
 
            carry := 1
 
        end if
 
    end for
 
    %Put output
 
    open : streamout, "subput.txt", put
 
    for h : 1 .. 8
 
        put : streamout, final (h) ..
 
    end for
 
    close : streamout
 
    %Get it to one variable
 
    open : streamin, "subput.txt", get
 
    get : streamin, osubput : *
 
    close : streamin
 
    %Reassign the new TwosCompliment to aosnum1
 
    for i : 1 .. 8
 
        aosnum1 (i) := strint (osubput (i))
 
    end for
 
end twosComplimentNum1
 
%Twos Compliment for aosnum2
 
procedure twosComplimentNum2
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    var final : array 1 .. 8 of int
 
    var fdigit : int := 0
 
    var carry : int := 0
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    for decreasing g : 8 .. 1
 
        if g = 1 and aosnum2 (g) + aotwoC (g) = 0 and carry = 0 then
 
            fdigit := 0
 
        elsif g = 1 and aosnum2 (g) + aotwoC (g) = 1 and carry = 0 then
 
            fdigit := 1
 
        elsif g = 1 and aosnum2 (g) + aotwoC (g) = 1 and carry = 1 then
 
            fdigit := 10
 
        elsif g = 1 and aosnum2 (g) + aotwoC (g) = 2 and carry = 0 then
 
            fdigit := 10
 
        elsif g = 1 and aosnum2 (g) + aotwoC (g) = 2 and carry = 1 then
 
            fdigit := 11
 
        end if
 
        %%%%%%%%%%%%%%%%%%%%%%%%
 
        if aosnum2 (g) + aotwoC (g) = 0 and carry = 0 then
 
            final (g) := 0
 
            carry := 0
 
        elsif aosnum2 (g) + aotwoC (g) = 0 and carry = 1 then
 
            final (g) := 1
 
            carry := 0
 
        elsif aosnum2 (g) + aotwoC (g) = 1 and carry = 0 then
 
            final (g) := 1
 
            carry := 0
 
        elsif aosnum2 (g) + aotwoC (g) = 1 and carry = 1 then
 
            final (g) := 0
 
            carry := 1
 
        elsif aosnum2 (g) + aotwoC (g) = 2 and carry = 0 then
 
            final (g) := 0
 
            carry := 1
 
        elsif aosnum2 (g) + aotwoC (g) = 2 and carry = 1 then
 
            final (g) := 1
 
            carry := 1
 
        end if
 
    end for
 
    %Put output
 
    open : streamout, "subput.txt", put
 
    for h : 1 .. 8
 
        put : streamout, final (h) ..
 
    end for
 
    close : streamout
 
    %Get it to one variable
 
    open : streamin, "subput.txt", get
 
    get : streamin, osubput : *
 
    close : streamin
 
    %Reassign the new TwosCompliment to aosnum2
 
    for i : 1 .. 8
 
        aosnum2 (i) := strint (osubput (i))
 
    end for
 
end twosComplimentNum2
 
%Twos Compliment for finalAnswer
 
procedure twosComplimentFA
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    var final : array 1 .. 8 of int
 
    var fdigit : int := 0
 
    var carry : int := 0
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    for decreasing g : 8 .. 1
 
        if g = 1 and finalAnswer (g) + aotwoC (g) = 0 and carry = 0 then
 
            fdigit := 0
 
        elsif g = 1 and finalAnswer (g) + aotwoC (g) = 1 and carry = 0 then
 
            fdigit := 1
 
        elsif g = 1 and finalAnswer (g) + aotwoC (g) = 1 and carry = 1 then
 
            fdigit := 10
 
        elsif g = 1 and finalAnswer (g) + aotwoC (g) = 2 and carry = 0 then
 
            fdigit := 10
 
        elsif g = 1 and finalAnswer (g) + aotwoC (g) = 2 and carry = 1 then
 
            fdigit := 11
 
        end if
 
        %%%%%%%%%%%%%%%%%%%%%%%%
 
        if finalAnswer (g) + aotwoC (g) = 0 and carry = 0 then
 
            final (g) := 0
 
            carry := 0
 
        elsif finalAnswer (g) + aotwoC (g) = 0 and carry = 1 then
 
            final (g) := 1
 
            carry := 0
 
        elsif finalAnswer (g) + aotwoC (g) = 1 and carry = 0 then
 
            final (g) := 1
 
            carry := 0
 
        elsif finalAnswer (g) + aotwoC (g) = 1 and carry = 1 then
 
            final (g) := 0
 
            carry := 1
 
        elsif finalAnswer (g) + aotwoC (g) = 2 and carry = 0 then
 
            final (g) := 0
 
            carry := 1
 
        elsif finalAnswer (g) + aotwoC (g) = 2 and carry = 1 then
 
            final (g) := 1
 
            carry := 1
 
        end if
 
    end for
 
    %Put output
 
    open : streamout, "subput.txt", put
 
    for h : 1 .. 8
 
        put : streamout, final (h) ..
 
    end for
 
    close : streamout
 
    %Get it to one variable
 
    open : streamin, "subput.txt", get
 
    get : streamin, osubput : *
 
    close : streamin
 
    %Reassign the new TwosCompliment to aosnum1
 
    for i : 1 .. 8
 
        finalAnswer (i) := strint (osubput (i))
 
    end for
 
end twosComplimentFA
 
%Subtraction Procedure using Addition
 
procedure subtract
 
    var final : array 1 .. 8 of int
 
    var fdigit : int := 0
 
    var carry : int := 0
 
    %%%%%%%%%%%%%%%%%%%%%%%%
 
    for decreasing j : 8 .. 1
 
        if j = 1 and aosnum1 (j) + aosnum2 (j) = 0 and carry = 0 then
 
            fdigit := 0
 
        elsif j = 1 and aosnum1 (j) + aosnum2 (j) = 1 and carry = 0 then
 
            fdigit := 1
 
        elsif j = 1 and aosnum1 (j) + aosnum2 (j) = 1 and carry = 1 then
 
            fdigit := 10
 
        elsif j = 1 and aosnum1 (j) + aosnum2 (j) = 2 and carry = 0 then
 
            fdigit := 10
 
        elsif j = 1 and aosnum1 (j) + aosnum2 (j) = 2 and carry = 1 then
 
            fdigit := 11
 
        end if
 
        %%%%
 
        if aosnum1 (j) + aosnum2 (j) = 0 and carry = 0 then
 
            final (j) := 0
 
            carry := 0
 
        elsif aosnum1 (j) + aosnum2 (j) = 0 and carry = 1 then
 
            final (j) := 1
 
            carry := 0
 
        elsif aosnum1 (j) + aosnum2 (j) = 1 and carry = 0 then
 
            final (j) := 1
 
            carry := 0
 
        elsif aosnum1 (j) + aosnum2 (j) = 1 and carry = 1 then
 
            final (j) := 0
 
            carry := 1
 
        elsif aosnum1 (j) + aosnum2 (j) = 2 and carry = 0 then
 
            final (j) := 0
 
            carry := 1
 
        elsif aosnum1 (j) + aosnum2 (j) = 2 and carry = 1 then
 
            final (j) := 1
 
            carry := 1
 
        end if
 
    end for
 
    %Outputs data to text file
 
    open : streamout, "subput.txt", put
 
    for h : 1 .. 8
 
        put : streamout, final (h) ..
 
    end for
 
    close : streamout
 
    %Get it to one variable
 
    open : streamin, "subput.txt", get
 
    get : streamin, osubput : *
 
    close : streamin
 
    %Reassign the new TwosCompliment to finalAnswer
 
    for i : 1 .. 8
 
        finalAnswer (i) := strint (osubput (i))
 
    end for
 
end subtract
 
%%%%%%%%%%%%%%%%%%%%%%%%%
 
%Beginning of Program
 
loop
 
    %Set overflow to 0 for repeated attempts
 
    oflow := 0
 
    %Error trapping loops
 
    loop
 
        put "Is the first number negative? (y/n)"
 
        get queryn1
 
        if queryn1 = "Y" or queryn1 = "N" or queryn1 = "y" or
 
                queryn1 = "yes" or queryn1 = "no" or queryn1 = "n" then
 
            exit
 
        else
 
            put "Wrong input, this is a yes or no question.."
 
            delay (400)
 
        end if
 
    end loop
 
    %%%
 
    loop
 
        put "Please enter the first binary number.."
 
        get snum1
 
        lsnum1 := length (snum1)
 
        if lsnum1 > 7 then
 
            put "Only 7 bits can be inputed.."
 
        else
 
            exit
 
        end if
 
    end loop
 
    %%
 
    loop
 
        put "Is the second number negative? (y/n)"
 
        get queryn2
 
        if queryn2 = "Y" or queryn2 = "N" or queryn2 = "y" or
 
                queryn2 = "yes" or queryn2 = "no" or queryn2 = "n" then
 
            exit
 
        else
 
            put "Wrong input, this is a yes or no question.."
 
            delay (400)
 
        end if
 
    end loop
 
    %%
 
    loop
 
        put "Please enter the binary number to subtract.."
 
        get snum2
 
        lsnum2 := length (snum2)
 
        if lsnum2 > 7 then
 
            put "Only 7 bits can be inputed.."
 
        else
 
            exit
 
        end if
 
    end loop
 
    %Setting negative values for loops
 
    if queryn1 = "y" or queryn1 = "yes" or queryn1 = "Yes" or queryn1 = "Y" then
 
        neg1 := 1
 
    end if
 
 
    if queryn2 = "y" or queryn2 = "yes" or queryn2 = "Yes" or queryn2 = "Y" then
 
        neg2 := 1
 
    end if
 
    %Variables
 
    msnum1 := snum1
 
    msnum2 := snum2
 
    %%%%%%%%%
 
    %Zero addition and array input for aosnum1
 
    var difnum1 : int := 8 - lsnum1
 
    for a : 1 .. difnum1
 
        msnum1 := "0" + msnum1
 
    end for
 
 
    for b : 1 .. 8
 
        aosnum1 (b) := strint (msnum1 (b))
 
    end for
 
    %%%%%%%%%%%%
 
    %Zero addition and array input aosnum2
 
    var difnum2 : int := 8 - lsnum2
 
    for c : 1 .. difnum2
 
        msnum2 := "0" + msnum2
 
    end for
 
 
    for d : 1 .. 8
 
        aosnum2 (d) := strint (msnum2 (d))
 
    end for
 
    %%%%%%%%%%%%
 
    %What to do if negatives occur
 
    if neg1 = 1 then
 
        onesComplimentNum1
 
        twosComplimentNum1
 
    end if
 
    if neg2 = 0 then
 
        onesComplimentNum2
 
        twosComplimentNum2
 
    end if
 
    %Run Subtract Procedure
 
    subtract
 
    put ""
 
    put ""
 
    %Overflow error trapping
 
    if aosnum1 (1) = 0 and aosnum2 (1) = 0 and finalAnswer (1) = 1 then
 
        put "The subtraction resulted in an overflow..."
 
        oflow := 1
 
    elsif aosnum1 (1) = 1 and aosnum2 (1) = 1 and finalAnswer (1) = 0 then
 
        put "The subtraction resulted in an overflow..."
 
        oflow := 1
 
    end if
 
    %Ones and Twos compliment of output is negative
 
    if finalAnswer (1) = 1 then
 
        neg := 1
 
        onesComplimentFA
 
        twosComplimentFA
 
    end if
 
    %Proceed with answer only of overflow = 0
 
    if oflow = 0 then
 
        finalAnswerint := strint (osubput)
 
        put "The subtraction of these two values produces.."
 
        if neg = 1 then
 
            put "-", finalAnswerint
 
        elsif neg = 0 then
 
            put finalAnswerint
 
        end if
 
    end if
 
    put ""
 
    put ""
 
    %Another set of calculations?
 
    put "Would you like to calculate another value?"
 
    get query
 
    if query = "y" or query = "yes" or query = "Yes" or query = "Y" then
 
        delay (400)
 
        cls
 
    else
 
        exit
 
    end if
 
end loop
 
%End Program
 
 
  |