/************************************************************************************/ /* StoreInArray: */ /* Input: AC: address of a[0] */ /* ExpS0: index into a */ /* ExpS1: value to store */ /* Operation: a[ExpS0] = ExpS1; */ /* For example if AC=30, ExpS0=5, and ExpS1=72, then a[5]=72; */ /************************************************************************************/ StoreInArray, Hex 0 / Entry Point and Return Address / AC holds address of a[0] (eg 30) Add ExpS0 / Address of a[ExpS0] which is 35 Add StoreC / Add the command 2 to the front of the 35 / producing the command 2035. / This is the machine code for "Store 35" / which stores the value in AC into the cell addressed by 35 Store MadeC / Write this machine code where we need to execute it Load ExpS1 / Loads ExpS1 which is 72 into the accumulator MadeC, Hex 0 / Execute the machine code 2035 stored here / This stores the 72 in memory cell 35. JumpI StoreInArray / Return StoreC, Hex 2000 / The MARIE assembly code for "Store X" has the machine / code 2035 when x is memory cell 35 /************************************************************************************/ /* MStoreInArray: Same as StoreInArray but ExpSm changed to MExpSm for Mult & Div */ /************************************************************************************/ MStoreInArray, Hex 0 / Entry Point and Return Address / AC holds address of a[0] (eg 30) Add MExpS0 / Address of a[MExpS0] which is 35 Add StoreC / Add the command 2 to the front of the 35 / producing the command 2035. / This is the machine code for "Store 35" / which stores the value in AC into the cell addressed by 35 Store MMadeC / Write this machine code where we need to execute it Load MExpS1 / Loads MExpS1 which is 72 into the accumulator MMadeC, Hex 0 / Execute the machine code 2035 stored here / This stores the 72 in memory cell 35. JumpI MStoreInArray / Return /************************************************************************************/ /* Copy: A block of data is copied */ /* Input: CopyA is the address of first value to copy */ /* CopyB is the address of first cell to be copied to */ /* CopyL is the number of cells to be copied */ /************************************************************************************* Copy, Hex 0 / Entry Point and Return Address Load CopyB / Address of first cell to be copied to (say address is 35) Add StoreC / Add the command 2 to the front of the 35 / producing the command 2035. / This is the machine code for "Store 35" / which stores the value in AC into the cell addressed by 35 Store MadeC2 / Write this machine code where we need to execute it NextV, Clear AddI CopyA / Loads value to copy (say value is 72) MadeC2, Hex 0 / Execute the machine code 2035 stored here / This stores the 72 in memory cell 35. Load MadeC2 / Increment address in command giving where to copy to Add One Store MadeC2 Load CopyA / Increment address of value to copy Add One Store CopyA Load CopyL / Decrement CopyL to number of values left to copy Subt One Store CopyL Skipcond 400 / Skip if CopyL=0 because done copying values Jump NextV / Go copy next value JumpI Copy / Return CopyA, Hex 0 / Address of first value to copy CopyB, Hex 0 / Address of first cell to be copied to CopyL, Hex 0 / Number of cells to be copied /************************************************************************************/ /* Mult: */ /* Input: x,y (each <= 2^15-1 = 32767) */ /* Output: z = x*y */ /* Uses: */ /* Multa[i] = 2^i */ /* Multb[i] = 2^i * y */ /* i index for Multa & Multb */ /* neg boolean sign flag */ /* MExpS0,MExpS1,MExpS2,MExpS3 Same as ExpSm */ /* */ /* Written by Jeff See notes for proof of correctness */ /************************************************************************************* Mult, Hex 0 / Entry Point and Return Address /GetAssignmentv: neg = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetAss: neg = MExpS0; Load MExpS0 Store neg /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = x; Load Mx Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 0; Clear Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 000 Jump M002 /Jump over data line Load One Jump M003 /Jump over data line M002, Clear M003, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M000 /Else Jump to ElseCode /GetAssignmentv: x = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = x; Load Mx Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: x = MExpS0; Load MExpS0 Store Mx /GetAssignmentv: neg = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 1; Load One Store MExpS0 /GetAss: neg = MExpS0; Load MExpS0 Store neg Jump M001 /Jump to EndIf M000, Clear /ElseCode M001, Clear /EndIf /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multa JnS MStoreInArray /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = y; Load My Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multb JnS MStoreInArray /GetAssignmentv: i = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetAss: i = MExpS0; Load MExpS0 Store Mi /GetWhileStatement: M005, Clear /TopWhile /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = Multa[Exp]; /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = i; Load Mi Store MExpS1 Load Multa /Load address of Multa[0] Add MExpS1 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS0 /Save it /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = x; Load Mx Store MExpS1 Load MExpS0 Subt MExpS1 Subt One SkipCond 000 Jump M006 /Jump over data line Load One Jump M007 /Jump over data line M006, Clear M007, Store MExpS0 SkipCond 800 /If(true) Skip to code in while Jump M004 /Else Jump to EndWhile /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multa /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS2 = next term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = Multa[Exp]; /GetExp: MExpS3 = Exp = Term + ... + Term; /GetTerm: MExpS3 = Term = Fact * ... * Fact; /GetFact: MExpS3 = i; Load Mi Store MExpS3 Load Multa /Load address of Multa[0] Add MExpS3 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS2 /Save it /GetExp: MExpS1 = MExpS1 + MExpS2 Load MExpS1 Add MExpS2 Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multa JnS MStoreInArray /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multb /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS2 = next term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = Multa[Exp]; /GetExp: MExpS3 = Exp = Term + ... + Term; /GetTerm: MExpS3 = Term = Fact * ... * Fact; /GetFact: MExpS3 = i; Load Mi Store MExpS3 Load Multb /Load address of Multa[0] Add MExpS3 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS2 /Save it /GetExp: MExpS1 = MExpS1 + MExpS2 Load MExpS1 Add MExpS2 Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multb JnS MStoreInArray /GetAssignmentv: i = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetAss: i = MExpS0; Load MExpS0 Store Mi Jump M005 /Jump back to TopWhile M004, Clear /EndWhile /GetAssignmentv: z = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetAss: z = MExpS0; Load MExpS0 Store Mz /GetWhileStatement: M009, Clear /TopWhile /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 0; Clear Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 800 Jump M010 /Jump over data line Load One Jump M011 /Jump over data line M010, Clear M011, Store MExpS0 SkipCond 800 /If(true) Skip to code in while Jump M008 /Else Jump to EndWhile /GetAssignmentv: i = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: i = MExpS0; Load MExpS0 Store Mi /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = Multa[Exp]; /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = i; Load Mi Store MExpS1 Load Multa /Load address of Multa[0] Add MExpS1 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS0 /Save it /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = x; Load Mx Store MExpS1 Load MExpS0 Subt MExpS1 Subt One SkipCond 000 Jump M014 /Jump over data line Load One Jump M015 /Jump over data line M014, Clear M015, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M012 /Else Jump to ElseCode /GetAssignmentv: x = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = x; Load Mx Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multa /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: x = MExpS0; Load MExpS0 Store Mx /GetAssignmentv: z = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = z; Load Mz Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multb /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetAss: z = MExpS0; Load MExpS0 Store Mz Jump M013 /Jump to EndIf M012, Clear /ElseCode M013, Clear /EndIf Jump M009 /Jump back to TopWhile M008, Clear /EndWhile /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = neg; Load neg Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 400 Jump M018 /Jump over data line Load One Jump M019 /Jump over data line M018, Clear M019, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M016 /Else Jump to ElseCode /GetAssignmentv: z = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = z; Load Mz Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: z = MExpS0; Load MExpS0 Store Mz Jump M017 /Jump to EndIf M016, Clear /ElseCode M017, Clear /EndIf JumpI Mult / Return Mx, Hex 0 / Input to Mult & Div My, Hex 0 / Input to Mult & Div Mz, Hex 0 / Output from Mult & Div Mi, Hex 0 / index for Multa used Mult & Div neg, Hex 0 / saves if x is negative used Mult & Div MExpS0, Hex 0 / Same as ExpSm MExpS1, Hex 0 MExpS2, Hex 0 MExpS3, Hex 0 /************************************************************************************/ /* Div: */ /* Input: x,y (each <= 2^15-1 = 32767) */ /* Output: z = x/y (Also computes the remainder) */ /* x' = x%y is remainder */ /* i.e. z and x' so that x=z*y+x' and x' in [0,y) */ /* Uses: */ /* Multa[i] = 2^i */ /* Multb[i] = 2^i * y */ /* i index for Multa & Multb */ /* neg boolean sign flag */ /* */ /* Written by Jeff See notes for proof of correctness */ /************************************************************************************* Div, Hex 0 / Entry Point and Return Address /GetAssignmentv: neg = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetAss: neg = MExpS0; Load MExpS0 Store neg /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = x; Load Mx Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 0; Clear Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 000 Jump M022 /Jump over data line Load One Jump M023 /Jump over data line M022, Clear M023, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M020 /Else Jump to ElseCode /GetAssignmentv: x = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = x; Load Mx Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: x = MExpS0; Load MExpS0 Store Mx /GetAssignmentv: neg = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 1; Load One Store MExpS0 /GetAss: neg = MExpS0; Load MExpS0 Store neg Jump M021 /Jump to EndIf M020, Clear /ElseCode M021, Clear /EndIf /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = y; Load My Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 0; Clear Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 000 Jump M026 /Jump over data line Load One Jump M027 /Jump over data line M026, Clear M027, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M024 /Else Jump to ElseCode /GetAssignmentv: y = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = y; Load My Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: y = MExpS0; Load MExpS0 Store My /GetAssignmentv: neg = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 1; Load One Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = neg; Load neg Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: neg = MExpS0; Load MExpS0 Store neg Jump M025 /Jump to EndIf M024, Clear /ElseCode M025, Clear /EndIf /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multa JnS MStoreInArray /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = y; Load My Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multb JnS MStoreInArray /GetAssignmentv: i = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetAss: i = MExpS0; Load MExpS0 Store Mi /GetWhileStatement: M029, Clear /TopWhile /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = Multa[Exp]; /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = i; Load Mi Store MExpS1 Load Multb /Load address of Multa[0] Add MExpS1 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS0 /Save it /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = x; Load Mx Store MExpS1 Load MExpS0 Subt MExpS1 Subt One SkipCond 000 Jump M030 /Jump over data line Load One Jump M031 /Jump over data line M030, Clear M031, Store MExpS0 SkipCond 800 /If(true) Skip to code in while Jump M028 /Else Jump to EndWhile /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multa /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS2 = next term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = Multa[Exp]; /GetExp: MExpS3 = Exp = Term + ... + Term; /GetTerm: MExpS3 = Term = Fact * ... * Fact; /GetFact: MExpS3 = i; Load Mi Store MExpS3 Load Multa /Load address of Multa[0] Add MExpS3 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS2 /Save it /GetExp: MExpS1 = MExpS1 + MExpS2 Load MExpS1 Add MExpS2 Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multa JnS MStoreInArray /GetAssignmenta: Multa[Exp] = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multb /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS2 = next term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = Multa[Exp]; /GetExp: MExpS3 = Exp = Term + ... + Term; /GetTerm: MExpS3 = Term = Fact * ... * Fact; /GetFact: MExpS3 = i; Load Mi Store MExpS3 Load Multb /Load address of Multa[0] Add MExpS3 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS2 /Save it /GetExp: MExpS1 = MExpS1 + MExpS2 Load MExpS1 Add MExpS2 Store MExpS1 /GetAssignment: Multa[MExpS0] = MExpS1; Load Multb JnS MStoreInArray /GetAssignmentv: i = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetAss: i = MExpS0; Load MExpS0 Store Mi Jump M029 /Jump back to TopWhile M028, Clear /EndWhile /GetAssignmentv: z = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetAss: z = MExpS0; Load MExpS0 Store Mz /GetWhileStatement: M033, Clear /TopWhile /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 0; Clear Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 800 Jump M034 /Jump over data line Load One Jump M035 /Jump over data line M034, Clear M035, Store MExpS0 SkipCond 800 /If(true) Skip to code in while Jump M032 /Else Jump to EndWhile /GetAssignmentv: i = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = i; Load Mi Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: i = MExpS0; Load MExpS0 Store Mi /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = Multa[Exp]; /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = i; Load Mi Store MExpS1 Load Multb /Load address of Multa[0] Add MExpS1 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS0 /Save it /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = x; Load Mx Store MExpS1 Load MExpS0 Subt MExpS1 Subt One SkipCond 000 Jump M038 /Jump over data line Load One Jump M039 /Jump over data line M038, Clear M039, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M036 /Else Jump to ElseCode /GetAssignmentv: x = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = x; Load Mx Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multb /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: x = MExpS0; Load MExpS0 Store Mx /GetAssignmentv: z = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = z; Load Mz Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = Multa[Exp]; /GetExp: MExpS2 = Exp = Term + ... + Term; /GetTerm: MExpS2 = Term = Fact * ... * Fact; /GetFact: MExpS2 = i; Load Mi Store MExpS2 Load Multa /Load address of Multa[0] Add MExpS2 /Add the value i=Exp to address of Multa[0] for address of Multa[i] Store Temp0 Clear AddI Temp0 /Load the value of Multa[i] Store MExpS1 /Save it /GetExp: MExpS0 = MExpS0 + MExpS1 Load MExpS0 Add MExpS1 Store MExpS0 /GetAss: z = MExpS0; Load MExpS0 Store Mz Jump M037 /Jump to EndIf M036, Clear /ElseCode M037, Clear /EndIf Jump M033 /Jump back to TopWhile M032, Clear /EndWhile /GetIfStatement: /GetBooleanExp: MExpS0 = BooleanExp = BooleanTerm || ... || BooleanTerm; /GetBooleanTerm: MExpS0 = BooleanTerm = BooleanFact && ... && BooleanFact; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = neg; Load neg Store MExpS0 /GetExp: MExpS1 = Exp = Term + ... + Term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = 1; Load One Store MExpS1 Load MExpS0 Subt MExpS1 SkipCond 400 Jump M042 /Jump over data line Load One Jump M043 /Jump over data line M042, Clear M043, Store MExpS0 SkipCond 800 /If(true) Skip to 1st block of code Jump M040 /Else Jump to ElseCode /GetAssignmentv: z = Exp; /GetExp: MExpS0 = Exp = Term + ... + Term; /GetTerm: MExpS0 = Term = Fact * ... * Fact; /GetFact: MExpS0 = 0; Clear Store MExpS0 /GetExp: MExpS1 = next term; /GetTerm: MExpS1 = Term = Fact * ... * Fact; /GetFact: MExpS1 = z; Load Mz Store MExpS1 /GetExp: MExpS0 = MExpS0 - MExpS1 Load MExpS0 Subt MExpS1 Store MExpS0 /GetAss: z = MExpS0; Load MExpS0 Store Mz Jump M041 /Jump to EndIf M040, Clear /ElseCode M041, Clear /EndIf JumpI Div /************************************************************************************/ /* PrintDec: */ /* Input: x is an integer */ /* Output on screen x in ascii */ /* Uses: */ /* y,z,Multa,Multb,i,neg,MExpSm: Used by Div */ /* ExpS0,ExpS1: used by MStoreInArraya */ /* DecStr: Write the ascii in reverse */ /* ExpS0: index for DecStr */ /* */ /* Written by Jeff */ /************************************************************************************* PrintDec, Hex 0 / Entry Point and Return Address Load Ten Store ExpS0 / Next place to store a character is DecStr[Exp0] (assume #digits is at most 10) Load Ten Store My / We divide by 10 to get base 10 NextD, JnS Div / Divide z = x/10 x = x%10 Load Mx / Remainder is next low order digit Add Ascii0 / Cast digit into Ascii Store ExpS1 / Store next Ascii digit in ExpS1 Load DecStr / Address of DecStr[0] JnS StoreInArray / DecStr[ExpS0] = ExpS1 Load ExpS0 / --ExpS0 Subt One Store ExpS0 / Next place to store a character is DecStr[Exp0] Load Mz / The remaining high order digits of our number. Store Mx / is put back into x to be printed Skipcond 400 / Skip if x=0 because done getting digits Jump NextD / Go get next digit / done getting digits Load Ten / Where ExpS0 started Subt ExpS0 / # of digits to be printed Store StrL / Input to subroutine PrintStr Load DecStr / Address of DecStr[0] Add ExpS0 / Address of DecStr[ExpS0] Add One / Address of DecStr[ExpS0+1] is first Char to print Store Str / Input to subroutine PrintStr JnS PrintStr / Print the string JumpI PrintDec / Return Ten, Dec 10 / 10 for computing base 10 Ascii0, Dec 48 / Ascii for '0' /************************************************************************************/ /* PrintStr: */ /* Input: Str is address of first char in string to output */ /* StrL is number of characters to be outputted */ /* Output on screen string in ascii */ /************************************************************************************* PrintStr, Hex 0 / Entry Point and Return Address NextC, Clear AddI Str / Load next character to be printed Output / Output character Load Str / Increment Str to next character Add One Store Str Load StrL / Decrement StrL to number of characters left Subt One Store StrL Skipcond 400 / Skip if StrL=0 because done printing characters Jump NextC / Go print next character JumpI PrintStr / Return Str, Hex 0 / address of first char in string to output StrL, Hex 0 / number of characters to be outputted AsciiCR, Dec 13 / Ascii for carriage return /************************************************************************************/ /************************************************************************************/ /* */ /* The compiled MARIE code */ /* ------------------------- */ /* */ /************************************************************************************/ /************************************************************************************/ Start, Load StackB Store StackP / Initialize the Stack pointer (incase code run more than once.) JnS J_main Halt