Адрес 6732. Подготовка памяти к загрузке массива. Установите
23784, 23767, 23769 и 23801.

6732  LD DE,(23784);загружать весь файл
      LD (23771),DE
      LD HL,(23767);берем адрес массива в памяти
      LD A,(23801) ;верификация ?
      CP 255
      RET Z        ;если да, то возврат
      LD HL,(23769);берем адрес загрузки файла
      PUSH HL      ;сохраняем его
6753  CALL 6642    ;проверка наличия места для массива
      POP HL       ;восстановление адреса загрузки файла
      LD A,H       ;он равен 0 ?
      OR L
      JR Z,6777    ;если да, то старый массив не убираем
      LD HL,(23767);берем начало старого массива
      DEC HL
      DEC HL
      DEC HL
      LD BC,(23769);берем его длину
      INC BC
      INC BC
      INC BC
      CALL 7726    ;стирание старого массива
6777  LD HL,(23641);берем начало области переменных
      DEC HL
      LD BC,(23784);берем длину файла
      PUSH BC      ;сохраняем ее
      INC BC
      INC BC
      INC BC
      CALL 7730    ;резервирование места для нового массива
      INC HL       ;установка имени массива
      LD A,(23762)
      LD (HL),A
      INC HL       ;восстановление и установка длины массива
      POP DE
      LD (HL),E
      INC HL
      LD (HL),D
      INC HL       ;берем адрес тела массива
      RET          ;возврат
----------------------------------------------------------------
Адрес 6804. Вычисление адреса сектора файла на диске по его но-
меру в файле. Вход: установите 23767 и 23769 и поместите в ре-
гистр B длину файла в секторах, а в DE - адрес файла на диске.
Выход: в DE будет адрес сектора на диске, а в B помещается 1.

6804  LD A,(23769) ;берем номер сектора в файле
      LD C,B
      LD B,A
      LD A,C
      CP B         ;он меньше, чем количество секторов в файле ?
      JR C,6838    ;если нет, то ошибка

Внимание, ошибка!!! Вы не сможете загрузить последний сектор
файла, т.к. его номер равен количеству секторов в файле.

      LD A,B       ;он равен 0 ?
      OR A
      JP Z,7450    ;если да, то синтаксическая ошибка
      DEC B        ;он был равен 1 ?
      JR Z,6832    ;если да, то его адресом будет адрес файла
      LD A,16      ;на дорожке 16 секторов
6823  INC E        ;вычисление адреса сектора на диске
      CP E
      JR NZ,6830
      LD E,0
      INC D
6830  DJNZ 6823
6832  LD B,1       ;загружать надо 1 сектор
      LD HL,(23767);берем адрес загрузки сектора
      RET          ;возврат
6838  LD HL,10733  ;адрес сообщения REC.O/F
      LD A,5       ;код ошибки - 5
      JP 7242      ;обработка ошибки
----------------------------------------------------------------
Адрес 6846. Проверка наличия файла и свободного места в катало-
ге. Имя файла поместите на стек калькулятора.Используется также
с адреса 6852 (проверка наличия свободного места в каталоге дис-
ка).

6846  CALL 10543  ;установка имени и поиск файла
      JP Z,7248   ;если нашли, то FILE EXISTS
6852  CALL 1021   ;загрузка в буфер сектора 8 дорожки 0
      LD A,(24073);на диске 128 файлов ?
      CP 128
      JP Z,10019  ;если да, то сообщение DIRECTORY FULL
      RET         ;иначе возврат
----------------------------------------------------------------
Адрес 6864. Выполнение команды SAVE. Установите 23611 и 23825.
Используется также с адресов:
6951 - запись программы на бейсике. Установите 23773 и 23781.
6995 - запись файла. Установите 23773, 23781, 23767, 23769 и
23771.

6864  CALL 6226    ;обнуление 23824
      LD HL,0      ;автостарт бейсика не производить
      LD (23761),HL
      CALL 7647    ;помещение имени файла на стек калькулятора
      CALL 7564    ;берем текущий символ
      CP 175       ;это CODE ?
      JR Z,6969    ;если да, то прием начала и длины
      CP 202       ;это LINE ?
      JR NZ,6904   ;если нет, то проверка остальных расширений
      CALL 7691    ;прием строки автостарта бейсика
      CALL 7541    ;если проверка на синтаксис, то возврат
      LD HL,(23771);установка строки автостарта бейсика
      LD (23761),HL
      LD HL,23781
      JR 6943      ;переход на запись бейсика
6904  CP 170       ;текущий символ SCREEN$ ?
      JR NZ,6925   ;если нет, то проверка расширения DATA
      LD HL,16384  ;начало файла - 16384
      LD (23767),HL
      LD HL,6912   ;его длина - 6912 байтов
      LD (23769),HL
      LD (23771),HL
      JR 6984      ;запись файла с расширением C
6925  CALL 7541    ;если проверка на синтаксис, то возврат
      CALL 7564    ;берем текущий символ
      LD HL,23781
      CP 228       ;это DATA ?
      JR Z,6956    ;если да, то запись массива
      CP 13        ;это ENTER ?
      JP NZ,7450   ;если нет, то ошибка
      LD (HL),"B"  ;расширение B
      CALL 6846    ;проверка наличия такого файла и свободного места в каталоге
      CALL 7708    ;удаление из командной стpоки пятибайтных чисел
6951  CALL 7134    ;установка начала и длины файла
      JP 6995      ;запись файла
6956  LD (HL),"D"  ;расширение D
      CALL 6846    ;проверка наличия файла и места в каталоге
      CALL 7183    ;установка начала и длины файла
      JR NC,6995   ;если все в порядке, то запись файла
      JP C,7450    ;иначе ошибка
6969  CALL 7653    ;принятие начала и длины файла
      LD HL,(23769);установка начала файла
      LD (23767),HL
      LD HL,(23771);установка длины файла
      LD (23769),HL
6984  CALL 7541    ;если проверка на синтаксис, то возврат
      LD A,"C"     ;расширение C
      LD (23871),A
      CALL 6846    ;проверка наличия файла и места в каталоге
6995  CALL 7001    ;запись файла
      JP 1385      ;запись информации о нем
----------------------------------------------------------------
Адрес 7001. Запись файла. Установите 23761, 23767, 23769 и
23771, а в буфеp загpузите сектоp 8 доpожки 0.

7001  LD HL,(23767);установка начала файла
      LD (23782),HL
      EX DE,HL     ;переброска его в DE
      LD HL,(23769);берем длину файла
      LD A,L       ;она равна 0 ?
      OR H
      JP Z,7450    ;если да, то ошибка
      LD A,L       ;вычисление длины файла в секторах
      OR A
      JR Z,7021
      INC H
7021  LD A,H       ;установка длины файла в секторах
      LD (23786),A
      LD E,A       ;вычисление нового количества свободных секторов
      LD D,0
      LD HL,(24074)
      SBC HL,DE
      JP C,7237    ;если на диске нет места, то ошибка
      PUSH HL      ;сохранение нового количества свободных секторов
      LD HL,(23641);добавление к программе на бейсике байта 170
      LD (HL),170
      INC HL
      LD DE,(23761);и номера строки автостарта
      LD (HL),E
      INC HL
      LD (HL),D
      LD HL,(23771);установка длины файла
      LD (23784),HL
      LD HL,(24070);установка адреса файла на диске
      LD (23787),HL
      EX DE,HL     ;переброска его в DE
      LD HL,(23782);берем начало файла
      LD A,(23786) ;берем его длину в секторах
      LD B,A
      CALL 7757    ;запись файла
      LD HL,(23796);берем адрес свободного пространства диска
      PUSH HL      ;сохраняем его
      CALL 1021    ;загрузка в буфер сектора 8 дорожки 0
      POP HL       ;восстановление адреса свободного места на диске
      LD (24070),HL;установка его
      POP HL       ;восстановление количества свободных секторов
      LD (24074),HL;установка его
      LD HL,(24073);берем номер файла
      LD A,(HL)
      LD (23838),A ;установка его
      INC (HL)     ;записали еще 1 файл
      PUSH HL      ;сохранение адреса с кол-вом файлов на диске
      CALL 7747    ;перезапись сектора 8 дорожки 0
      POP HL       ;восстановкение адреса с кол-вом файлов
      LD C,(HL)    ;берем номер записанного файла
      DEC C
      LD A,(23781) ;расширение файла B ?
      CP "B"
      CALL Z,7112  ;если да, то установка длины программы без переменных
      RET          ;возврат
----------------------------------------------------------------
Адрес 7112. Установка длины программы на бейсике без переменных.
Длину с переменными программа помещает в 23782, длину без пере-
менных - в 23784.

7112  LD HL,(23641);вычисление длины программы с переменными
      LD DE,(23635)
      SCF
      SBC HL,DE
      LD (23782),HL;установка ее
      LD HL,(23627);вычисление длины только программы
      SBC HL,DE
      LD (23784),HL;установка ее
      RET          ;возврат
----------------------------------------------------------------
Адрес 7134. Установка начала и длины файла для записи программы
на бейсике.

7134  LD HL,(23627);вычисление длины программы с переменными
      LD DE,(23635)
      SBC HL,DE
      LD (23771),HL;установка длины файла для каталога
      LD HL,(23635);установка начала файла
      LD (23767),HL
      LD HL,(23641);вычисление длины файла с параметрами автозапуска
      INC HL
      INC HL
      INC HL
      SBC HL,DE
      LD (23769),HL;установка действительной длины файла
      RET          ;возврат
----------------------------------------------------------------
Адpес 7164. Пpиём имени массива для команды LOAD...DATA. Вход:
установите 23645 на pасшиpение файла и установите 23801. Выход:
устанавливает 23762, 23767, 23769 и 23771. Используется также с
адpеса 7183 (то же, что и 7195, но с обработкой ошибок).

7164  CALL 7195    ;поиск массива
      RET NC       ;если массив найден, то возврат
      LD HL,0      ;стаpого массива нет
      LD (23769),HL
      LD A,(23801) ;идёт загpузка ?
      CP 255
      RET NZ       ;если да, то возвpат
      JP 7781      ;ошибка
7183  CALL 7195    ;поиск массива
      RET NC       ;если массив найден, то возврат
7187  LD A,14      ;код ошибки - 14
      LD HL,10205  ;адрес сообшения ARRAY NOT FOUND
      JP 7242      ;обработка ошибок
----------------------------------------------------------------
Адрес 7195. Поиск массива без обработки ошибок. Будут установле-
ны 23762, 23767, 23769 и 23771. При ошибке флаг C будет установ-
лен, иначе сброшен.

7195  CALL 7722    ;берем следующий символ
      CALL 7579    ;поиск массива
      SET 7,C      ;установка бита 7 в его имени
      LD A,C       ;установка его имени
      LD (23762),A
      JR NC,7211   ;если массив найден, то установка его паpаметpов
7209  SCF          ;была ошибка
      RET          ;возврат
7211  JR NZ,7209   ;если флаг Z сбpошен, то ошибка
      INC HL       ;берем длину массива
      LD E,(HL)    ;установка длины массива
      INC HL
      LD D,(HL)
      INC HL
      LD (23767),HL;установка адреса тела массива
      LD (23771),DE;установка длины массива
      LD (23769),DE
      CALL 7722    ;следующий символ
      CP ")"       ;это ")" ?
      JR NZ,7211   ;если нет, то ошибка
      RET          ;возврат
----------------------------------------------------------------
Адрес 7237. Обработка ошибки NO SPACE. Используется также с ад-
реса 7242 (обработка ошибок; в A - код ошибки, в HL - адрес со-
общения).

7237  LD HL,10683;адрес сообщения NO SPACE
      LD A,3     ;код ошибки - 3
7242  CALL 963   ;если надо, то печать сообщения
      JP 467     ;завершение
----------------------------------------------------------------
Адрес 7248. Обработка ошибки FILE EXISTS.

7248  LD HL,10693;адрес сообщения FILE EXISTS
      LD A,2     ;код ошибки - 2
      JR 7242    ;обработка ошибок
----------------------------------------------------------------
Адрес 7255. Установка имени файла. Установите 23645 на имя фай-
ла. Будет выбран дисковод и установлена переменная 23773.

7255  LD HL,23773;адрес переменной с именем файла
      LD B,8     ;ее длина - 8 байтов
7260  LD (HL)," ";очистка ее
      INC HL
      DJNZ 7620
      CALL 1329  ;снятие строки со стека калькулятора
      EX DE,HL
      CALL 7297  ;установка дисковода
      LD A,C     ;имя файла - пустая строка ?
      OR A

Ошибка в программе!!! Здесь должно быть OR B.

      JP Z,7450  ;если да, то ошибка
      CP 9       ;в имени файла больше 8 символов
      JR Z,7283  ;если да, то обрезаем его
      LD C,8

Внимание!!! Это будет работать неправильно при длине имени файла
больше 255 символов.

7283  LD A,(HL)  ;берем первый символ имени файла
      CP " "     ;его код меньше 32 ?
      JP C,7450  ;если да, то ошибка
      LD DE,23773;адрес переменной с именем файла
      PUSH BC    ;сохранение длины имени
      LDIR       ;установка имени
      POP BC     ;восстановление длины имени
      RET        ;возврат
----------------------------------------------------------------
Адрес 7297. Установка дисковода для операции с файлом. В HL по-
местите начало имени файла в ASCII представлении, а в BC - его
длину. HL установится на начало имени без дисковода, а в BC бу-
дет его длина.

7297  INC HL      ;берем адрес следующего символа имени
      LD A,(HL)   ;берем этот символ
      CP ":"      ;это двоеточие ?
      JR NZ,7230  ;если нет, то активизация дисковода по умолчанию
      DEC HL      ;берем адрес имени дисковода
      LD A,(HL)   ;берем имя дисковода
      CALL 1316   ;преобразование имени дисковода в его номер
      PUSH BC     ;сохранение длины имени файла
      PUSH HL     ;и адреса имени дисковода
      CALL 15819  ;выбор дисковода
      POP HL      ;восстановление адреса имени дисковода 
      POP BC      ;и длины имени файла
      DEC BC      ;отсекли 2 символа
      DEC BC
      INC HL      ;берем адрес имени файла без дисковода
      INC HL
      RET         ;возврат
7320  DEC HL      ;берем адрес имени файла
      LD A,(23833);берем дисковод по умолчанию
      PUSH BC     ;сохранение длины и адреса имени файла
      PUSH HL
      CALL 15819  ;выбор дисковода
      POP HL      ;восстановление длины и адреса имени файла
      POP BC
      RET         ;возврат
----------------------------------------------------------------
Адрес 7332. Определение адреса описателя файла в буфере по его
номеру в секторе. В C должен быть номер описателя в секторе. На
выходе в HL будет его адрес.

7332  LD L,C     ;перевод номера описателя файла в двухбайтную
      LD H,0     ;форму
      ADD HL,HL  ;умножние его на 16
      ADD HL,HL
      ADD HL,HL
      ADD HL,HL
      LD BC,23845;адресуемся от начала буфера
      ADD HL,BC
      RET        ;возврат
----------------------------------------------------------------
Адрес 7344. Установка и проверка имени файла. Имя файла должно
быть помещено на стек калькулятора. Выход: если файл с таким
именем есть, то будет установлен флаг Z, а в рег. C и в 23838
будет его номер, а если такого файла нет, то флаг Z сбросится.
Использутся также с адреса 7347 (пойск файла, установите 23773 и
23781, выход как и из 7344).

7344  CALL 7255   ;установка имени файла
7347  CALL 1000   ;начнем с сектора 0
      LD B,128    ;всего 128 файлов
      LD C,0      ;начнем с нулевого описателя в секторе
7354  PUSH BC     ;сохраним номер файла и счетчик
      CALL 7332   ;определим начало описателя в буфере
      CALL 1292   ;проверка и обработка достижения конца буфера
      POP BC      ;восстановление номера описателя в секторе и
      PUSH BC     ;счетчика файлов без изменения стека
      LD A,C      ;просмотрен весь сектор ?
      CP 16
      JR NZ,7373  ;если да, то
      POP BC      ;снятие номера описателя и счетчика со стека
      LD C,0      ;нулевой описатель в секторе
      JR 7354     ;повтор проверки
7373  LD DE,23773 ;берем адрес части описателя для проверки
      LD A,(23814);берем длину этой части
      LD B,A
      XOR A       ;конец каталога ?
      CP (HL)
      JR NZ,7387  ;если нет, то переход на проверку описателя
      POP BC      ;снятие номера описателя и счетчика со стека
      JR 7396     ;выход с флагом NZ
7387  CALL 10003  ;сравнение частей описателей
      POP BC      ;восстановление номера описателя и счетчика
      JR Z,7399   ;если части описателей совпали, то на выход
      INC C       ;следующий описатель
      DJNZ 7354   ;повтор до конца
7396  OR 255      ;выключение флага Z
      RET         ;возврат
7399  LD A,128    ;опредление номера файла
      SUB B
      LD C,A
      LD (23838),A;помещение его в 23838
      XOR A       ;сброс флага Z
      RET Z       ;возврат
----------------------------------------------------------------
Адрес 7408. Поиск файла. Часть описателя, подлежещую проверке,
установите по адресу 23773 и устеновите 238814. Если файл не
найдн, то будет сброшен флаг Z и в 23823 будет 255, а если най-
ден, то включится флаг Z, а номер файла будет в рег. C и по ад-
ресам 23823 и 23838.

7408  CALL 7347  ;поиск файла
      LD HL,23823
      LD (HL),C  ;загрузка регистра C в 23823
      RET Z      ;если файл найден, то возврат
      LD (HL),255;помещаем в 23823 255
      RET        ;возврат
----------------------------------------------------------------
Адpес 7419. Выполнение команды RETURN. Установите 23611, 23836 и
23827.

7419  CALL 7541    ;если идёт пpовеpка на синтаксис, то возвpат
      CALL 8421    ;изменение памяти
      RES 3,(IY+1) ;установка pежима ввода "K"
      CALL 562     ;восстановление стаpого ERR_SP
      LD SP,(23836);восстановление стека
      LD HL,(23613);беpём адpес пеpед адpесом из ERR_SP
      DEC HL
      LD A,18      ;там находится 18 ?
      CP (HL)
      JR NZ,7449   ;если нет, то возвpат
      DEC HL       ;установка ERR_SP на адpес ниже
      LD (23613),HL
7449  RET          ;возвpат
----------------------------------------------------------------
Адрес 7450. Обработка синтаксической ошибки. Установите 23610,
23822, 23829, и все для подпрограммы 467. Используется также с
адреса 7465 (обработка ошибок; в A - код ошибки, в HL - адрес
сообшения).

7450  BIT 7,(IY+0);код ошибки бейсика уже назначен ?
      JR Z,7461   ;если нет, то установка ошибки
      LD A,11     ;NONSENCE IN BASIC
      LD (23610),A
7461  INC A       ;получение кода ошибки DOS
      LD HL,10674 ;адрес сообщения ERROR
7465  CALL 963    ;печать сообщения, если можно
      JP 467      ;завершение
----------------------------------------------------------------
Адрес 7471. Обработка ошибки, поступившей из пзу бейсика без
очистки стека. Установите 23610.

7471  LD A,(23610);берем код ошибки бейсика
      LD HL,10186 ;адрес сообщения *BREAK*
      CP 20       ;BREAK INTO PROGRAM ?
      JR Z,7465   ;если да, то печать сообщения
      CP 12       ;BREAK - CONT REPEATS ?
      JR Z,7465   ;если да, то печать сообщения
      LD HL,10194 ;адрес сообщения OUT OF RAM
      CP 3        ;OUT OF MEMORY ?
      JR Z,7465   ;если да, то печать сообщения
      LD HL,10205 ;адрес сообщения ARRAY NOT FOUND
      CP 1        ;VARIABLE NOT FOUND ?
      JR Z,7465   ;если да, то печать сообщения
      JR 7450     ;иначе сообщение *ERROR*
----------------------------------------------------------------
Адpес 7501. Выполнение команды RUN. Установите 23825 и 23611.

7501  CALL 6226    ;выполнять загpузку файла
      CALL 6198    ;обpаботка паpаметpов и загpузка файла
      CALL 7541    ;если идёт пpовеpка на синтаксис, то возвpат
      LD HL,(23782);беpём адpес загpузки файла по умолчанию

Ошибка!!! Ведь файл могли загpузить и по дpугому адpесу. В под-
пpогpамме 6315 надо сохpанять в 23840 действительный адpес заг-
pузки файла, а здесь восстанавливать его.

      LD A,(23781) ;pасшиpение файла B ?
      CP "B"
      JP Z,298     ;если да, то запуск пpогpаммы на бейсике
      PUSH HL      ;запуск пpогpаммы в кодах
      RET

Боже!!! Hу кто так делает!!! Во-пеpвых, адpес пpогpаммы пpи за-
пуске должен быть в BC; во-втоpых, надо совсем выйти из TR-DOS,
иначе пpогpамма спятит пpи вызове 15635; в тpетьих, куда пpог-
pамма будет возвpащаться ?; в четвёpтых... В общем, надо так
(после CALL 7541):
      LD A,(23781)
      CP "D"
      JP Z,7450
      CP "B"
      JP Z,298
      LD HL,START
      LD (23834),HL
      JP 467
-------------------
START CALL 562
      LD BC,(23840)
      PUSH BC
      RET
----------------------------------------------------------------
Адрес 7523. Очистка pабочей области памяти.

7523  LD HL,23822;pабочую область очищать ?
      LD A,(HL)
      CP 255
      LD (HL),0  ;pабочая область очищена
      RET NZ     ;если pабочая область очищена, то возврат
      RST 32     ;очистка pабочей области
      DEFW #16BF
      RET        ;возврат
----------------------------------------------------------------
Адрес 7536. Проверка, идет ли проверка строки на синтаксис или
выполнение команды. Если идет выполнение, то флаг Z будет сбро-
шен, иначе установлен.

7536  BIT 7,(IY+1)
      RET
----------------------------------------------------------------
Адрес 7541. Если идет проверка на синтаксис, то возврат из прог-
раммы, вызвавшей эту подпрограмму. Установите 23611.

7541  CALL 7536;проверка, что делается
      RET NZ   ;если идет выполнение, то возврат
      POP HL   ;снятие адреса возврата в вашу программу
      RET      ;возврат по следующему адресу
----------------------------------------------------------------
Адрес 7547. Помещение числа на стек калькулятора. Установите
23645 на символ перед числом. Если строка проверяется на синтак-
сис, то будет установлен флаг Z, а при выполнении он сброшен.

7547  CALL 7722;берем следующий символ строки
      CALL 7617;помещение числа на стек калькулятора
      JR 7536  ;проверка, идет выполнение или проверка и возврат
----------------------------------------------------------------
Адрес 7555. Открытие потока 0. Используется также с адреса 7556
(открытие потока; номер в регистре A).

7555  XOR A     ;номер потока - 0
7556  RST 32    ;открытие потока
      DEFW #1601
      RET       ;возврат
----------------------------------------------------------------
Адpес 7560. Откpытие потока 2.

7560  LD A,2 ;номеp потока - 2
      JR 7556;откpытие потока
----------------------------------------------------------------
Адрес 7564. Выборка текущего символа строки. Поместите его адрес
в 23645.

7564  RST 32
      DEFW #0018
      RET
----------------------------------------------------------------
Адpес 7568. Ввод команды.

7568  CALL 7555 ;откpытие потока 0
      RST 32    ;pедактиpование командной стpоки
      DEFW #0F2C
      RET       ;возвpат
----------------------------------------------------------------
Адрес 7575. Очистка экрана и открытие потока 0.

7575  RST 32
      DEFW #0D6B
      RET
----------------------------------------------------------------
Адрес 7579. Поиск массива. Установите 23645 на имя массива. Если
массив найден, то в HL будет его адрес.

7579  RST 32
      DEFW #28B2
      RET
----------------------------------------------------------------
Адpес 7583. Очистка низа экpана.

7583  RST 32
      DEFW #0D6E
      RET
Яндекс.Реклама
Hosted by uCoz