Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I need some help with my MARIE Program as I cannot get it to output the correct

ID: 3911695 • Letter: I

Question

I need some help with my MARIE Program as I cannot get it to output the correct output, the following are the requirements of my program:

1) First, I need to allow the program to receive input from a User, in the form of an ASCII character. And once the user inputs an ASCII character of ".", the input loop would terminate.

2) Second, the user inputted into the program and stored in memory has to be transformed via the Rotate 13 subroutine cipher. I am having an issue with how to correctly call this subroutine in my program, as it is only taking in the last known value, the period.

3) Third, once the subroutine has been called, it will take the user ASCII input and transform each letter by rotating it 13 spaces to the right. It keeps getting stuck in the loop.

4) Fourth, after the ROT13 or Rotate 13 cipher loop has completed, it will then output the transformed characters.

Here is what I have so far:

    ORG       100       / Start the program at location 100 hexadecimal

   Load       Start       / Initialize character pointer to start of block
    UserI,   Input
   Store       Ptr
   Load       Ptr
   Subt       ChPe
   Skipcond   400
   Jump       UserI
  

   LoadI       Ptr       / Put 'A' in AC
   Store       InVal       / Store value to be transformed into InVal
   Jns       ROT13       / Jump to the ROT13 subroutine
                   / Upon return, the transformed character is in AC
ROT13,   HEX       0
   Load       InVal       / Get character
   Add       Val13       / Add 13
   Store       Hold       / Save it
   Subt       ChZ       / Check if modulo adjust is needed (past 'Z')
   Skipcond   800       / No adjust needed if past 'Z'
   Jump       NoAdj
   Add       ChA  
   Jump       Done       / Result is in AC

NoAdj,   Load       Hold  
   Store       Ptr  

Done,   JumpI       ROT13       / Return with result in AC

OCycle, LoadI       Ptr
   Store       Ptr
   Subt       ChPe
   Skipcond   400
   Jump       Cont
   Halt

Cont,   Load       Ptr
   Output
   Load       Ptr
   Add       One
   Store       Ptr
   Jump       OCycle
/ -----
/ Constants (the program should not write to these locations)
/ -----
ChA,   HEX       0041       / Constant value 'A' for modulo adjust in subroutine
ChZ,   HEX       005A       / Constant value 'Z' for modulo check in subroutine
ChPe,   HEX       2E       / Constant period character that marks end of input
Val13,   DEC       13       / Constant rotate value of 13 for subroutine
One,   HEX       1       / Constant value 1
Start,   HEX       200       / Constant address for start of character block

/ -----
/ Data area (these locations are for reading and writing)
/ -----
InVal,   HEX       0       / Reserved for subroutine input value
Hold,   HEX       0       / Reserved for temporary variable for subroutine
Ptr,   HEX       0       / Reserved for character pointer

Explanation / Answer

/ *****

ORG 100 / Start the program at location 100 hexadecimal

/ -----

/ Input characters, transform, and store in memory until '.' is input

/ -----

Load Start / Initialize character pointer to start of block

Store Ptr

/>>>>> Add code to accomplish the input and output phases. <<<<<

Input InVal

/>>>>> Here's an example of how subroutine ROT13 is called. <<<<<

/>>>>> We'll just transform 'A' in this example then halt. <<<<<

Load ChA / Put 'A' in AC

Store InVal / Store value to be transformed into InVal

Jns ROT13 / Jump to the ROT13 subroutine

/ Upon return, the transformed character is in AC

Halt

/ -----

/ Rotate-13 subroutine: Apply ROT13 to input character in location InVal and return in AC

/ -----

/>>>>> WARNING: This subroutine *almost* works. You need to fix a bug.

ROT13, HEX 0

Load InVal / Get character

Add Val13 / Add 13

Store Hold / Save it

Subt ChZ / Check if modulo adjust is needed (past 'Z')

Skipcond 800 / No adjust needed if past 'Z'

Jump NoAdj

Add ChA / Add 'A' back to difference to perform modulo

Jump Done / Result is in AC

NoAdj, Load Hold / No adjust needed, get result

Done, JumpI ROT13 / Return with result in AC

/ -----

/ Constants (the program should not write to these locations)

/ -----

ChA, HEX 0041 / Constant value 'A' for modulo adjust in subroutine

ChZ, HEX 005A / Constant value 'Z' for modulo check in subroutine

ChPe, HEX 2E / Constant period character that marks end of input

Val13, DEC 13 / Constant rotate value of 13 for subroutine

One, HEX 1 / Constant value 1

Start, HEX 200 / Constant address for start of character block

/ -----

/ Data area (these locations are for reading and writing)

/ -----

InVal, HEX 0 / Reserved for subroutine input value

Hold, HEX 0 / Reserved for temporary variable for subroutine

Ptr, HEX 0 / Reserved for character pointer