read method

void read()

Implementation

void read() {
  log.finest("read()");
  //Debugger.verbose('${pcHex(-1)} [read]');

  sendStatus();

  Z.inInterrupt = true;

  Z.printBuffer();

  final operands = visitOperandsVar(4, true);

  final maxBytes = mem.loadb(operands[0].value!);

  var textBuffer = operands[0].value! + 1;

  final maxWords = mem.loadb(operands[1].value!);

  var parseBuffer = operands[1].value! + 1;

  log.fine("read() operands: $operands maxBytes: $maxBytes, textBuffer: $textBuffer, maxWords: $maxWords, parseBuffer: $parseBuffer");

  void processLine(String line) {
    line = line.trim().toLowerCase();

    //Debugger.verbose('    (processing: "$line")');

    if (line.length > maxBytes - 1) {
      line = line.substring(0, maxBytes - 2);
      //Debugger.verbose('    (text buffer truncated to "$line")');
    }

    final zChars = ZSCII.toZCharList(line);

    log.fine("zChars:  $zChars");

    log.fine("textBuffer address: $textBuffer");

    //store the zscii chars in text buffer
    for (final c in zChars) {
      mem.storeb(textBuffer++, c);
    }

    //terminator
    mem.storeb(textBuffer, 0);

    final tokens = Z.engine.mem.dictionary.tokenize(line);

    log.fine('(tokenized: $tokens)');

    final parsed = Z.engine.mem.dictionary.parse(tokens, line);
    log.fine('parsed: $parsed');

    final maxParseBufferBytes = (4 * maxWords) + 2;

    var i = 0;
    for (final p in parsed) {
      i++;
      if (i > maxParseBufferBytes) break;
      mem.storeb(parseBuffer++, p);
    }
  }

  log.finest("sending read command");
  Z.sendIO({"command": ioCommands.read}).then((l) {
    Z.inInterrupt = false;
    if (l == '/!') {
      Z.inBreak = true;
      Debugger.debugStartAddr = programCounter- 1;
      log.finest("read() callAsync(Debugger.startBreak)");
      Z.callAsync(Debugger.startBreak);
    } else {
      log.finest("read() callAsync(Z.runIt)");
      processLine(l);
      log.fine("pc: $programCounter");
      Z.callAsync(Z.runIt);
    }
  });
}