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);
}
});
}