outputStream method

void outputStream()

Implementation

void outputStream() {
  //Debugger.verbose('${pcHex(-1)} [output_stream]');

  var operands = visitOperandsVar(2, true);

  var stream = MathHelper.toSigned(operands[0].value!);

  switch (stream.abs()) {
    case 1:
      outputStream1 = !(stream < 0);
      break;
    case 2:
      outputStream2 = !(stream < 0);
      break;
    case 3:
      if (stream < 0) {
        if (Z.memoryStreams.isEmpty) return;

        //write out to memory
        var addr = Z.memoryStreams.last!;
        Z.memoryStreams.removeLast();

        var data = Z.sbuff.toString();
        Z.sbuff.clear();
        //Debugger.debug('(streams: ${Z._memoryStreams.length}}>>> Writing "$data"');
        mem.storew(addr, data.length);

        addr += 2;

        for (int i = 0; i < data.length; i++) {
          mem.storeb(addr++, ZSCII.charToZChar(data[i]));
        }

        //if the output stream queue is empty then
        if (Z.memoryStreams.isEmpty) {
          outputStream3 = false;
        }
      } else {
        //adding a buffer location to the output stream stack
        outputStream3 = true;
        Z.sbuff.clear();
        Z.memoryStreams.add(operands[1].value);
        // Debugger.debug('>>>> Starting Memory Stream: ${Z.sbuff}');
        if (Z.memoryStreams.length > 16) {
          //(ref 7.1.2.1)
          throw GameException('Maximum memory streams (16) exceeded.');
        }
      }
      break;
    case 4:
      outputStream3 = !(stream < 0);
      break;
  }
}