1

I want to translate (or manually compile) my program from c++ into HLA. The program reads an inputted number. Then subtracting off three and tens or only tens, determine if that value ends in a zero or a three. Three such numbers in a row win the game! One value that does not end in those numbers lose the game.

I don't know how can I do a while loop with two conditions joined by an AND operator in HLA.

while ((iend != 1) && (iscore < 3))

This is the full code I wrote in C++ and I want to translate it to HLA:

#include <iostream>
using namespace std;

int main() {
  int inum;
  int iend = 0;
  int iscore = 0;
  int icheckthree; //To check if it ends in 3
  int icheckzero; //To check if it ends in zero

  while ((iend != 1) && (iscore < 3)) {
    cout << "Gimme a number: ";
    cin >> inum;

    //Case 1: ends in three
    icheckthree = inum - 3;
    while (icheckthree > 0) {
      icheckthree = icheckthree - 10;
      if (icheckthree == 0) {
        cout << "It ends in three!" << endl;
        iscore++;
      }
    }

    icheckzero = inum;
    while (icheckzero > 0) {
      icheckzero = icheckzero - 10;
    }
    //Case 2: ends in zero
    if (icheckzero == 0) {
      cout << "It ends in zero!" << endl;
      iscore++;
    }
    //Case 3: Loose the game
    else {
      if (icheckzero != 0) {
        if(icheckthree != 0) {
          iend = 1;
        }
      }
    }
    
    if (iend == 1) {
      cout << "\n";
      cout << "Sorry Charlie!  You lose the game!" << endl;
    }
    else if (iscore == 3) {
      cout << "\n";
      cout << "You Win The Game!" << endl;
    } else {
      cout << "Keep going..." << endl;
      cout << "\n";
    }
  }
}
JaimeVzqz
  • 13
  • 3
  • Usually just two separate cmp/jcc, either one can take you out of the loop. Look at how a C compiler would do it on https://godbolt.org/. (Of course C compilers will use normal asm, not HLA, but the instructions are the same.) – Peter Cordes Oct 24 '21 at 20:10

1 Answers1

0

Use logical transformations.

For example, the statement:

if ( <c1> && <c2> ) { <do-this-when-both-true> }

can be translated to:

if ( <c1> ) {
    if ( <c2> ) {
        <do-this-when-both-true>
    }
}

These two constructs are equivalent, but the latter does not use the conjunction.


A while loop can be taken to if-goto-label as follows:

while ( <condition> ) {
    <loop-body>
}

Loop1:
    if ( <condition> is false ) goto EndLoop1;
    <loop-body>
    goto Loop1;
EndLoop1:

Next, separately, an if statement involving the inversion of a conjunction, &&, as follows:

if ( <c1> && <c2> is false ) goto label;

aka

if ( ! ( <c1> && <c2> ) ) goto label;


Is simplified as such:

if ( ! <c1> || ! <c2> ) goto label;

This is by Demorgan's law of logic that relates negation with conjunction and disjunction.


And, lastly, that above disjunction can be easily simplified (similar to the conjunction simplification from above) as follows:

   if ( ! <c1> ) goto label;
   if ( ! <c2> ) goto label;

If the condition of a while loop is a conjunction (&&), you can put the above transformations together to create a conditional exit disjunction sequence.

Erik Eidt
  • 23,049
  • 2
  • 29
  • 53
  • Yes I made this in the //Case 3: Loose the game else { if (icheckzero != 0) { if(icheckthree != 0) { iend = 1; } } } But I am not sure how to make it work in the while loop – JaimeVzqz Oct 24 '21 at 20:24
  • Logical transformations. Use as many as you need. See my edit. – Erik Eidt Oct 24 '21 at 20:55