Так-с.... Похоже, судьба у меня такая - все ошибки пересчитать.
Дело в том, что я до недавнего времени пользовался только семёрочным/140кб софтом для разработки. Сейчас попытался перейти на ИКП-based и ежедневно сталкиваюсь с какими-то косяками.
Сегодня рассматриваем команду [EXEC.
Эта команда позволяет в ДОК исполнить группу команд из текстового файла.
Более того, она рекомендуется к применению в составе древнего штатного линкера.
Только вот в ИКП она не срабатывает правильно.
Проверено в семёрочной версии 840, аналогичный код есть в девяточном ДОК.
При исполнении команды [EXEC открытие и закрытие текстового файла с командами выполняется примерно тут:
26D8 - A9 00 .. ")." LDA #00
26DA - 85 53 .. ".s" STA 53
26DC - 8D EE 04 ".Н." STA 04EE
26DF - 20 D6 B8 ".V8" JSR B8D6 fopen
26E2 - A9 F0 .. ")П" LDA #F0
26E4 - 85 38 .. ".." STA 38
26E6 - A9 26 .. ")." LDA #26
26E8 - 85 39 .. ".." STA 39
26EA - A9 46 .. ")f" LDA #46
26EC - 8D F5 1B ".У." STA 1BF5
26EF - 60 .. .. "ю" RTS
26F0 - AD FE 04 "-Ч." LDA 04FE feof IF (feof()) { getchar(); } ELSE { fclose(); reset(); };
26F3 - D0 05 .. "P." BNE 26FA
26F5 - A9 EE .. ")Н" LDA #EE
26F7 - 4C E9 1B "lИ." JMP 1BE9 fread
26FA - 20 64 1B ".д." JSR 1B64 memsw
26FD - 20 34 BA "..:" JSR BA34 fclose (shutfile)
2700 - 4C 00 20 "l.." JMP 2000
fopen должна вернуть в ячейке $48 (filenum) номер открытого файла, что она успешно делает. При закрытии файла fclose должна получить этот же номер в той же ячейке. Однако, если вызванная сторонняя прога тоже открывает свои файлы, то значение этой ячейки портится, в результате чего fclose перекашивает изнутри (судя по всему, он не собирается проверять входные параметры и что-то пытается делать).
Он валит сообщение, например, о какой нибудь ошибке, но эта ошибка возвращает управление не в инициализацию сисмона, как задумано по адресу 2700 (jmp 2000), а куда-то ещё, в результате не корректируются вектора чтения символа и всё радостно залипает (чтение после конца файла).
Этой ошибки нет в старой семёрочной Школьнице (140кб):
26FA - 20 64 1B ".д." JSR 1B64
26FD - A9 EE .. ")Н" LDA #EE <==
26FF - 85 48 .. ".h" STA 48
2701 - 20 34 BA "..:" JSR BA34
2704 - 4C 00 20 "l.." JMP 2000
Почему номер файла задаётся как константа, а не сохраняется от fopen
- дело тёмное, но оно работает. Если тоже самое проделать в ИКП-версии (тормознув исполнение и забив в отладчике нужное значение по адресу $48) - то всё тоже корректно срабатывает.