Май 2019
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031  

Календарь Календарь

Последние темы
» Эмулятор радио 86рк
автор parsec Вчера в 18:44

» Эмулятор ИРИШИ для тех, кто не имеет её реальной
автор barsik Вчера в 18:38

» Новинки. Книги. Часть 1.
автор Viktor2312 Вт Май 21 2019, 16:21

» Программирование для ИРИШИ
автор barsik Пн Май 20 2019, 21:14

» Новинки. Книги. Часть 3.
автор Viktor2312 Пн Май 20 2019, 16:38

» Модуль контроллера графического дисплея (МКГД).
автор barsik Вс Май 19 2019, 13:40

» ATM Turbo 2+ v7.10
автор alemorf Сб Май 18 2019, 20:03

» Схемы и документация на отечественные ЭВМ и ПЭВМ и комплектующие
автор Viktor2312 Сб Май 18 2019, 18:10

» Куплю микросхемы КР1818ВГ93 и КМ1810ВТ3.
автор Savoj Чт Май 16 2019, 07:51

» Радио-86РК: Расширение ОЗУ
автор barsik Чт Май 16 2019, 01:26

» Клавиатура ИРИШИ
автор barsik Ср Май 15 2019, 16:57

» ИРИША и магнитофон
автор barsik Пн Май 13 2019, 04:23

» Новости криптовалют: статьи, заметки, разное...
автор Viktor2312 Сб Май 11 2019, 03:01

» Жалобы/пожелания по работе форума
автор Viktor2312 Сб Май 11 2019, 00:50

» Альтернативные КНГМД для ИРИШИ
автор barsik Пт Май 10 2019, 01:12

» Видеокарты (GPU). Статьи, заметки, очерки, разное...
автор Viktor2312 Чт Май 09 2019, 19:55

» Алгоритм SHA-256 и др., хеш (hash), хеширование, майнинг.
автор Viktor2312 Чт Май 09 2019, 01:30

» Обсуждение желаемых новодельных плат расширения и мелких усовершенствований базовых плат
автор barsik Ср Май 08 2019, 16:06

» Разное
автор Viktor2312 Вт Май 07 2019, 19:19

» Для новичков (криптовалюта).
автор Viktor2312 Вт Май 07 2019, 17:32

» Ассемблер для современных CPU Intel.
автор Viktor2312 Вт Май 07 2019, 17:12

» МКНГМД Вариант-3. Версия на К1818ВГ93
автор barsik Вт Май 07 2019, 15:15

» Обзор крипто проектов.
автор Viktor2312 Вт Май 07 2019, 12:57

» 7 Мая. День Радио!
автор Viktor2312 Вт Май 07 2019, 12:00

» "Радио-86РК". Статьи, заметки, очерки, разное...
автор barsik Сб Май 04 2019, 20:20

Самые активные пользователи за месяц
Viktor2312
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
barsik
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
alemorf
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
demetrius2003
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
a.oleg.a
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
parsec
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
Savoj
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 
VladimirS
Программное обеспечение (ПО) общая тема. Vote_lcapПрограммное обеспечение (ПО) общая тема. Voting_barПрограммное обеспечение (ПО) общая тема. Vote_rcap 

Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск


Программное обеспечение (ПО) общая тема.

Перейти вниз

Программное обеспечение (ПО) общая тема. Empty Программное обеспечение (ПО) общая тема.

Сообщение  Viktor2312 в Пт Ноя 04 2016, 12:36

1
Данная тема предназначена для различного обсуждения программного обеспечения (ПО) для ПЭВМ "Ириша", "Ириша-Л", "Ириша-М" и других модификаций. Тут можно обсудить поиск уже имеющегося ПО или написание своего ПО. В общим тема для общения и обсуждения разного ПО для ПЭВМ "Ириша".

Из того, что по идее возможно найти, или оно уже есть:

---
1. Текстовый редактор IRITEXT
2. FORTH INTERV (разработка авторов Ириши)
3. игра STAKAN
4. IBASIC
5. RTV
6. SMON
---

---
01. Резидентное ПО (в кодах, прошивках микросхем)
02. ОС "IRISHA" с утилитами POWER, DDT, CONFIG, M&O, LINK, SID
03. Бэйсик FS-III. Бэйсик = MBas + GRAFIC
04. FORTRAN (F80)
05. FORTH (разработка авторов "ИРИШИ")
06. PASCAL MT+
07. C BDS 1.50
08. Редакторы WORDSTAR, WORDMASTER, IRITEXT, графический монохромный редактор PIC (все это комплект программ "ДОКУМЕНТ")
09. D BASE II (база данных)
10. Демонстрационные программы 3-4 шт.
11. Игровые программы 3-4 шт.
---

Viktor2312
Viktor2312
Гуру+

Сообщения : 11568
Дата регистрации : 2012-08-10
Возраст : 40
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty Re: Программное обеспечение (ПО) общая тема.

Сообщение  Viktor2312 в Ср Дек 14 2016, 13:33

2
Вчера/сегодня посидел помучил программу подсчёта контрольной суммы, что представлена в красной книжечке. Общий смысл того, что она делает уловил, использованные команды просмотрел, алгоритм для себя вычертил, для лучшего понимания, что она делает, в коды перевёл.
Но пока детально не разобрался, нужно ещё мучать теорию, как вообще подсчитывается контрольная сумма.
Но время провёл интересно, перед сном.

Вот её код:

Код:

0100 LXI D, 4000     ; Адрес начала программы
0103 LXI B, 380       ; Длина программы делённая на 2
0106 LXI H, 0000     ; Счётчик контрольной суммы
0109 LDAX D           ; Выборка байт
010A ADD L             ; И их суммирование в рег. H
010B MOV L, A        ;
010C INX D              ;
010D LDAX D           ;
010E ADC H             ;
010F MOV H, A        ;
0110 INX D               ;
0111 DCX B              ; Уменьшение счётчика слов
0112 MOV A, B         ;
0113 ORA C              ; Проверка на границу программы
0114 JNZ 109            ; Если не конец, то уход в цикл
0117 RST 1               ; Возврат в монитор

11 00 40 01 80 03 21 00 00 1A 85 6F 13 1A 8C 67
13 0B 78 B1 C2 09 01 CF


Программное обеспечение (ПО) общая тема. 0_1aebdc_848664eb_L


Буду потихоньку дальше мучать ПО от Иришки, довольно увлекательно...
Viktor2312
Viktor2312
Гуру+

Сообщения : 11568
Дата регистрации : 2012-08-10
Возраст : 40
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty Re: Программное обеспечение (ПО) общая тема.

Сообщение  Viktor2312 в Ср Дек 14 2016, 21:15

3
Кину тут, пригодится...

Код:

; ПОДСЧЕТ CHECK SUM: (HL)...(DE) --> BC

CHSUM:   LXI  B,0
CHSLOO:   MOV  A,C            ; Неперемещаемо !!! 0F944H
   ADD  M
   MOV  C,A
   PUSH PSW
   CALL CMPDH
   JZ  POPRET
   POP  PSW
   MOV  A,B
   ADC  M
   MOV  B,A
   INX  H
   JMP  CHSLOO

POPRET:   POP  PSW
   RET

; ───────────────────────────────────────────────────

; HL-DE ??

CMPDH:   MOV  A,H          ; Неперемещаемо !!! 0F956H
   CMP  D
   RNZ
   MOV  A,L
   CMP  E
   RET
Viktor2312
Viktor2312
Гуру+

Сообщения : 11568
Дата регистрации : 2012-08-10
Возраст : 40
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty Re: Программное обеспечение (ПО) общая тема.

Сообщение  Viktor2312 в Сб Янв 21 2017, 11:41

4
резерв.
Viktor2312
Viktor2312
Гуру+

Сообщения : 11568
Дата регистрации : 2012-08-10
Возраст : 40
Откуда : Пятигорск

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty .

Сообщение  barsik в Сб Фев 02 2019, 14:00

5
Viktor2312 пишет:Кину тут, пригодится...
Вы неграмотно выкладываете исходники. На этом движке ни тэг {code}, ни тэг предформатирования {pre}, не работают. Тэг {code} лишь придаёт шрифту зеленый цвет и делает рамку и всё... Движок и внутри тэга {code} по-прежнему заменяет табуляции и более двух подряд стоящих пробелов на один пробел и даже не заменяет шрифт на моноширинный.

Я ещё несколько месяцев назад открыл способ, как на этом движке показывать преформатированные тексты. Для этого достаточно иметь лишь приличный текстовый редактор (UltraEdit - лучше него по возможностям не найдёте). Я уже где-то описывал методику, но сейчас не найду где.

Нужно сначала табуляции (код 9) заменить на пробелы. Затем вставить текст, обрамить его тэгом {quote} или лучше {spoiler}, что лучше (т.к цвет фона белый лучше и большой исходник не удлиняет страницу), а также незарегистрированные читатели не увидят исходник. Затем смените фонт ассемблерного фрагмента на 'Courier New' (это д.быть последней операцией) и кликните на кнопке "Отправить".

Тогда получится вот так:


; ПОДСЧЕТ CHECK SUM: (HL)...(DE) --> BC

CHSUM:  LXI     B,0        ; Неперемещаемо !!! 0F944H
CHSLOO: MOV     A,C
        ADD     M
        MOV     C,A
        PUSH    PSW
        CALL    CMPDH
        JZ      POPRET
        POP     PSW
        MOV     A,B
        ADC     M
        MOV     B,A
        INX     H
        JMP     CHSLOO
               
POPRET: POP     PSW
        RET    

; ---------------------------------------------------

; HL==DE ??

CMPDH:  MOV  A,H           ; Неперемещаемо !!! 0F956H
        CMP  D
        RNZ
        MOV  A,L
        CMP  E
        RET


А ещё лучше вот так:

Спойлер:

; ПОДСЧЕТ CHECK SUM: (HL)...(DE) --> BC

CHSUM:  LXI     B,0        ; Неперемещаемо !!! 0F944H
CHSLOO: MOV     A,C
        ADD     M
        MOV     C,A
        PUSH    PSW
        CALL    CMPDH
        JZ      POPRET
        POP     PSW
        MOV     A,B
        ADC     M
        MOV     B,A
        INX     H
        JMP     CHSLOO
               
POPRET: POP     PSW
        RET    

; ---------------------------------------------------

; HL==DE ??

CMPDH:  MOV  A,H           ; Неперемещаемо !!! 0F956H
        CMP  D
        RNZ
        MOV  A,L
        CMP  E
        RET

barsik
barsik
Мастер+

Сообщения : 458
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty .

Сообщение  barsik в Сб Фев 02 2019, 14:13

6
По программному обеспечению нужен раздел, т.к по-хорошему для компьютера должно быть много тем по программам, а темы про сборку это просто введение к ним. И должно быть больше любителей программирования, чем любителей гробить себе здоровье ядовитыми парами канифоли. Но почему-то на всех подобных форумах подавляюще преобладают любители трахаться с железом, а на этом форуме, если судить по темам, особенно.

ИРИША прямо сейчас не отличается изобилием программ, т.к оригинальные программы утеряны, а новые еще в процессе (я знаю лишь иришин текстов редактор, DDT и три игры, нет даже бейсика).

Но есть не особо утруждающие способы быстро увеличить число программ, практически не прибегая к программированию (перекомпоновка и перекомпиляция это не программирование, это не требует большого опыта в программировании или напряжения мозга).

Самым простым и быстрым способом увеличить объём ПО является использование на ИРИШЕ программ из CP/M (якобы их 10.000, но на самом деле хоть как-то полезных программ в 100 раз меньше, причём 3/4 из них компиляторы и редакторы). CP/M-игр можно поиметь всего с десяток, да и с ними надо немного потрахаться, чтобы настроить искейп-коды. Ещё можно взять до полусотни убогих игр на бейсике из сезона 1977 года (в основном текстовые квесты).

Для использования CP/M-программ достаточно поиметь на ИРИШЕ любой массовый носитель, будь то дисковод, винчестер, RAM-диск или контроллер огромной флэш-памяти. А для этого нужно всего несколько подпрограмм - в основном процедуры чтения и записи сектора (неважно физического или логического). Скомпоновать это в исходник CP/M-BIOS несложно. Но увы, поиметь CP/M на базовой ИРИШЕ (т.е без наличия привода) - невозможно.

Без наличия привода что-то поиметь из программ можно только конверсией от других компьютеров с таким же процессором. Несложно адаптировать для ИРИШИ бейсик и любые системные программы РК и ОРИОНА, что не лезут в экранную область и матрицу клавиш. Адаптация любой корректной программы для машины имеющей аналогичные входы в ROM-BIOS при наличии исходника требует трудозатрат в 15 минут (это лишь поиск и коррекция вызовов F803, F809, F812 и F81B на аналогичные вызовы данной иришины).

Недисковые фирменные бейсики (типа TINY или альтаировского) адаптировать ещё проще. У них для вывода/ввода на консоль стоит всего одна команда OUT/IN, - достаточно заменить на CALL (иногда удобнее на RST). Но вот получить отличный бейсик типа Digital Research, MSX или Microsoft, которые имеют объём уже не в 4 или 8 кб, а в 28 кб, - это уже солидный труд, как минимум, на 50 человеко-часов. Имеется ввиду переделка в бейсике графических процедур (для использования только текстовых процедур ничего менять не надо).

У меня есть MSX-бейсик (32 кб) адаптированный для ОРИОНА А.Вакуленко, который работает в ORDOS и имеет графические операторы. При наличии Z80 его лучше всего будет адаптировать для ИРИШИ. Тогда у неё будет один из лучших бейсиков среди отечественных 8-ми разрядок. Но на порядки проще потратить полчаса и адаптировать для ИРИШИ эр-кашные бейсики (бейсик 1A20, я уже сделал, т.к имел исходник).

Получение полноценного исходника занимает часы, а иногда, если программист извращенец, это очень утомительно. По счастью для конверсии не нужен полноценный исходник, т.к не нужно двигать код (отчего сдвигаются все таблицы и адреса), а достаточно самого примитивного дизассемблирования, т.е получения квази-исходника, который лишь правильно транслируется. В таком исходнике ничего нельзя менять и тем более сдвигать, но поменять адреса вызовов не проблема.

К сожалению, кроме авторов бейсика и пакета МИКРОН, практически никто не делал корректных программ. А первый текстов редактор МИКРОН настолько убогий, что бесценен, хотя второй, 4-х килобайтный намного лучше. Если он корректный, то и его несложно адаптировать.

Я уже когда-то конвертировал для ИРИШИ специалистовский текстов редактор SCREEN (он корректный за исключение стековых роликов экрана вверх-вниз) работающий с RAM-диском RAMDOS и специалистовский ассемблер МИКРОН. Чтобы получить минимальный инструментарий - текстов редактор с ассемблером.

Но сейчас лучше было бы странслировать текстов редактор (не иришин) и не с убогим ассемблером, а с макро ассемблером (т.к в 1993 в дистрибутиве РК-ДОС от Лианозово мне удалось поиметь РК-шный макроассемблер). При прошивке в ПЗУ получится резидентный инструмент для программирования на самой Ирише. Это займёт 12 кб ПЗУ - 4 кб редактор и 8 кб РК-шный макро ассемблер. У меня есть и свой макроассемблер, но он намного больше и не намного лучше. Конверсия бейсика и текстового редактора это задачи, что требуют совсем немного труда.

Ещё хотелось бы поиметь визуализатор РК-игр на ИРИШЕ. Чтобы в играх требовалась минимальная переделка лишь опроса клавиатуры (там, где прямое обращение в порт 8000), а экран визуализировать на прерываниях, скидывая несколько раз в секунду экран РК с 76D0 в экран ИРИШИ.

А вот, чтобы поиметь CP/М, требуется много электро-траха. Контроллер дисковода спаять не проблематично, но надо искренне любить МГТФ. Для чего у меня даже есть ещё одна раскуроченная плата граф.адаптера ИРИШИ (увы, микрошин РК-КНГМД не использовать, он слишком длинный). На плате можно спаять или КНГМД Корвета или РК-КНГМД (но только не родной иришин). К сожалению, я плохо дружу с паяльником и энтузиазм к железу у меня уже почти на нуле...

Наименее трудоёмким способом поиметь CP/M мне кажется установка в граф.адаптер ИРИШИ вторым этажом второй банки РУ5 (управляя доп.битом, целиком включаем то основную банку, то альтернативную). Это даст RAM-диск в 64 кб. Этого уже достаточно для некоторых программных работ, запуска кое-какого ПО CP/M и отладки аппаратуры и ПО для дисковых приводов.

Если 64К будет мало, тогда придётся попаять побольше и сделать эл.диск 256+ кб на статике. Это не особо сложно, только ППА ВВ55 с интерфейсным обрамлением и панельки на 28 ног (на 28 ног, узкие и широкие). Это даст возможность не только получить CP/M с минимальным эл.диском и уже из неё отладить работу с винтом и дисководом, но и использовать все компиляторы (у них объём кода обычно не превышает 200 кб, так что останется место для исходника).

Вот исходник альтернативного монитора работающего из ОЗУ (я использовал такой-же, но прошитый в ПЗУ вместо DDT, в 4 кб как раз влезает этот монитор 2 кб и RAMDOS для эл.диска 2 кб). Здесь интересно посмотреть директивы обмена по линии со Специалистом (DIR_I и DIR_O), что сделаны вместо МГ-загрузки (т.к ИРИША не может работать в реальном времени, отчего стандартные процедуры МГ-обмена не годятся). Сейчас у меня уже есть IBM PC с LPT-портом и можно сделать загрузку из неё. Посмотрите также на использование иришиных упр.кодов для переключения регистров (РУС/ЛАТ шрифт, КОИ-7/КОИ-8 ), инверсии и включения/выключения курсора.

Наличие такого монитора имеющего все РК-совместимые стандартные входы позволяет напрямую использовать некоторые программы Специалиста, а корректные программы РК нуждаются только перетрансляции вызовов F800 на C800. Использование входов на F800 в базовой ИРИШЕ проблематично, т.к в рабочей карте 2 экран на 80 символов (нужный чтобы уместить 64) занимает область C000...FFFF. Теоретически можно включить режим 1 (моно 320*200) с экраном на E000, но резидентный драйвер выводит только 40 символов в строке, а надо 64. 64 символа на экран 8 кб выводятся лишь мелкошрифтом размера 5*8, что некрасиво и очень тормозит.

Ниже положу также исходники RAMDOS, ассемблера МИКРОН для ИРИШИ и текстового редактора SCREEN. Не оригиналы, что в формате редактора МИКРОН, а переделанные уже под нормальный компилятор ассемблера. Возможно даже в более приличной мнемонике, а то древнюю мнемонику большинство программистов уже давно не понимает.

монитор с РК-подобными входами:

; МОНИТОР СПЕЦИАЛИСТА АДАПТ К ИРИШЕ
; ВЕРСИЯ: 04.05.91 -- 19:10
; РАБОТАЕТ ЧЕРЕЗ ВЫЗОВЫ ОРИГ.МОНИТОРА 9000H

        .8080
        aseg
        ORG     100H

VER1    EQU     04H
VER2    EQU     19H
VER3    EQU     10H

MNTR    EQU     0C800H
STACK   EQU     8F5FH

DISASM  EQU     MNTR-500H+3
ASSM    EQU     0A103H          ; АССЕМБЛЕР
EDITR   EQU     0A900H          ; РЕДАКТОР

RAMDOS  EQU     0D800H
EXIT    EQU     9000H
YSTAT   EQU     9006H           ; STATUS (возвр-ет CY=1, если есть символ)
YINPUT  EQU     9009H           ; INPUT
YCOUT   EQU     900CH           ; COUT

MASK    EQU     0FF42H
KOORD   EQU     0FF46H          ; ПОЗИЦИЯ КУРСОРА
YFF40   EQU     0FF40H
YFF4E   EQU     0FF4EH

LKEY    EQU     'S'-64          ; КОД КЛАВИШИ ВЛЕВО
RKEY    EQU     'D'-64          ; КОД КЛАВИШИ ВПРАВО

;--------------------------------------------

        .phase  MNTR

        JMP     START
        JMP     CONIN   ; ВВОД СИМВОЛА С КЛАВ.->А
        JMP     LDBYTE  ; ВВОД БАЙТА С МГ -> А
        JMP     COUT_C  ; ВЫВ СИМВОЛА ИЗ РЕГ. С
        JMP     SVBYTE  ; ЗАПИСЬ НА МГ <- А
        JMP     STRIN   ; ВВОД СТРОКИ СИМВОЛОВ
        JMP     STAT    ; СОСТОЯНИЕ KEYBOARD
        JMP     HEX_A   ; ВЫВОД БАЙТА В HEX-ВИДЕ <-0А
        JMP     MSSG    ; ВЫВОД СООБЩЕНИЯ
        JMP     INKEY   ; ВВОД КОДА НАЖАТОЙ КЛАВИШИ
        JMP     ASKPOS  ; ЗАПРОС КООРДИНАТ КУРСОРА
        JMP     COUT    ; +21H
        JMP     LD_MAS  ; ВВОД  БЛОКА С МГ
        JMP     @RET    ; ВЫВОД БЛОКА НА МГ
        JMP     CHSUM   ; ПОДСЧЁТ КС (HL)...(DE)
        JMP     SOUND
        JMP     ASKTOP
        JMP     SETTOP
        JMP     DIRS    ; MDIRS = MNTR+36H
        JMP     ENTER   ; MNTR+39H

;--------------------------------------------

if      $ ne    MNTR+3CH
        if1
        .printx * LOC +3C shifted *
        endif
endif

CMPDH:  MOV     A,H             ; вызывается из ассемблера
        CMP     D
        RNZ
        MOV     A,L
        CMP     E
        RET

;--------------------------------------------

if      $ ne    MNTR+42H
        if1
        .printx * LOC +42 shifted *
        endif
endif

ERROR:  LXI     H,TERROR        ; вызывается из RAMDOS
ERR1:   CALL    MSSG
        JMP     ENTER

;--------------------------------------------

if      $ ne    MNTR+4BH
        if1
        .printx * LOC +4B shifted *
        endif
endif

PILIK:  JMP     XPILIK          ; вызывается из ассемблера

;--------------------------------------------

if      $ ne    MNTR+4EH
        if1
        .printx * LOC +4E shifted *
        endif
endif
                                ; вызывается из RAMDOS
HEXHL@: MOV     A,H             ; ВЫВОД HL И SPACE
        CALL    HEX_A
        MOV     A,L
HX_HL1: CALL    HEX_A

if      $ ne    MNTR+56H
        if1
        .printx * LOC +56 shifted *
        endif
endif

SPACE:  PUSH    B               ; вызывается из RAMDOS
        MVI     C,32
        JMP     @UP1

;--------------------------------------------

if      $ ne    MNTR+5CH
        if1
        .printx * LOC +5C shifted *
        endif
endif

COUT10: PUSH    B
        MVI     C,10
        JMP     @UP1

;--------------------------------------------

if      $ ne    MNTR+62H
        if1
        .printx * LOC +62 shifted *
        endif
endif

TFNAME: defb    14,'ИМЯ ФАЙЛА ? ',15,0
TBGADR: defb    10,14,'НАЧАЛЬНЫЙ АДРЕС: ',15,0
TENADR: defb    10,14,'КОНЕЧНЫЙ  АДРЕС: ',15,0
TERROR: defb    14,'ОШИБКА !',15,0
MSMNTR: defb    10,14,'* МОНИТОР ? ',15,0
L50:    defb    10,14,'ФАЙЛ:    ',15,0
TCHSUM: defb    10,14,'КОНТРОЛЬН.СУММА: ',15,0
TRESUM: defb    10,14,'РЕАЛЬНАЯ  СУММА: ',15,7,7,0
TITR:   defb    14,0CH,'ЛЕНИНГРАД * 1991',10,15,0

TVER:   defb    '.05 -- ',0

;--------------------------------------------

START:  LXI     SP,STACK

        LXI     H,DIRS
        SHLD    ADIRS

        LXI     H,1200H
        SHLD    BEGTX

        LXI     H,10H
        SHLD    OB_COD

        LXI     H,5020H
        SHLD    PARSND

        MVI     A,82H           ; настройка режима ППА эл.диска
        OUT     43H

        LXI     H,MNTR
        LXI     D,MNTEND
        CALL    CHSUM
        MOV     D,B
        MOV     E,C
        LHLD    CHECKS
        CALL    CMPDH
        CNZ     BADMON

        LXI     H,TITR
        CALL    MSSG

        LXI     H,RAMDOS
        LXI     D,RAMDOS+7FDH
        CALL    CHSUM
        MOV     D,B
        MOV     E,C
        LHLD    RAMDOS+7FEH
        CALL    CMPDH
        CNZ     BADDOS
        CZ      RAMDOS
ENTER:
        LXI     H,STACK
        SPHL
        DCR     H
        SHLD    RAMTOP
        CALL    CUROFF
        XRA     A
        STA     RUSLAT
        CMA
        STA     YFF40
        CALL    CLRKBD
        CALL    SETNOI
        CALL    LOWSND
        CALL    DIRMON
        JMP     ENTER

;--------------------------------------------

DIRS:   CPI     '.'             ; резидентный обработчик команд
        JZ      DISASM          ; внешний мини-дизассемблер

        PUSH    H
        PUSH    PSW
        SUI     40H
        JC      ERR_0
        CPI     27
        JNC     ERR_0
        ADD     A
        LXI     H,TABL
        ADD     L
        MOV     L,A
        MOV     A,M
        INX     H
        MOV     H,M
        MOV     L,A
        POP     PSW
        XTHL
@RET:   RET

;--------------------------------------------

; ТАБЛИЦА ПЕРЕХОДОВ ПО ДИРЕКТИВАМ

TABL:   DW      ERR_0   ; DIR_@
        DW      DIR_E   ; ДИР.A
        DW      EXIT    ; DIR_B
        DW      DIR_C
        DW      DIR_L   ; ДИР.D
        DW      DIR_E
        DW      DIR_F
        DW      DIR_G
        DW      DIR_H
        DW      DIR_I
        DW      DIR_J
        DW      DIR_K
        DW      DIR_L
        DW      DIR_M
        DW      DIR_N
        DW      DIR_O
        DW      DIR_P
        DW      ERR_0   ; DIR_W ; ДИР.Q
        DW      ERR_0   ; DIR_R
        DW      DIR_S
        DW      DIR_T
        DW      ERR_0   ; DIR_U
        DW      DIR_V
        DW      ERR_0   ; DIR_W
        DW      ERR_0   ; ДИР.X
        DW      ERR_0   ; DIR_Y
        DW      ERR_0   ; ДИР. Z

;--------------------------------------------

KOMIN:  LXI     H,BUFKOM        ; ВВОД КОМ СТРОКИ
        LXI     D,ENDBUF

; ВВОД СТРОКИ В БУФ (HL)..(DE)

STRIN:  MVI     B,1
STIN1:  CALL    CONIN
        CPI     LKEY
        JZ      LEFT
        CPI     7FH
        JZ      LEFT
        CPI     8
        JZ      LEFT
        CPI     RKEY
        JNZ     STIN2
        MOV     A,M
        ORA     A
        JZ      STINER
        CPI     13
        JZ      STINER
STIN2:  MOV     M,A
        MOV     C,A
        CPI     13
        RZ
        CALL    CMPDH
        JZ      STINER
        CALL    COUT
        INX     H
        INR     B
        JNZ     STIN1
LEFT:   DCR     B
        JZ      STNER1
        PUSH    H
        LXI     H,TZABOJ
        CALL    MSSG
        POP     H
        DCX     H
        JMP     STIN1

TZABOJ: defb    8,32,8,0

;--------------------------------------------

STNER1: INR     B
STINER: CALL    ERSND
        JMP     STIN1

;--------------------------------------------

ASKPOS: LHLD    KOORD
        RET

;--------------------------------------------

ASKTOP: LHLD    RAMTOP
        RET

;--------------------------------------------

SETTOP: SHLD    RAMTOP
        RET

;--------------------------------------------

DIR_G:  PCHL

;--------------------------------------------

DIR_J:  LXI     H,DIRS          ; ОТКЛЮЧИТЬ RDOS
        SHLD    ADIRS
        RET

;--------------------------------------------

BADDOS: PUSH    PSW
        CALL    DIR_J
        LXI     H,TBDDOS
        POP     PSW
        RET

TBDDOS: defb    'BAD DOS',10,0

;--------------------------------------------

BADMON: LXI     H,TBADMO
        CALL    MSSG
        CALL    CONIN
        CPI     27
        RZ
        RST     1

TBADMO: defb    14,'МОНИТОР ПОВРЕЖДЕН... ',15,0

;--------------------------------------------

; === ДИРЕКТИВА H ===

DIR_H:  PUSH    H
        DAD     D
        CALL    HEXHL@
        MOV     A,E
        CMA
        MOV     E,A
        MOV     A,D
        CMA
        MOV     D,A
        INX     D
        POP     H
        DAD     D
        JMP     HEXHL@

;--------------------------------------------

; === ДИРЕКТИВА S ===

DIR_S:  PUSH    D
        DCX     H
        PUSH    H
        LXI     H,BUFKOM
        MVI     B,-2
DRS2:   MOV     A,M
        CPI     30H
        JNC     DRS1
        INR     B
DRS1:   INX     H
        CPI     0DH
        JNZ     DRS2
        PUSH    B
        LXI     H,BYTES
        MOV     M,C             ; 1 БАЙТ

;* ОПРЕДЕЛЯЕМ 2,3,4 БАЙТЫ *

        PUSH    H
        LHLD    ENDDIR
        MOV     C,L
        MOV     B,H
        CALL    L73
        JC      ERROR
        MOV     D,L
        POP     H
        INX     H
        MOV     M,D
        INX     H
        MOV     M,E
        INX     H
        MOV     M,C

;* ИЗВЕСТНЫ ВСЕ БАЙТЫ

        POP     B
DRS3:   POP     H
        INX     H
DRS5:   POP     D
        CALL    CMPDH
        RZ
        PUSH    D
        PUSH    H
        MOV     C,B
        LXI     D,BYTES
DRS6:   LDAX    D
        CMP     M
        INX     H
        INX     D
        JNZ     DRS3
        DCR     C
        JNZ     DRS6

;* ВСЕ СОВПАЛО *

        POP     H
        CALL    HEXHL@
        DCX     H
        DCX     H
        MOV     A,B
        ADI     4
        MOV     C,A
DRS7:   CALL    HEXBLM
        INX     H
        DCR     C
        JNZ     DRS7
        DCX     H
        DCX     H
        CALL    COUT10
        JMP     DRS5

;--------------------------------------------

; === ДИРЕКТИВА N ===

DIR_N:  MOV     A,M
        CMP     C
        JZ      L80
        CALL    HEXHL@
        CALL    HEXBLM
        CALL    COUT10
L80:    CALL    CMPDH
        RZ  
        INX     H
        JMP     DIR_N

;--------------------------------------------

; === ДИРЕКТИВА F ===

DIR_F:  MOV     M,C
        CALL    CMPDH
        RZ  
        INX     H
        JMP     DIR_F

;--------------------------------------------

; КОПИРОВАНИЕ НАЗАД:
; (HL)..(DE)->(BC)..

MOVDCR: MOV     A,M
        STAX    B
        CALL    CMPDH
        RZ  
        INX     H
        INX     B
        JMP     MOVDCR

;--------------------------------------------

; === ДИРЕКТИВА C ===

DIR_C:  LDAX    B
        CMP     M
        JZ      L81
        CALL    HEXHL@
        CALL    HEXBLM
        LDAX    B
        CALL    HEX_A
        CALL    COUT10
L81:    CALL    CMPDH
        RZ  
        INX     H
        INX     B
        JMP     DIR_C

;--------------------------------------------

;=== ДИРЕКТИВА K ===

DIR_K:  CALL    CHSUM
        PUSH    B
        LXI     H,TCHSUM
        CALL    MSSG
        POP     H
        JMP     HEXHL@

;--------------------------------------------

; ПОДСЧЕТ КОНТР.СУММЫ БЛОКА (HL)..(DE)

CHSUM:  LXI     B,0
KS1:    MOV     A,M
        ADD     C
        MOV     C,A
        PUSH    PSW
        CALL    CMPDH
        JZ      KS2
        POP     PSW
        MOV     A,B
        ADC     M
        MOV     B,A
        INX     H
        JMP     KS1

KS2:    POP     PSW
        RET

;--------------------------------------------

; === ДИРЕКТИВА L ===

DIR_L:  CALL    HEXHL@
        PUSH    H
        LXI     B,0808H
DIRL1:  CALL    HEXBLM
        DCR     C
        INX     H
        JNZ     DIRL1
        POP     H
        CALL    SPACE
DIRL2:
;      CALL    SPACE
        MOV     A,M
DIRL3:  CALL    WRSIML
        CALL    CMPDH
        RZ
        DCR     B
        INX     H
        JNZ     DIRL2           ; DJNZ
        CALL    COUT10
        CALL    STAT
        INR     A
        RZ
        JMP     DIR_L

;--------------------------------------------

PARAM1: CALL    COUT10

; ОПРЕДЕЛЕНИЕ КОДА И ПАРАМЕТРОВ ДИРЕКТИВЫ

PARAM:  LXI     B,BUFKOM
        LDAX    B
        STA     PAR_A
        INX     B
L73:    CALL    L8C
        RC  
        SHLD    PAR_H
        PUSH    H
        CALL    L8C
        JC      POPREG+2
        SHLD    PAR_D
        PUSH    H
        CALL    L8C
        JC      POPREG+1
        SHLD    PAR_B
        PUSH    B
        XTHL
        SHLD    ENDDIR
        LDA     PAR_A
POPREG:
        POP     B
        POP     D
        POP     H
        RET

;--------------------------------------------

L8C:    LXI     H,0
L91:    LDAX    B
        CPI     0DH
        RZ  
        INX     B
        CPI     30H
        CMC
        RNC
        CALL    L90
        RC
        DAD     H
        DAD     H
        DAD     H
        DAD     H
        ADD     L
        MOV     L,A
        JMP     L91
           
;--------------------------------------------

L90:    SUI     30H
        RC
        CPI     0AH
        CMC
        RNC
        CPI     11H
        RC
        SUI     7
        CPI     10H
        CMC
        RET

;--------------------------------------------

;=== ДИРЕКТИВА M ===

DIRM0:  CALL    COUT10
        CALL    HEXHL@
        CALL    HEXBLM
        MOV     A,M
        CALL    WRSIML
        CALL    SPACE
        CALL    CONIN
        CPI     'E'-64
        JNZ     DIRM1
        DCX     H
        JMP     DIRM0
           
DIRM1:  CPI     'X'-64
        JZ      MDAL
        CPI     1BH
        JZ      MAR2
        CALL    SIMBIN
        RLC
        RLC
        RLC
        RLC
        MOV     E,A
        CALL    CONIN
        CALL    SIMBIN
        ORA     E
MD0:    MOV     M,A
MDAL:   INX     H
        JMP     DIRM0

;--------------------------------------------

MAR2:   CALL    CONIN
        CALL    WRSIML
        JMP     MD0

;--------------------------------------------

SIMBIN: CALL    WRSIML
        CPI     30H
        JC      POPCY1
        CALL    L90
        RNC
        CALL    COUT10
        XTHL
        CALL    ERSND
        LXI     H,TERROR
        CALL    MSSG
        POP     H
        JMP     DIRM0

;--------------------------------------------

POPCY1: POP     H
        STC
        RET

;--------------------------------------------

WRSIML: MOV     C,A
        PUSH    PSW
        CPI     32
        JC      WRSL1
        CPI     7FH
        JC      WRSL2
WRSL1:  MVI     C,'.'
WRSL2:  POP     PSW

COUT_C: PUSH    PSW
        PUSH    B
        MOV     A,C
        CPI     10
        CZ      COUT13
        CALL    CHKKBD
        POP     B
        POP     PSW
        CPI     1FH
        JZ      CLS
        JMP     COUT

;--------------------------------------------

;=== ДИРЕКТИВА Т ===

DIR_T:  MOV     A,B
        CMP     H
        JZ      DIRT1
        JC      MOVDCR
DIRT1:  MOV     A,C
        CMP     L
        JC      MOVDCR
        PUSH    H
        MOV     A,H
        CMA
        MOV     H,A
        MOV     A,L
        CMA
        MOV     L,A
        INX     H
        DAD     D
        DAD     B
        MOV     B,H
        MOV     C,L
        POP     H
MOVINR: LDAX    D
        STAX    B
        CALL    CMPDH
        RZ  
        DCX     D
        DCX     B
        JMP     MOVINR

;--------------------------------------------

;* ВВОД ДИРEКТИВЫ МОНИТОРА *

DIRMON: LXI     H,MSMNTR
        CALL    MSSG
        CALL    KOMIN
        CALL    DIR_F
        LHLD    ADIRS
        PUSH    H
        CALL    PARAM1
        RNC
ERR_0:  CALL    ERSND
        JMP     ERROR

;--------------------------------------------

MSSG:   CALL    CHKKBD
MSGLOO: MOV     A,M
        ORA     A
        RZ
        CALL    SCOUTA
MSSG1:  INX     H
        JMP     MSGLOO
           
;--------------------------------------------

DIR_V:  MVI     A,VER1
        CALL    HEX_A
        LXI     H,TVER
        CALL    MSSG
        MVI     A,VER2
        CALL    HEX_A
        MVI     C,':    '
        CALL    COUT
        MVI     A,VER3
HEX_A:
        PUSH    B
        MOV     B,A
        RRC
        RRC
        RRC
        RRC
        CALL    NIBBLE
        MOV     A,B
        CALL    NIBBLE
        MOV     A,B
        POP     B
        RET
           
;--------------------------------------------

NIBBLE: ANI     0FH
        CPI     0AH
        JC      HEX2
        ADI     07H
HEX2:   ADI     30H
SCOUTA:
        PUSH    B
        MOV     C,A
@UP1:   CALL    COUT_C
        POP     B
        RET

;--------------------------------------------

COUT13: LDA     YFF4E
        ORA     A
        RNZ
        MVI     C,13
        JMP     COUT

;--------------------------------------------

;* ВЫВОД ЯЧЕЙКИ (HL) И SPACE *

HEXBLM: MOV     A,M
        JMP     HX_HL1

;--------------------------------------------

;* ДИРЕКТИВА М *

DIR_M:  LXI     B,DIRM0
        PUSH    B

;* КУРСОР ВВЕРХ *

@UP:    CALL    ESCOUT
        MVI     C,'A'
        JMP     COUT

;--------------------------------------------

;=== ДИРЕКТИВЫ A,E ===

DIR_E:  PUSH    PSW
        MOV     A,H
        ORA     L
        JZ      DIRE1
        SHLD    BEGTX
DIRE1:  XCHG
        MOV     A,H
        ORA     L
        JZ      DIRE2
        SHLD    OB_COD
DIRE2:  POP     PSW
        CPI     'A'
        JZ      ASSM
        LXI     H,EDITR
        MOV     A,M
        CPI     0C3H
        RNZ
        PCHL

;--------------------------------------------

XPILIK: CALL    HIGSND
LOWSND: PUSH    H
        MVI     A,5FH
        JMP     HISND1

;--------------------------------------------

SOUND:  PUSH    PSW
        PUSH    H
        PUSH    B
        LHLD    PARSND
SNDLOO:
        OUT     48H
        CALL    ZADER
        OUT     4CH
        CALL    ZADER
        DCR     H
        JNZ     SNDLOO
        POP     B
        POP     H
        POP     PSW
        RET

;--------------------------------------------

ZADER:  MOV     B,L
ZAD01:  DCR     B
        JNZ     ZAD01           ; DJNZ
        RET

;--------------------------------------------

HIGSND: PUSH    H
        MVI     A,40H
HISND1: STA     PARSND
        CALL    SOUND
        POP     H
        RET

;--------------------------------------------

ERSND:  MVI     C,4
        CALL    PILIK
        DCR     C
        JNZ     ERSND+2
        RET

;--------------------------------------------

STAT:   LDA     KBDBUF          ; Выход: A=255, если есть символ
        CPI     255             ;        A=0,   если пусто
        MVI     A,255
        RNZ
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    CURON
        CALL    YSTAT
        MVI     A,0
        JNC     POPRG

        CALL    INPUT
        CPI     0CH
        JNZ     STAT2
        CALL    CHREG
        XRA     A
        JMP     POPREG

;--------------------------------------------

STAT2:  STA     KBDBUF
        MVI     A,255
        JMP     POPREG

;--------------------------------------------

INKEY:  CALL    STAT
        INR     A
        JZ      CONIN
        MVI     A,255
        RET

;--------------------------------------------

ESCOUT: MVI     C,27

COUT:   PUSH    H
        PUSH    D
        PUSH    B
        PUSH    PSW
        CALL    YCOUT
        POP     PSW
        JMP     POPREG
           
;--------------------------------------------

SETINV: MVI     A,255
JJJ_01: STA     MASK
        RET

SETNOI: XRA     A
        JMP     JJJ_01
           
;--------------------------------------------

SETKO7: MVI     C,27
        CALL    COUT
        MVI     C,5CH
        JMP     COUT

;--------------------------------------------

TOGGLE: LDA     CURFLG
        ORA     A
        JNZ     CURON
CUROFF:
        MVI     A,255
        STA     CURFLG
        CALL    ESCOUT
        MVI     C,61H
        JMP     COUT
           
;--------------------------------------------

CURON:  XRA     A
        STA     CURFLG
        CALL    ESCOUT
        MVI     C,62H
        JMP     COUT

;--------------------------------------------

CHKKBD: CALL    STAT
        INR     A
        RNZ
        CALL    CONIN
        CPI     1FH             ; код клавиши <СТР>
        JZ      ENTER
        STA     KBDBUF
        RET

;--------------------------------------------

CLRKBD: LXI     H,KBDBUF        ; очистка буфера клавиатуры
        MVI     M,255
        CALL    STAT
        INR     A
        RNZ
CONIN:
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    CURON
        LXI     H,KBDBUF
        MOV     A,M
        MVI     M,255
        CPI     255
        JNZ     POPRG
XCON1:  LXI     B,300H
XCON2:  PUSH    B
        CALL    YSTAT
        POP     B
        JC      XCON3
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     XCON2
        CALL    TOGGLE
        JMP     XCON1

;--------------------------------------------

XCON3:  CALL    INPUT
        CPI     0CH
        JNZ     XCON4
        CALL    CHREG
        JMP     XCON1

;--------------------------------------------

XCON4:  PUSH    PSW
        CPI     20H
        JC      XCON6
        CALL    HIGSND
        MVI     B,08H
PAU2:   DCX     B
        MOV     A,B
        ORA     C
        JNZ     PAU2
XCON6:  CALL    YSTAT
        JNC     XCON7
        CALL    INPUT
        CPI     0CH
        JNZ     $+5
        MVI     A,255
        MOV     C,A
        POP     PSW
        CMP     C
        JZ      POPRG
        LXI     H,KBDBUF
        MOV     M,C
        JMP     POPRG
           
;--------------------------------------------

XCON7:  POP     PSW
        JMP     POPRG

;--------------------------------------------

INPUT:  CALL    YINPUT
        PUSH    PSW
        CALL    CUROFF
        POP     PSW
        CPI     40H
        RC
        CPI     60H
        RNC
        MOV     C,A
        LDA     RUSLAT
        INR     A
        MVI     A,20H
        JZ      $+4
        XRA     A
        ORA     C
        RET

;--------------------------------------------

CHREG:  CALL    CUROFF
        LXI     H,RUSLAT
        MOV     A,M
        INR     A
        MVI     A,255
        JNZ     CHRG2
        XRA     A
CHRG2:  MOV     M,A
        CMA
        STA     YFF40
        CALL    CURON
        JMP     PILIK

;--------------------------------------------

DIR_P:  MOV     A,H
        ORA     L
        JZ      MODE20
MODE25:
        MVI     A,50H
        STA     0FF45H
        MVI     A,19H
        STA     0FF4BH
CLS:    MVI     C,0CH
        JMP     COUT

;--------------------------------------------

MODE20: MVI     A,10H
        STA     0FF45H
        MVI     A,14H
        JMP     CLS-3

;--------------------------------------------

GETBIT: LXI     D,0
BLOOP:  DCX     D
        MOV     A,D
        ORA     E
        JNZ     GB2

        CALL    STAT            ;*****
        INR     A
        JZ      ENTER
        JMP     SBOJ

;--------------------------------------------

GB2:    IN      4CH
        RRC
        JNC     BLOOP

GB3:    IN      4CH
        RRC
        JC      GB3

        MVI     E,0
GB4:    IN      4CH
        RRC
        JC      GB5
        INR     E
        JNZ     GB4
        JMP     SBOJ

;--------------------------------------------

GB5:    LDA     CLD
        CMP     E
        RET

;--------------------------------------------

GET2BY: CALL    INBYTE
        MOV     L,A
        CALL    INBYTE
        MOV     H,A
        RET

;--------------------------------------------

GET:    IN      4CH
        RRC
        RET

;--------------------------------------------

FND_E6: CALL    INBYTE
        CPI     0E6H
        JNZ     FND_E6
        RET

;--------------------------------------------

SYNC:   CALL    GET     ; ЕСЛИ 0, ТО ЖДЕМ 1
        JNC     SYNC

        LDA     CLD
        MOV     E,A
SYN1:   DCR     E       ; ПРОВЕРИМ, ЧТО 1 ДОЛГАЯ
        JNZ     SYN2
        RZ
SYN2:   CALL    GET
        JNC     SYNC
        JMP     SYN1

;--------------------------------------------

LDBYTE: PUSH    D
        PUSH    B
        CALL    INBYTE
        POP     B
        POP     D
        RET

;--------------------------------------------

INBYTE: CALL    SYNC
        LXI     B,00800H
L15:        
        PUSH    B
        CALL    GETBIT
        POP     B
           
        MOV     A,C
        RAR
        MOV     C,A
        DCR     B
        JNZ     L15             ; DJNZ
        RET
           
;--------------------------------------------

SBOJ:   POP     B
        POP     B
        CALL    STAT
        INR     A
        JZ      ENTER
        JMP     INBYTE

;--------------------------------------------

IZM:    IN      4CH
        RRC
        JC      IZ02
        JMP     IZM

;--------------------------------------------

IZ02:   IN      4CH
        RRC
        JC      IZ02
        MVI     E,0
IZ03:   IN      4CH
        RRC
        JC      IZ04
        INR     E
        JNZ     IZ03
        RST     1

;--------------------------------------------

IZ04:   MOV     A,E
        RET

;--------------------------------------------

ERRNAS: LXI     H,TXERNA
        CALL    MSSG
        JP      ENTER

TXERNA: defb    14,10,'НЕТ ПИЛОТОНА',10,15,0

;--------------------------------------------

NASTR:  LXI     H,STACK-40H
        MVI     B,16
NAS1:
        CALL    IZM
        MOV     M,A
        INX     H
        DCR     B
        JNZ     NAS1            ; DJNZ
        MOV     E,A
        ADD     A
        ORA     A
        JZ      NASTR
        CPI     6
        JC      NASTR
        STA     CLD
        LXI     H,STACK-40H
        MVI     B,16
NAS2:
        CMP     M
        JC      ERRNAS
        INX     H
        DCR     B
        JNZ     NAS2            ; DJNZ
           
        LXI     H,TX_CLD
        CALL    MSSG

        MOV     A,E
        CALL    HEX_A
        JMP     COUT10

TX_CLD: defb    14,'КОНСТАНТА:  ',15,0

;--------------------------------------------

LD_MAS: CALL    CMPDH
        JZ      ERR_0
        SHLD    BADR
        XCHG
        SHLD    EADR
GETBLK:
        LHLD    BADR
LLOOP:      
        PUSH    H
        CALL    INBYTE
        POP     H
        MOV     M,A

        PUSH    H
        LHLD    EADR
        MOV     D,H
        MOV     E,L
        POP     H

        CALL    CMPDH
        INX     H
        JNZ     LLOOP
           
        CALL    PILIK
           
        LHLD    BADR
        CALL    CHSUM
        MOV     H,B
        MOV     L,C
        SHLD    RCHK
        RET

;--------------------------------------------

DIR_I:  CALL    NASTR
        CALL    FND_E6

        CALL    GET2BY
        SHLD    BADR

        CALL    GET2BY
        SHLD    EADR
           
        CALL    GET2BY
        SHLD    CHKS
           
        CALL    GETBLK
           
        CALL    PRTADR

        LXI     H,TCHSUM
        CALL    MSSG
        LHLD    CHKS
        PUSH    H
        CALL    HEXHL@

        LXI     H,TRESUM
        CALL    MSSG
        LHLD    RCHK
        CALL    HEXHL@

        POP     D
        CALL    CMPDH
        JNZ     ENTER

        LXI     H,TASKWR
        CALL    MSSG

        CALL    CONIN

        PUSH    PSW
        CALL    SCOUTA
        CALL    COUT10
        POP     PSW
           
        ANI     5FH
        CPI     'Y'
        JNZ     ENTER

        LHLD    EADR
        SHLD    PAR_D
        XCHG

        LXI     H,0
        MOV     B,H
        MOV     C,L
        SHLD    PAR_B

        MVI     A,'W'
        STA     PAR_A

        LHLD    BADR
        SHLD    PAR_H

        LHLD    ADIRS
        PUSH    H
        LHLD    PAR_H
        RET

TASKWR: defb    10,10,'SAVE (Y/N) ? ',0

;--------------------------------------------

PRTADR: LXI     H,TBGADR
        CALL    MSSG
        LHLD    BADR
        CALL    HEXHL@

        LXI     H,TENADR
        CALL    MSSG
        LHLD    EADR
        JMP     HEXHL@

;--------------------------------------------

HEXHL9: CALL    HEXHL@
        JMP     COUT10

;--------------------------------------------

OUBYTE: MVI     A,00000001B
        CALL    BITOUT
        MVI     A,00000010B
        CALL    BITOUT
        MVI     A,00000100B
        CALL    BITOUT
        MVI     A,00001000B
        CALL    BITOUT
        MVI     A,00010000B
        CALL    BITOUT
        MVI     A,00100000B
        CALL    BITOUT
        MVI     A,01000000B
        CALL    BITOUT
        MVI     A,10000000B
BITOUT:
        ANA     C
        JZ      BIT0
;       JMP     BIT1

BIT1:   IN      48H
        RAR
        JC      BIT1
        OUT     4CH     ; S0
        OUT     44H
BI00:
        IN      48H
        RAR
        JC      BI00
        OUT     44H
BI01:
        IN      48H
        RAR
        JC      BI01
        JMP     EXBIT

;--------------------------------------------

BIT0:   IN      48H
        RAR
        JC      BIT0
        OUT     4CH
        OUT     44H
BI03:   IN      48H
        RAR
        JC      BI03
EXBIT:
        OUT     48H             ; S1
        MVI     E,16H           ; 18H
PAUS2:    
        DCR     E
        JNZ     PAUS2
        RET

;--------------------------------------------

SVBYTE: PUSH    D
        PUSH    B
        MOV     C,A
        CALL    OUBYTE
        POP     B
        POP     D
        RET

;--------------------------------------------

DIR_O:  SHLD    BADR
        XCHG
        SHLD    EADR

        CALL    PRTADR
        CALL    COUT10

        LDA     BADR+1
        MOV     C,A
        LDA     EADR+1
        CMP     C
        JC      ERR_0
        JNZ     ST2
        LDA     BADR
        MOV     C,A
        LDA     EADR
        CMP     C
        JC      ERR_0
ST2:
        LHLD    EADR
        XCHG
        LHLD    BADR
        CALL    CHSUM
        MOV     H,B
        MOV     L,C
        SHLD    CHKS

        LXI     B,200H
PILOT:
        PUSH    B
        MVI     C,0
        CALL    OUBYTE
        POP     B
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     PILOT

        MVI     C,0E6H
        CALL    OUBYTE

        LXI     H,BADR
        MVI     E,6
LOO999: PUSH    D
        MOV     C,M
        CALL    OUBYTE
        INX     H
        POP     D
        DCR     E
        JNZ     LOO999

        LHLD    KOORD
        PUSH    H
        CALL    CUROFF
           
        LHLD    BADR
OLOOP:
        MOV     C,M
        CALL    OUBYTE

        PUSH    H
        LXI     H,TPOS
        CALL    MSSG
        POP     H

        PUSH    H
        CALL    HEXHL@
        LHLD    EADR
        XCHG
        POP     H

        CALL    CMPDH
        JZ      DIR_02
        INX     H
        JMP     OLOOP

TPOS:   defb    1BH,59H,20H,20H+33,0

;--------------------------------------------

DIR_02: POP     H
        SHLD    KOORD
        CALL    CURON
        JMP     PILIK

;--------------------------------------------

MNTEND  EQU     $-1

CHECKS: DW      9B30H           ; ЗДЕСЬ КС МОНИТОРА

CURFLG: defb    0               : флаг вывода курсора
BADR:   DW      0
EADR:   DW      0
CHKS:   DW      0
RCHK:   DW      0

;--------------------------------------------

;* РАБОЧИЕ ЯЧЕЙКИ МОНИТОРА

BUFKOM  EQU     8F60H
ENDBUF  EQU     8F77H
BYTES   EQU     8F78H
KSOUT   EQU     8F7CH
ENDDIR  EQU     8F7CH
RAMTOP  EQU     8F7EH
PAR_A   EQU     8F80H
PAR_H   EQU     8F81H
PAR_D   EQU     8F83H
PAR_B   EQU     8F85H
NAME1   EQU     8F87H
NAME11  EQU     8F97H
NAME2   EQU     8F97H
NAME21  EQU     8FA7H

;* СИСТЕМНЫЕ ПЕРЕМЕННЫЕ

;ESCFLG EQU     8FC7H
;AINKEY EQU     8FC8H
;ASTRIN EQU     8FCAH
;ASVMAS EQU     8FCCH
;ALDMAS EQU     8FCEH
ADIRS   EQU     8FD1H           ; АДРЕС П/П ОБР-КИ ДИР-ВЫ
;АСЧЕТ  EQU     8FD7H
;АПРИНТ EQU     8FD9H
OB_COD  EQU     8FE1H           ; АДРЕС ОБ'ЕКТН.КОДА АSSM
;ASTART EQU     8FE3H
BEGTX   EQU     8FE5H           ; НАЧАЛО ТЕКСТА
;AFONT  EQU     8FE7H
RUSLAT  EQU     8FECH
LAST_K  EQU     8FEFH
KBDBUF  EQU     LAST_K
PARSND  EQU     8FF1H
;RABSTR EQU     8FF6H
;KURSOR EQU     8FFCH   ; КООРДИНАТЫ КУРСОРА
CSW     EQU     8FFEH
CLD     EQU     8FFFH

        .dephase

        END


_________________
***
barsik
barsik
Мастер+

Сообщения : 458
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty ассемблер МИКРОН для ИРИШИ

Сообщение  barsik в Сб Фев 02 2019, 16:03

7
эр-ка-шный ассемблер для ИРИШИ:

; АССЕМБЛЕР 04.05.91 -- 15:30

        .8080
        aseg
        ORG     100H
       
BASA    EQU     08E70H  ; БАЗА РАБОЧИХ ЯЧЕЕК
STACK   EQU     08F5FH

EDIT    EQU     0A900H  ; РЕДАКТОР
MNTR    EQU     0C800H  ; МОНИТОР
               
CONIN   EQU     MNTR+3
COUT    EQU     MNTR+9
STAT    EQU     MNTR+12H
HEX_A   EQU     MNTR+15H
MSSG    EQU     MNTR+18H
ENTER   EQU     MNTR+39H
CMPDH   EQU     MNTR+3CH
PILIK   EQU     MNTR+4BH
               
ATXBUF  EQU     08FE5H          ; АДРЕС ТЕКСТОВОГО БУФЕРА
ABUFTR  EQU     08FE1H          ; АДРЕС БУФЕРА ТРАНСЛЯЦИИ

        .phase  EDIT-800H

;--------------------------------------------

        JMP     EDIT
        JMP     BEG2

;--------------------------------------------

RESTAR: MVI     C,8
BEG1:   CALL    PILIK
        DCR     C
        JNZ     BEG1
BEG2:   LXI     SP,STACK

        LXI     H,TITR
        CALL    MSSG

        CALL    IF_BRK
        CALL    COUT

        CALL    CR
        SUI     31H
        JM      ENTER
        CPI     3
        STA     MODE
        LXI     H,TERROR
        JP      L0A
L08:    LHLD    ATXBUF
L0F:    CALL    L0E
        MOV     A,M
        INR     A
        INX     H
        JNZ     L0F
        SHLD    ENDTX
        MOV     M,A
        STA     L11
        MOV     H,A
        MOV     L,A
        SHLD    L12
        INR     A
        STA     L13
L3F:    LHLD    ATXBUF
        SHLD    L15
        LHLD    ABUFTR
        SHLD    L17
        XRA     A
        STA     KOLERR
L2E:    XRA     A
        STA     KODERR
        LHLD    L17
        SHLD    L1A
        LXI     SP,STACK
        CALL    L1B
        LXI     H,L1C
        MOV     A,M
        CPI     3BH
        JZ      L1D
        CALL    L1E
        CPI     3AH
        JNZ     L1F
        XRA     A
        CMP     C
        JZ      L20
        PUSH    H
        CALL    L21
        POP     H
        CALL    L22
        ORA     A
        JZ      L1D
        CPI     3BH
        JZ      L1D
        CALL    L1E
L1F:    PUSH    H
        CALL    L23
        POP     H
        CALL    L24
        PUSH    H
        LXI     H,L25
        LDA     L26
        MOV     E,A
        MVI     D,0
        DAD     D
        DAD     D
        MOV     E,M
        INX     H
        MOV     A,M
        CMP     C
        JNZ     L27
        LXI     H,L28
        DAD     D
        LXI     D,L1D
        XCHG    
        XTHL    
        PUSH    D
        LDA     L29
        RET    

;--------------------------------------------

L1D:    CALL    L2A
        LHLD    ATXBUF
        XCHG
        LHLD    L17
        CALL    L2B
;    CALL       BREAK
        JMP     L2E

;--------------------------------------------

BREAK:  CALL    STAT
        INR     A
        RNZ
IF_BRK: CALL    CONIN
        MOV     C,A
        CPI     27
        JZ      EDIT
        CPI     3
        JZ      RESTAR
        RET

;--------------------------------------------

L28:    ORI     40H
        STA     L2F
        CALL    L30
        LDA     L31
        JMP     L32

;--------------------------------------------

        ORI     06H
        STA     L2F
        CALL    L30
        MVI     C,1
        JMP     L33

;--------------------------------------------

        CALL    L34
        ORI     01H
        STA     L2F
        CALL    L30
        MVI     C,2
        JMP     L33

;--------------------------------------------

        CALL    L34
        JMP     L32

;--------------------------------------------

        CALL    L35
        JMP     L32

;--------------------------------------------

        CALL    L36
        JMP     L32

;--------------------------------------------

        LDA     L31
        MOV     B,A
        ANI     07H
        CMP     B
        JNZ     L27
        RLC    
        RLC    
        RLC    
        JMP     L32

;--------------------------------------------

        LHLD    L17
        XCHG    
        LHLD    L31
        DAD     D
        SHLD    L17
        RET    

;--------------------------------------------

        LXI     H,L1C
        CALL    L1E
        CPI     3AH
        JNZ     L20
        LHLD    L31
        SHLD    L1A
        XCHG    
        LDA     L13
        DCR     A
        RNZ    
        LDA     KODERR
        DCR     A
        RZ      
        JM      L37
        LXI     D,0FFFEH
L37:    LHLD    L39
        MOV     M,E
        INX     H
        MOV     M,D
        RET    

;--------------------------------------------

L3D:    XCHG    
        LHLD    L17
        LDAX    D
        CPI     27H
        JNZ     L3A
        INX     D
L3C:    LDAX    D
        INX     D
        ORA     A
        JZ      L27
        CPI     27H
        JZ      L3B
        MOV     M,A
        INX     H
        JMP     L3C

;--------------------------------------------

L3A:    LDA     L31
        MOV     M,A
        INX     H
        LDA     L26
        CPI     0EH
        JZ      L3B
        LDA     L29
        MOV     M,A
        INX     H
L3B:    SHLD    L17
        XCHG    
        CALL    L22
        ORA     A
        RZ      
        CPI     3BH
        RZ      
        CALL    L30
        JMP     L3D

;--------------------------------------------

        LDA     L11
        ORA     A
        RNZ    
        INR     A
        STA     L11
        LHLD    ABUFTR
        XCHG    
        LHLD    L31
        CALL    L3E
        SHLD    L12
        RET    

;--------------------------------------------

L4F:    CALL    L2A
        LXI     H,L13
        DCR     M
        JZ      L3F
        LDA     MODE
        DCR     A
        JNZ     L40
        LHLD    ENDTX
L45:    MVI     B,06H
L41:    MOV     A,M
        ORA     A
        JZ      L40
        MOV     C,A
        CALL    COUT
        DCR     B
        INX     H
        JNZ     L41

        MVI     C,'='
        CALL    COUT
        MVI     C,20H
        CALL    COUT

        INX     H
        MOV     A,M
        CALL    SVHEXA
        DCX     H
        MOV     A,M
        CALL    SVHEXA
        INX     H
        INX     H
        LXI     B,PROB04
        CALL    WRBC
        CALL    BREAK
        JMP     L45

;--------------------------------------------

L40:    LXI     H,MSEND
        CALL    MSSG
        LDA     KOLERR
        CALL    SVHEXA
        CALL    CR
        LHLD    L17
        DCX     H
        XCHG    
        LHLD    L12
        DAD     D
        MVI     C,2FH
        CALL    WRHLC
        XCHG    
        CALL    WRHLC
        JMP     RESTAR

;--------------------------------------------

L3E:    MOV     A,L
        SUB     E
        MOV     L,A
        MOV     A,H
        SBB     D
        MOV     H,A
        RET    

;--------------------------------------------

WRBC:   INR     B
L48:    DCR     B
        RZ      
        CALL    COUT
        JMP     L48

;--------------------------------------------

L32:    MOV     B,A
        LDA     L2F
        ORA     B
        LHLD    L17
L4A:    MOV     M,A
        INX     H
L49:    SHLD    L17
        RET    

;--------------------------------------------

L33:    LHLD    L31
        XCHG    
        LHLD    L17
        LDA     L2F
        MOV     M,A
        INX     H
        MOV     M,E
        INX     H
        DCR     C
        JZ      L49
        MOV     A,D
        JMP     L4A

;--------------------------------------------

L34:    CPI     40H
L4C:    JNZ     L4B
        MVI     A,30H
        RET    

;--------------------------------------------

L35:    CPI     48H
        JMP     L4C

;--------------------------------------------

L4B:    CPI     20H
        RZ      
L36:    CPI     10H
        RZ      
        ORA     A
        JNZ     L27
        RET    

;--------------------------------------------

L62:    MVI     B,01H
        JMP     L4D

;--------------------------------------------

L63:    MVI     B,2
        LXI     D,0FFFEH
L4D:    PUSH    H
        LXI     H,KODERR
        MOV     A,M
        ORA     B
        MOV     M,A
        LXI     H,KOLERR
        MOV     A,M
        INR     A
        DAA    
        MOV     M,A
        POP     H
        RET    

;--------------------------------------------

L89:    MVI     B,04H
        JMP     L4E

;--------------------------------------------

L27:    MVI     B,08H
        JMP     L4E

;--------------------------------------------

L20:    MVI     B,10H
L4E:    CALL    L4D
        JMP     L1D

;--------------------------------------------

L1B:    LXI     D,L1C
        MVI     C,40H
        LHLD    L15
L52:    MOV     A,M
        INX     H
        CPI     0FFH
        JZ      L4F
        CPI     0DH
        JZ      L50
        CPI     09H
        JNZ     L51
        MVI     A,20H
L51:    CPI     0AH
        JZ      L52
        STAX    D
        DCR     C
        JM      L52
        INX     D
        JMP     L52

;--------------------------------------------

L50:    XRA     A
        STAX    D
        MOV     A,C
        CPI     40H
        JZ      L52
        SHLD    L15
        RET    

;--------------------------------------------

L1E:    MVI     C,06H
        LXI     D,L53
        PUSH    D
        MVI     A,20H
L54:    STAX    D
        INX     D
        DCR     C
        JNZ     L54
        POP     D
        CALL    L22
        CPI     3FH
        RM      
        CPI     80H
        RP      
L57:    MOV     B,A
        MOV     A,C
        CPI     6
        JZ      L55
        MOV     A,B
        STAX    D
        INX     D
        INR     C
L55:    INX     H
        MOV     A,M
        CPI     30H
        JM      L22
        CPI     3AH
        JZ      L56
        JM      L57
        CPI     3FH
        RM      
        CPI     80H
        JM      L57
        RET    

;--------------------------------------------

L56:    INX     H
        RET    
L22:    MOV     A,M
        CPI     20H
        RNZ    
        INX     H
        JMP     L22

;--------------------------------------------

L21:    CALL    L58
        LDA     L13
        DCR     A
        JNZ     L59
        CMP     C
        JZ      L5A
        PUSH    H
        PUSH    H
        LXI     B,8
L5C:    MOV     A,M
        DAD     B
        XTHL    
        ORA     A
        JNZ     L5C
        POP     B
        POP     D
L5E:    MOV     A,M
        STAX    B
        CALL    CMPDH
        DCX     H
        DCX     B
        JNZ     L5E
        INX     H
        LXI     D,L53
        MVI     C,6
L5F:    LDAX    D
        MOV     M,A
        INX     D
        INX     H
        DCR     C
        JNZ     L5F
        SHLD    L39
        PUSH    H
        LHLD    L17
        XCHG    
        LHLD    L12
        DAD     D
        XCHG    
        POP     H
        MOV     M,E
        INX     H
        MOV     M,D
L0E:    XCHG    
        LXI     H,BASA ; ( 32 k :         LXI  H,0FFF8H )
        NOP            ; ( 32 K :         DAD  SP    )
        XCHG    
L2B:    CALL    CMPDH
        RC      
        LXI     H,TNORAM
L0A:    CALL    MSSG
        JMP     RESTAR

;--------------------------------------------

L5A:    DCR     A
        MOV     M,A
        INX     H
        MOV     M,A
        RET    
L59:    MOV     C,M
        INX     H
        MOV     B,M
        CMP     B
        RNZ    
        CMP     C
        JZ      L62
        DCR     A
        CMP     C
        JZ      L63
        RET    

;--------------------------------------------

L6D:    CALL    L58
        JM      L63
        MOV     E,M
        INX     H
        MOV     D,M
        RET    

;--------------------------------------------

L58:    LHLD    ENDTX
L65:    MVI     C,06H
        MOV     A,M
        DCR     A
        RM      
        PUSH    H
        LXI     D,L53
L66:    LDAX    D
        CMP     M
        JZ      L64
        POP     H
        RM      
        LXI     B,8
        DAD     B
        JMP     L65
L64:    INX     D
        INX     H
        DCR     C
        JNZ     L66
        POP     D
        RET    

;--------------------------------------------

L30:    MOV     A,M
        CPI     2CH
        JNZ     L27
        INX     H
        CALL    L24
        LDA     L26
        CPI     03H
        JZ      L67
        DCR     C
L67:    DCR     C
        JNZ     L27
        RET    

;--------------------------------------------

L24:    CALL    L1E
        XRA     A
        STA     L68
        STA     L31
        STA     L29
        CMP     C
        JZ      L69
        CALL    L6A
        CPI     01H
        JNZ     L6B
        MOV     C,A
        CALL    L6C
        RZ      
        JC      L27
L6B:    PUSH    H
        CALL    L6D
        JMP     L6E

;--------------------------------------------

L69:    CALL    L6C
        RZ      
        CPI     2BH
        JZ      L6F
        CPI     2DH
        JNZ     L70
L6F:    STA     L68
        INX     H
L70:    CALL    L71
        INR     C
        JZ      L27
        LDA     L68
        CPI     2DH
        JNZ     L72
        XRA     A
        SUB     E
        MOV     E,A
        MVI     A,0
        SBB     D
        MOV     D,A
L72:    PUSH    H
L6E:    LHLD    L31
        DAD     D
        SHLD    L31
        POP     H
        CALL    L71
        INR     C
        JNZ     L27
        MVI     C,02H
        JMP     L69

;--------------------------------------------

L6C:    MOV     A,M
        ORA     A
        RZ      
        CPI     ','
        RZ      
        CPI     ';'
        RZ      
        STC    
        RET    

;--------------------------------------------

L6A:    PUSH    H
        LXI     H,L73
        MOV     B,C
L77:    LXI     D,L53
        MOV     C,B
        MOV     A,M
        INX     H
        ORA     A
        JZ      L74
        CMP     C
        JZ      L75
        MOV     C,A
L76:    INX     H
        DCR     C
        JNZ     L76
        INX     H
        JMP     L77

;--------------------------------------------

L75:    LDAX    D
        INX     D
        CMP     M
        JNZ     L76
        INX     H
        DCR     C
        JNZ     L75
        MOV     A,M
        STA     L31
        RLC    
        RLC    
        RLC    
        STA     L29
        MVI     A,01H
L74:    POP     H
        RET    

;--------------------------------------------

L71:    CALL    L1E
        DCR     C
        JP      L78
        MOV     A,M
        CPI     "'"
        JZ      L79
        CPI     '$'
        JZ      L7A
        CPI     30H
        RM      
        CPI     ':'
        RP      
        LXI     D,L53
        MVI     C,0
L7C:    SUI     30H
        STAX    D
        INX     D
        INX     H
        MOV     A,M
        CPI     30H
        JM      L7B
        CPI     ':'
        JM      L7C
        CPI     41H
        JM      L7B
        INR     C
        CPI     'H'
        JZ      L7D
        CPI     'J'
        JP      L27
        SUI     7
        JMP     L7C

;--------------------------------------------

L7B:    XRA     A
        CMP     C
        JNZ     L27
        MVI     A,19H
        JMP     L7E

;--------------------------------------------

L7D:    INX     H
        MVI     A,29H
L7E:    STAX    D
        PUSH    H
        LXI     H,L53
        LXI     D,0
        SBI     19H
L83:    MOV     B,A
        MOV     A,M
        INX     H
        CPI     10H
        JP      L80
        MOV     C,A
        MOV     A,B
        ORA     A
        MVI     B,0
        PUSH    H
        MOV     H,D
        MOV     L,E
        DAD     H
        DAD     H
        JNZ     L81
        DAD     D
        JMP     L82
L81:    DAD     H
L82:    DAD     H
        DAD     B
        XCHG    
        POP     H
        JMP     L83

;--------------------------------------------

L79:    MVI     C,2
        LDA     L26
        CPI     0EH
        JNZ     L84
        POP     PSW
        RET
       
;--------------------------------------------

L84:    INX     H
        MOV     E,M
        INX     H
        MOV     D,M
L85:    MOV     A,M
        INX     H
        ORA     A
        JZ      L27
        CPI     27H
        JNZ     L85
        RET    

;--------------------------------------------

L78:    INR     C
        CALL    L6A
        CPI     01H
        JZ      L27
        PUSH    H
        CALL    L6D
        JMP     L80

;--------------------------------------------

L7A:    INX     H
        PUSH    H
        LHLD    L1A
        XCHG    
        LHLD    L12
        DAD     D
        XCHG
L80:    POP     H
        MVI     C,2
        RET    

;--------------------------------------------

L23:    LDA     L86
        CPI     58H
        JNZ     L87
        STA     L88
L87:    LDA     L53
        SUI     41H
        JM      L89
        MOV     E,A
        MVI     D,0
        LXI     H,L8A
        DAD     D
        MOV     E,M
        INX     H
        MOV     A,M
        SUB     E
        JZ      L89
        MOV     C,A
        PUSH    B
        LXI     H,L8B
        DAD     D
        DAD     D
        DAD     D
        MVI     C,20H
        LDA     L8C
        SUB     C
        JZ      L8D
        SUB     C
        JM      L89
L8D:    RLC    
        RLC    
        RLC    
        MOV     B,A
        LDA     L88
        SUB     C
        JZ      L8E
        SUB     C
        JM      L89
L8E:    RRC    
        RRC    
        MOV     C,A
        ANI     07H
        ORA     B
        MOV     D,A
        MOV     A,C
        ANI     0C0H
        MOV     E,A
        POP     B
L91:    MOV     A,M
        INX     H
        CMP     D
        JNZ     L8F
        MOV     A,M
        ANI     0C0H
        CMP     E
        JZ      L90
L8F:    INX     H
        INX     H
        DCR     C
        JNZ     L91
        JMP     L89
L90:    MOV     A,M
        ANI     3FH
        STA     L26
        INX     H
        MOV     A,M
        STA     L2F
        RET    

;--------------------------------------------

L2A:    LDA     L13
        DCR     A
        RZ      
        LDA     KODERR
        ORA     A
        JZ      L92

;-- БЫЛА ОШИБКА --

        MOV     C,A
        LDA     MODE
        DCR     A
        RZ      
        MOV     A,C
        CALL    CR
        MVI     C,'*'
        CALL    WRHL1
        CALL    PILIK
        JMP     L93

;--------------------------------------------

L92:    LDA     MODE
        ORA     A
        RNZ    
        CALL    CR
        LXI     B,PROB03
        CALL    WRBC
L93:    LXI     D,L1C
        LDAX    D
        CPI     3BH
        LXI     B,PROB17
        JZ      L96
        XRA     A
        STA     L68
        CALL    L97
L96:    XCHG    
        CALL    WRBC
        CALL    MSSG
L98:    LDA     L68
        ORA     A
        RZ      
        CALL    CR
        LXI     B,PROB03
        CALL    WRBC
        CALL    L97
        JMP     L98

;--------------------------------------------

CR:     MVI     C,13
        CALL    COUT
        MVI     C,10
        JMP     COUT
               
;--------------------------------------------

L97:    LDA  L26
        CPI  0CH
        RZ
        CPI  0DH
        RZ
        LHLD L1A
        CPI  11H
        JZ   L99
        PUSH PSW
        PUSH D
        XCHG
        LHLD L12
        DAD  D
        CALL WRHLC
        XCHG
        POP  D
        POP  PSW
        CPI  10H
        JZ   L9A
        MVI  B,04H
L9C:    LDA  L17
        SUB  L
        JZ   L9B
        MOV  A,M
        INX  H
        CALL WRHL1
        DCR  B
        JNZ  L9C
        LDA  L17
        SUB  L
        SHLD L1A
L9B:    STA  L68
        MOV  A,B
        RLC
        ADD  B
        MOV  B,A
        RET

;--------------------------------------------

L9A:    MVI     C,'('
        CALL    COUT
        MVI     C,20H
        CALL    COUT
        LHLD    L31
        CALL    WRHLC
        MVI     C,')'
        CALL    COUT
        LXI     B,PROB04
        RET

;--------------------------------------------

SVHEXA: PUSH    B
        CALL    HEX_A
        POP     B
        RET

;--------------------------------------------

L99:    MVI     B,0CH
WRHLC:  MOV     A,H
        CALL    SVHEXA
        MOV     A,L
WRHL1:  CALL    SVHEXA
        JMP     COUT

;--------------------------------------------

L25:    defb    0BH
        defb    00H
        defb    08H
        defb    01H
        defb    '.'
        defb    01H
        defb    00H
        defb    01H
        defb    16H
        defb    02H
        defb    0EH
        defb    01H
        defb    '&'
        defb    02H
        defb    '+'
        defb    01H
        defb    '1'
        defb    01H
        defb    '7'
        defb    01H
        defb    1BH
        defb    01H
        defb    '='
        defb    02H
        defb    0C1H
        defb    02H
        defb    0D8H
        defb    00H
        defb    82H
        defb    02H
        defb    82H
        defb    02H
        defb    'M'
        defb    02H
        defb    'Y'
        defb    02H
L73:    defb    01H
        defb    'A'
        defb    07H
        defb    01H
        defb    'B'
        defb    00H
        defb    01H
        defb    'C'
        defb    01H
        defb    01H
        defb    'D'
        defb    02H
        defb    01H
        defb    'E'
        defb    03H
        defb    01H
        defb    'H'
        defb    04H
        defb    01H
        defb    'L'
        defb    05H
        defb    01H
        defb    'M'
        defb    06H
        defb    02H
        defb    'SP'
        defb    08H
        defb    03H
        defb    'PSW'
        defb    09H
        defb    00H
L8A:    defb    00H
        defb    06H
        defb    06H
        defb    13H
        defb    1BH
        defb    1EH
        defb    1EH
        defb    1EH
        defb    1FH
        defb    '",,0237:       :       HQQQQQUUU'
L8B:    defb    1AH
        defb    'D'
        defb    0CEH
        defb    ' '
        defb    0C1H
        defb    88H
        defb    '!'
        defb    01H
        defb    80H
        defb    '"D'
        defb    0C6H
        defb    'pA'
        defb    0A0H
        defb    'rD'
        defb    0E6H
        defb    0BH
        defb    06H
        defb    0CDH
        defb    18H
        defb    06H
        defb    0DCH
        defb    'h'
        defb    06H
        defb    0FCH
        defb    'h@/h'
        defb    0C0H
        defb    '?l'
        defb    01H
        defb    0B8H
        defb    'p'
        defb    0C6H
        defb    0D4H
        defb    'v'
        defb    86H
        defb    0C4H
        defb    80H
        defb    06H
        defb    0F4H
        defb    81H
        defb    'F'
        defb    0ECH
        defb    82H
        defb    'D'
        defb    0FEH
        defb    83H
        defb    0C6H
        defb    0E4H
        defb    0D0H
        defb    06H
        defb    0CCH
        defb    08H
        defb    '@',27H
        defb    09H
        defb    07H
        defb    09H
        defb    1CH
        defb    82H
        defb    05H
        defb    1EH
        defb    07H
        defb    0BH
        defb    'H'
        defb    00H
        defb    0F3H
        defb    10H
        defb    0EH
        defb    00H
        defb    0B8H
        defb    0FH
        defb    00H
        defb    98H
        defb    10H
        defb    00H
        defb    'H'
        defb    00H
        defb    0FBH
        defb    'q'
        defb    0DH
        defb    00H
        defb    8DH
        defb    'Q'
        defb    00H
        defb    'e'
        defb    00H
        defb    'vp'
        defb    04H
        defb    0DBH
        defb    't'
        defb    82H
        defb    04H
        defb    'v'
        defb    07H
        defb    03H
        defb    18H
        defb    06H
        defb    0DAH
        defb    'h'
        defb    06H
        defb    0FAH
        defb    'l'
        defb    06H
        defb    0C3H
        defb    00H
        defb    06H
        defb    0C3H
        defb    'p'
        defb    0C6H
        defb    0D2H
        defb    'v'
        defb    86H
        defb    0C2H
        defb    80H
        defb    06H
        defb    0F2H
        defb    81H
        defb    'F'
        defb    0EAH
        defb    83H
        defb    0C6H
        defb    0E2H
        defb    0D0H
        defb    06H
        defb    0CAH
        defb    ' F:    &'
        defb    09H
        defb    0AH
        defb    'C'
        defb    06H
        defb    '*'
        defb    0C2H
        defb    'J'
        defb    01H
        defb    0B2H
        defb    'E'
        defb    06H
        defb    '}'
        defb    83H
        defb    '@|'
        defb    00H
        defb    00H
        defb    90H
        defb    'A'
        defb    0B0H
        defb    92H
        defb    'D'
        defb    0F6H
        defb    0ADH
        defb    04H
        defb    0D3H
        defb    91H
        defb    0CCH
        defb    00H
        defb    1AH
        defb    00H
        defb    0E9H
        defb    '|'
        defb    08H
        defb    0C1H
        defb    0ACH
        defb    0C8H
        defb    0C5H
        defb    0BH
        defb    00H
        defb    17H
        defb    0CH
        defb    80H
        defb    1FH
        defb    '`'
        defb    0C0H
        defb    07H
        defb    90H
        defb    0C0H
        defb    0FH
        defb    '-'
        defb    00H
        defb    0C9H
        defb    18H
        defb    00H
        defb    0D8H
        defb    'p'
        defb    0C0H
        defb    0D0H
        defb    0D0H
        defb    00H
        defb    0C8H
        defb    'v'
        defb    80H
        defb    0C0H
        defb    80H
        defb    00H
        defb    0F0H
        defb    'h'
        defb    00H
        defb    0F8H
        defb    81H
        defb    '@'
        defb    0E8H
        defb    83H
        defb    0C0H
        defb    0E0H
        defb    9DH
        defb    0BH
        defb    0C7H
        defb    10H
        defb    81H
        defb    98H
        defb    12H
        defb    'D'
        defb    0DEH
        defb    'C'
        defb    06H
        defb    '"'
        defb    82H
        defb    00H
        defb    0F9H
        defb    0A0H
        defb    'F2'
        defb    0A6H
        defb    09H
        defb    02H
        defb    0A0H
        defb    0C0H
        defb    '7'
        defb    0A8H
        defb    81H
        defb    90H
        defb    0AAH
        defb    'D'
        defb    0D6H
        defb    1AH
        defb    00H
        defb    0EBH
        defb    90H
        defb    'A'
        defb    0A8H
        defb    92H
        defb    'D'
        defb    0EEH
        defb    0A2H
        defb    0
        defb    0E3H

;--------------------------------------------

MSEND:  defb    10,10
        defb    '* ERRORS:       ',7,0

;--------------------------------------------

TITR:   defb    10,10
        defb    'ASM 8080',10
        defb    '1..3->',0

;--------------------------------------------

TERROR: defb    '???',7,0
TNORAM: defb    'NO MEMORY... ',0

;--------------------------------------------

MODE    EQU     BASA+12H
ENDTX   EQU     BASA+0

L11     EQU     BASA+13H
L12     EQU     BASA+14H
L13     EQU     BASA+03H
L15     EQU     BASA+0FH
L17     EQU     BASA+05H
KOLERR  EQU     BASA+02H
KODERR  EQU     BASA+04H
L1A     EQU     BASA+07H
L1C     EQU     BASA+16H
L26     EQU     BASA+09H
L29     EQU     BASA+0BH
L2F     EQU     BASA+0CH
L31     EQU     BASA+0AH
L39     EQU     BASA+0DH
L53     EQU     BASA+56H
L68     EQU     BASA+11H
L86     EQU     BASA+59H
L88     EQU     BASA+58H
L8C     EQU     BASA+57H

;--------------------------------------------

PROB03  EQU     0320H
PROB04  EQU     0420H
PROB17  EQU     1120H

        END

Если не знаете, что здесь можно менять, что нет, лучше ничего не меняйте (это не полный дизассемблер, хотя менять адреса всего блока можно).

_________________
***
barsik
barsik
Мастер+

Сообщения : 458
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty .

Сообщение  barsik в Сб Фев 02 2019, 16:20

8
RAMDOS ИРИШИ для эл.диска 512 кб:

; RAMDOS 3.0 ИРИША 04.05.91 -- 15:35
; (c) В.Ивинских, 1989


        .8080
        aseg
        ORG     100H

RC      EQU     8000H           ; АДРЕС RC (RAMDOS-COMMANDER-а)
PA      EQU     40H
PB      EQU     41H
PC      EQU     42H
PU      EQU     43H

MNTR    EQU     0C800H

;--------------------------------------------

CMPDH   EQU     MNTR+3CH
ERROR0  EQU     MNTR+42H
PILIK   EQU     MNTR+4BH
HEXHL@  EQU     MNTR+4EH        ; Вывод HL и пробела
SPACE   EQU     MNTR+56H
LF      EQU     MNTR+5CH
MSNAM@  EQU     MNTR+62H        ; MSNAM@: defb 14,'ИМЯ ФАЙЛА ? ',15,0

BEGADR  EQU     MNTR+71H        ; TBGADR: defb 10,14,'НАЧАЛЬНЫЙ АДРЕС: ',15,0

COUT    EQU     MNTR+9
HEX_A   EQU     MNTR+15H
MSSG    EQU     MNTR+18H
STRIN   EQU     MNTR+0FH
CHSUM   EQU     MNTR+2AH
MDIRS   EQU     MNTR+36H
ENTER   EQU     MNTR+39H

; ЯЧЕЙКИ ХРАНЕНИЯ МЕТКИ

NAMF    EQU     8FA8H
EXT     EQU     8FB0H
SCODE   EQU     8FB3H
NFILE   EQU     8FB4H
LENGTH  EQU     8FB5H
NSEC    EQU     8FB7H
KONTRL  EQU     8FB9H
ADRAM   EQU     8FBBH
WBYTE   EQU     8FBDH
WSEC    EQU     8FBEH
RBYTE   EQU     8FC0H
RSEC    EQU     8FC1H
FFSEC   EQU     8FC3H   ; N ПЕРВОГО СВОБОДНОГО СЕКТОРА
LFSEC   EQU     8FC5H   ; N ПОСЛЕДНЕГО СВОБОДНОГО СЕКТОРА

PAR_A   EQU     8F80H   ; параметры введённой команды
PAR_H   EQU     8F81H
PAR_D   EQU     8F83H
PAR_B   EQU     8F85H

RNAMF   EQU     8F88H
RSCODE  EQU     8F93H
RNFILE  EQU     8F94H
CSUM1   EQU     8F95H
LEN1    EQU     8F78H
NSEC1   EQU     8F7AH
KSOUT   EQU     8F7CH
NAME2   EQU     8F97H
ADIRS   EQU     8FD1H
ASTART  EQU     8FE3H
RAB1    EQU     8FF6H

;--------------------------------------------

        .phase  0D800H

        JMP     INIT   ;     ИНИЦ-ИЯ ДИСКА
        JMP     RDBYTE ; +03 ЧТЕНИЕ БАЙТА
        JMP     WRBYTE ; +06 ЗАПИСЬ БАЙТА
        JMP     RDMAS  ; +09 ЧТЕНИЕ МАССИВА
        JMP     WRMAS  ; +0C ЗАПИСЬ МАССИВА
        JMP     COPSEC ; +0F КОПИР.СЕКТОРОВ
        JMP     OPEN   ; +12 ПОИСК ФАЙЛА
        JMP     CREATE ; +15 СОЗДАНИЕ ФАЙЛА
        JMP     KILL   ; +18 УНИЧТ.ФАЙЛА
        JMP     RENAME ; +1B ПЕРЕИМЕНОВ.
        JMP     CLEAR  ; +1E ОЧИСТКА
        JMP     REWIND ; +21 ЧТЕНИЕ С НАЧАЛА
        JMP     LREAD  ; +24 ЛОГ.ЧТЕНИЕ
        JMP     LWRITE ; +27 ЛОГ.ЗАПИСЬ
        JMP     DSPACE ; +2A ИЗМЕНЕН.ДЛИНЫ
        JMP     EXEC   ; +2D ЗАПУСК ПРОГР.
        JMP     RDFILE ; +30 ЧТЕНИЕ ФАЙЛА
        JMP     WRFILE ; +33 ЗАПИСЬ ФАЙЛА
        JMP     RDMETF ; +36 ЧТЕНИЕ МЕТКИ
        JMP     WRMETF ; +39 ЗАПИСЬ МЕТКИ
        JMP     @NAME  ; +3C РАСПАК.ИМЕНИ
        JMP     EXRC   ; +3F
        JMP     RDF1   ; +42
        JMP     WRF1   ; +45
        JMP     RDF    ; +48 ФУНКЦИЯ RC


;--------------------------------------------

;************************
;*  П/П НИЖНЕГО УРОВНЯ  *
;************************

COPNAM: CALL    @NAME
        LXI     D,NAMF
        LXI     B,12

;--------------------------------------------

;  КОПИР.БАЙТОВ
; HL-ОТКУДА, DE-КУДА, BC-ДЛИНА

COPY:   MOV     A,M
        STAX    D
        INX     H
        INX     D
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     COPY
        RET

;--------------------------------------------

; УСТАНОВКА N СТРАНИЦЫ
; D(0..2)-N СТРАНИЦЫ

SETNP:  MOV     A,D
        ORI     0F8H
        OUT     PC
        RET

;--------------------------------------------

; УСТАНОВКА N СЕКТОРА

; DE= N СЕКТОРА
; А=  N БАЙТА

SET_NS: PUSH    PSW
        MVI     A,82H
        OUT     PU
        MVI     A,0B8H
        OUT     PC
        POP     PSW
        OUT     PA
        MVI     A,8
        CALL    STROB
        CALL    SETNP
        MOV     A,E
        OUT     PA
        MVI     A,10
;       JMP     STROB

; A= N РАЗР*2

STROB:  OUT     PU
        INR     A
        OUT     PU
        RET

; ----------------------------------------------

; ЗАПИСЬ СЕКТОРА СВОПИНГА

WRSWAP: PUSH    PSW
        PUSH    H
        PUSH    D
        PUSH    B
        LXI     D,7
        CALL    WRM0

;* ВОССТ.РЕГИСТРОВ И RET С CY=1

POPRC:  POP     B
        POP     D
        POP     H
        POP     PSW
        STC
        RET

;--------------------------------------------

DBLNAM: MVI A,4

;* ВОССТ.РЕГИСТРОВ И RET С CY=0

POPRNC: POP     B
        POP     D
RNC2:   POP     H
RNC1:   INX     SP
        INX     SP
RETCY0: ORA     A
        RET

; ----------------------------------------------

; ЗАПИСЬ СЕКТОРА ИЗ 00 АДРЕСА
; DE - N СЕКТОРА
WRM0:
        LXI     H,0
WRSEC:  LXI     B,256
        XRA     A

; * *  ЗАПИСЬ МАССИВА  * *
;     В Х О Д :
; HL-НАЧ.АДРЕС ОЗУ ПЭВМ
; DE-N НАЧ.СЕКТОРА
; А -N НАЧ.БАЙТА НА ЭТОМ СЕКТОРЕ
; BC-ДЛИНА,БАЙТ

;     В Ы Х О Д :
; HL-АДРЕС ПОСЛ.БАЙТА+1
; DE,A-N ПОСЛ.СЕКТОРА,БАЙТА+1
; B=A

WRMAS:  PUSH    PSW
        CALL    SET_NS
        POP     PSW
        PUSH    D
        MOV     D,A
        DCX     B
        INR     C
        INR     B
           
WRM2:   MOV     A,M
        OUT     PA
  PUSH PSW
        MVI     A,14    ; СТРОБ ЗАПИСИ
        OUT     PU
        MVI     A,15
        OUT     PU
        MVI     A,6     ; СТРОБ АДРЕСА
        OUT     PU
        MVI     A,7
        OUT     PU
  POP PSW
        INR     D               ; СЧЕТ БАЙТОВ В СЕКТОРЕ
        JNZ     WRM1
        INR     E               ; СЧЕТ СЕКТОРОВ
        JNZ     WRM1

;+ N СТРАНИЦЫ

        POP     D
        INR     D
        CALL    SETNP
        PUSH    D
        LXI     D,0
           
WRM1:   INX     H
        DCR     C
        JNZ     WRM2
        DCR     B
        JNZ     WRM2
           
RETRW:  MVI     A,12
        OUT     PU
        MOV     B,D
        MOV     A,E
        POP     D
        MOV     E,A
        MOV     A,B
        RET

;--------------------------------------------

; ЧТЕНИЕ СЕКТОРА СВОПИНГА

RDSWAP: PUSH    PSW
        PUSH    H
        PUSH    D
        PUSH    B
RDSW1:  LXI     D,7
        CALL    RDM0
        JMP     POPRC

; ----------------------------------------------

; ЧТЕНИЕ СЕКТОРА В 00 АДРЕС
; DE - N СЕКТОРА

RDM0:
        LXI     H,0
RDSEC:  LXI     B,256
        XRA     A

;  * *  ЧТЕНИЕ МАССИВА  * *
;  ПАРАМЕТРЫ - СМ. WRMAS

RDMAS:  PUSH    PSW
        CALL    SET_NS
        POP     PSW
RDM3:   PUSH    D
        MOV     D,A
        DCX     B
        INR     C
        INR     B

RDM2:   IN      PB
        MOV     M,A
        MVI     A,6
        OUT     PU              ; СТРОБ INCR АДР
        INR     A
        OUT     PU
        INR     D
        JNZ     RDM1
        INR     E
        JNZ     RDM1
           
        POP     D
        INR     D
        CALL    SETNP
        PUSH    D
        LXI     D,0

RDM1:   INX     H
        DCR     C
        JNZ     RDM2
        DCR     B
        JNZ     RDM2
        JMP     RETRW

;--------------------------------------------

;  КОПИРОВАНИЕ СЕКТОРОВ
;  HL-ОТКУДА, DE-КУДА
;  BC-КОЛ-ВО СЕКТОРОВ

COPSEC: CALL    WRSWAP
        CALL    CMPDH
        JNC     COPDCR

; КОПИРОВАНИЕ ВПЕРЕД

        XCHG
        DAD     B
        DCX     H
        XCHG
        DAD     B
        DCX     H
COPINR: CALL    COPS1
        DCX     H
        DCX     D
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     COPINR
        JMP     RDSWAP

;--------------------------------------------

; КОПИР.НАЗАД

COPDCR: CALL    COPS1
        INX     H
        INX     D
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     COPDCR
        JMP     RDSWAP

;--------------------------------------------

COPS1:  PUSH    B
        PUSH    H
        PUSH    D
        XCHG
        CALL    RDM0
        POP     D
        PUSH    D
        CALL    WRM0
        POP     D
        POP     H
        POP     B
        RET

;--------------------------------------------

;  * *  ЗАПИСЬ БАЙТА  * *
; В Х О Д :        В Ы Х О Д :
;DE- N СЕКТОРА   DE,B- N СЛЕД. БАЙТА
;B - N БАЙТА
;A - БАЙТ ЗАПИСИ

WRBYTE: PUSH    PSW
        MOV     A,B
        CALL    SET_NS
        INR     B
        JNZ     WRB1
        INX     D
WRB1:   POP     PSW
        PUSH    PSW
        OUT     PA
        MVI     A,14
        CALL    STROB
        MVI     A,12
        OUT     PU
        POP     PSW
        RET

;--------------------------------------------

RDFLAG: LXI     D,0
        MVI     B,1BH

;  * * ЧТЕНИЕ БАЙТА * *
; ПАРАМЕТРЫ - СМ.WRBYTE

RDBYTE: MOV     A,B
        CALL    SET_NS
        INR     B
        JNZ     RDB1
        INX     D
RDB1:   MVI     A,12
        OUT     PU
        IN      PB
        RET

;--------------------------------------------

;  ИНИЦИАЛИЗАЦИЯ ЭЛ.ДИСКА

INIT:   LXI     H,DIRS
        SHLD    ADIRS
        MVI     C,66H
        CALL    RDFLAG
        ANI     7FH
        CMP     C
        RZ
IND2:   MVI     B,0
        MOV     A,C
        CALL    WRBYTE
        INX     D
        MOV     A,D
        CPI     17
        JC      IND2
        LXI     D,0
IND3:   MVI     B,0
        CALL    RDBYTE
        ORA     A
        JZ      IND4
        XRA     A
        MOV     B,A
        CALL    WRBYTE
        INX     D
        JMP     IND3

;--------------------------------------------

IND4:   XCHG
        DCX     H
        SHLD    LFSEC

        LXI     D,0000
        MOV     B,D
IND1:   XRA     A               ; ОБНУЛЕНИЕ КАТАЛОГА
        CALL    WRBYTE
        MOV     A,E
        CPI     7
        JNZ     IND1

        LXI     H,10H
        SHLD    FFSEC

        MVI     A,8     ; A=8
        MOV     E,D     ; E=D=0
        MOV     A,E
        OUT     PA              ; 0 В ДАННЫЕ
        MVI     A,8             ; ЗАП.МЛ.АДРЕС
        CALL    STROB
        IN      PB
        CPI     0C3H
        MOV     A,C
        JZ      IND5
        MVI     A,0E6H
IND5:   MVI     B,27
        CALL    WRBYTE
WRMET1: CALL    WRMET2
        JMP     WRMAS

;--------------------------------------------

;************************
;* П/П РАБОТЫ С ФАЙЛАМИ *
;************************

; ВЫЧИСЛЕНИЕ АДРЕСА МЕТКИ
; ВХОД: A-N МЕТКИ (0..55)
; ВЫХОД:        DE,A-АДРЕС МЕТКИ
; RC-ВСЕ НОРМАЛЬНО
; RNC-ПЛОХОЙ N МЕТКИ

ADRMET: ORA     A
        JM      BADADR
        CPI     56
        JC      ADM1
BADADR: MVI     A,5
        RET

;--------------------------------------------

ADM1:   PUSH    H
        MVI     H,0
        MOV     D,H
        MOV     L,A
        DAD     H
        DAD     H
        DAD     H
        DAD     H
        DAD     H
        MOV     E,H
        MOV     A,L
        POP     H
        STC
        RET

;--------------------------------------------

WRMET0: LDA     NFILE

; ЗАПИСЬ МЕТКИ НА ДИСК
; A-N МЕТКИ ФАЙЛА

WRMETF: PUSH    PSW
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    ADRMET
        JNC     POPRNC
        LXI     H,NAMF
        LXI     B,27
        CALL    WRMAS
        CALL    WRMET1
        JMP     POPRC

;--------------------------------------------

WRMET2: LXI     H,FFSEC
        LXI     D,0
        MVI     A,28
        LXI     B,4
        RET

;--------------------------------------------

RDMET1: POP PSW

; ЧТЕНИЕ МЕТКИ
; A-N МЕТКИ ФАЙЛА

RDMETF: PUSH    PSW
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    ADRMET
        JNC     POPRNC
        LXI     H,NAMF
        LXI     B,27
        CALL    RDMAS
        CALL    WRMET2
        CALL    RDMAS
        POP     B
        POP     D
        POP     H
        POP     PSW
        LDA     NAMF
        ORA     A
        RZ
        STC
        RET

;--------------------------------------------

;  СОЗДАНИЕ МЕТКИ ФАЙЛА
; ВХОД : HL-УКАЗАТЕЛЬ ИМЕНИ ФАЙЛА
; BC-ДЛИНА,СЕКТОРОВ; D-ТИП ФАЙЛА

CREATE: PUSH    PSW
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    OPEN
        JC      DBLNAM          ; ДУБЛ.ИМЯ
        CPI     2
        JZ      DBLNAM

        POP     H               ; ДЛИНА
        SHLD    LENGTH
        POP     D
        POP     H
        POP     PSW
        CALL    COPNAM
        LXI     H,0FFFFH
        SHLD    ADRAM
        LHLD    LENGTH
        XCHG
        LHLD    FFSEC
        SHLD    NSEC
        DAD     D
        SHLD    FFSEC
        DCX     H
        XCHG
        LHLD    LFSEC
        CALL    CMPDH
        MVI     A,6
        CMC
        RNC                     ; НЕТ МЕСТА НА ДИСКЕ
           
        MVI     C,-1
CRF1:   INR     C
        MOV     A,C
        CALL    ADRMET
        MOV     B,A
        MVI     A,7
        RNC             ; НЕТ МЕСТА ДЛЯ МЕТКИ
        CALL    RDBYTE
        ORA     A
        JNZ     CRF1

        MOV     A,C
        STA     NFILE
        JMP     CLR2

;--------------------------------------------

CLEAR:  CALL    RDMETF
        RNC
CLR1:   CALL    CMPSC
        RNC
CLR2:   LXI     H,0
        SHLD    WBYTE
        SHLD    WBYTE+1
        JMP     RWND1

;--------------------------------------------

REWIND: CALL    RDMETF
        RNC
RWND1:  LXI     H,0
        SHLD    RBYTE
        SHLD    RBYTE+1
        JMP     LWRET

;--------------------------------------------

;   ПОИСК МЕТКИ ФАЙЛА
; HL - УКАЗАТЕЛЬ ИМЕНИ В ОЗУ,
; D- ТИП ФАЙЛА
; * ВЫХОД :
; А - N ФАЙЛА
; D - ТИП
; NAMF... - МЕТКА ФАЙЛА

;--------------------------------------------

OPEN:   CALL    @NAME
        MVI     C,-1
OPN3:   INR     C
        MOV     A,C
        CALL    RDMETF
        JZ      OPN3
        MVI     A,1
        RNC                     ; ФАЙЛ НЕ НАЙДЕН
        LXI     H,RNAMF
        LXI     D,NAMF
        MVI     B,8
        CALL    CMP_TX
        JNZ     OPN3

;* ИМЯ СОВПАЛО

        MOV     A,M
        CPI     20H
        JZ      OPN1
        MVI     B,3
        CALL    CMP_TX
        JNZ     OPN3

;* ФАЙЛ НАЙДЕН

OPN1:   LDA     RSCODE
        MOV     D,A
        CALL    CMPTYP
        RNC                     ; НЕСОВП.ТИПА
        JMP     RWND1

;--------------------------------------------

; РАСПАКОВКА ИМЕНИ

@NAME:  PUSH    B
        PUSH    D
        LXI     D,RNAMF-1
        XRA     A
        MVI     B,12
@NM1:   STAX    D
        INX     D
        MVI     A,20H
        DCR     B
        JNZ     @NM1
        LXI     D,RNAMF
        MOV     A,M
        CPI     0DH
        JZ      NE2
        STAX    D
        MVI     B,07
@NM2:   INX     D
        CALL    @NM4
        STAX    D
        DCR     B
        JNZ     @NM2
@NM3:   CALL    @NM4
        JMP     @NM3

;--------------------------------------------

@NM4:   INX     H
        MOV     A,M
        CPI     '.'
        JZ      YEXT
        CPI     21H
        JC      NOEXT
        RET

;--------------------------------------------

;* ЕСТЬ РАСШИРЕНИЕ

YEXT:   POP     D
        MVI     B,3
        LXI     D,RNAMF+7
YE1:    INX     H
        INX     D
        MOV     A,M
        CPI     21H
        JC      YE3
        STAX    D
        DCR     B
        JNZ     YE1
           
YE3:    LXI     H,TABEXT-1
YE4:    INX     H
        MOV     A,M
        ORA     A
        JZ      NE5
        LXI     D,RNAMF+8
        MVI     B,3
        CALL    CMP_TX
        JNZ     YE4
        POP     PSW
        ANI     80H
        ORA     M
        MOV     D,A
        JMP     NE6

;--------------------------------------------

;* НЕТ РАСШИРЕНИЯ

NOEXT:  POP     D
NE2:    POP     D
        MOV     A,D
        ANI     7FH
        JZ      NE6
        LXI     H,TABEXT-1
NE1:    INX     H
        MOV     A,M
        ORA     A
        JZ      NE6
        INX     H
        INX     H
        INX     H
        MOV     A,D
        ANI     7FH
        CMP     M
        JNZ     NE1
        DCX     H
        DCX     H
        DCX     H
        PUSH    D
        PUSH    B
        LXI     D,RNAMF+8
        LXI     B,3
        CALL    COPY
        POP     B
NE5:    POP     D
NE6:    MOV     A,D
        STA     RSCODE
        POP     B
        LXI     H,RNAMF
        RET

;--------------------------------------------

TABEXT: defb    'EXE',1
        defb    'BAS',2
        defb    'COM',3
        defb    'TXT',4
        defb    'SYS',7FH
        defb    0

;--------------------------------------------

; СРАВНЕНИЕ ТЕКСТОВ

CMP_TX: LDAX    D
        CMP     M
        RNZ
CTX1:   INX     H
        INX     D
        DCR     B
        JNZ     CMP_TX
        RET

;--------------------------------------------

; СРАВНЕНИЕ ТИПОВ
; ВХОД: D(0..6)-ТИП ФАЙЛА ЗАКАЗ.
; SCODE(0..6)-ТИП ФАЙЛА НА ДИСКЕ

CMPTYP: MOV     A,D
        ANI     7FH
        STC
        RZ
        PUSH    D
        MOV     D,A
        LDA     SCODE
        ANI     7FH
        CMP     D
        POP     D
        STC
        RZ
        MVI     A,2
        ORA     A
        RET

;--------------------------------------------

METSC:  CALL    RDMETF
        RNC

; СРАВНЕНИЕ КОДА ЗАЩИТЫ
; ВХОД: SCODE И D

CMPSC:  LDA     SCODE
        ORA     A
        STC
        RP
        MOV     A,D
        RLC
        MVI     A,3
        RET

;--------------------------------------------

; ПЕРЕИМЕНОВАНИЕ
; A - N ФАЙЛА
; D - SCODE
; (HL)-НОВОЕ ИМЯ

RENAME: CALL    METSC
        RNC
        CALL    COPNAM
        JMP     LWRET

;--------------------------------------------

; УНИЧТОЖЕНИЕ ФАЙЛА
; A - N ФАЙЛА
; D - КОД ЗАЩИТЫ

KILL:   CALL    METSC
        RNC
        XRA     A
        STA     NAMF
        MOV     D,A
        MOV     E,A
        LHLD    LENGTH
        CALL    DLINA
        CALL    DSP1
        STC
        RET

;--------------------------------------------

; ИЗМЕНЕНИЕ ДЛИНЫ ФАЙЛА
; ВХОД : А - N ФАЙЛА
;        HL- ИЗМЕНЕНИЕ ДЛИНЫ,СЕКТ.

;  ИСПОЛЬЗУЕТ ЯЧЕЙКИ :
; LЕNGTH- ТЕК.ДЛИНА
; LEN1  - ИЗМЕНЕНИЕ ДЛИНЫ
; NSEC  - ПЕРВЫЙ СЕКТОР
; FFSEC,LFSEC

DSPACE: CALL    RDMETF
        RNC
DSP1:   SHLD    LEN1
        LHLD    LENGTH
        XCHG
        LHLD    NSEC
        DAD     D
        SHLD    NSEC1
        MOV     B,H
        MOV     C,L
        LHLD    LEN1
        XCHG
        LHLD    FFSEC
        DAD     D
        XCHG
        DCX     D
        LHLD    LFSEC
        CALL    CMPDH
        MVI     A,6
        CMC
        RNC
        LHLD    FFSEC
        CALL    SUB_HB
        PUSH    H
        LHLD    LEN1
        DAD     B
        XCHG
        MOV     H,B
        MOV     L,C
        POP     B
        MOV     A,B
        ORA     C
        CNZ     COPSEC
        LHLD    LEN1
        XCHG
        LHLD    LENGTH
        DAD     D
        SHLD    LENGTH
        LHLD    FFSEC
        DAD     D
        SHLD    FFSEC
        CALL    WRMET0
        PUSH    PSW

; КОРРЕКЦИЯ МЕТОК

        MVI     C,-1
COR1:   INR     C
        MOV     A,C
        CALL    RDMETF
        JZ      COR1
        JNC     RDMET1
        LHLD    NSEC1
        XCHG
        LHLD    NSEC
        CALL    CMPDH
        JC      COR1

        XCHG
        LHLD    LEN1
        DAD     D
        SHLD    NSEC
        MOV     A,C
        CALL    WRMETF
        JMP     COR1

;--------------------------------------------

DLINA:  MOV     B,H
        MOV     C,L
        XCHG
        MOV     D,A

;------------
; HL:=HL-BC

SUB_HB: MOV     A,L
        SUB     C
        MOV     L,A
        MOV     A,H
        SBB     B
        MOV     H,A
        RET

;--------------------------------------------

; ЛОГИЧЕСКОЕ ЧТЕНИЕ ФАЙЛА
; A - N ФАЙЛА
; HL- АДРЕС ОЗУ
; BC- ДЛИНА,БАЙТ

LREAD:  CALL    RDMETF
        RNC
LRD1:   PUSH    H
        LHLD    RBYTE
        MOV     A,L
        PUSH    PSW
        MOV     E,H
        DAD     B
        SHLD    RBYTE
        LDA     RBYTE+2
        MOV     D,A
        PUSH    D
        ACI     0
        STA     RBYTE+2
        MOV     D,A
        PUSH    B
        MOV     B,H
        MOV     C,L
        LHLD    WBYTE
        CALL    SUB_HB
        LDA     WBYTE+2
        SBB     D
        POP     B
        JP      LRD3

        DAD     B
        MOV     B,H
        MOV     C,L
        LHLD    WBYTE
        SHLD    RBYTE
        LDA     WBYTE+2
        STA     RBYTE+2
LRD3:   LHLD    NSEC
        POP     D
        DAD     D
        XCHG
        POP     H
        XTHL
        MOV     A,B
        ORA     C
        JNZ     LRD2
        POP     PSW
        MVI     A,8
        ORA     A
        RET

;--------------------------------------------

LRD2:   POP     PSW
        PUSH    B
        CALL    RDMAS
        POP     B
        JMP     LWRET

;--------------------------------------------

; ЛОГ.ЗАПИСЬ В ФАЙЛ
; A - N ФАЙЛА
; HL- АДРЕС ОЗУ
; BC- ДЛИНА, БАЙТ
; D - КОД ЗАЩИТЫ

LWRITE: CALL    METSC
        RNC
        PUSH    B
        PUSH    H
        LHLD    WBYTE
        DAD     B
        MOV     E,H
        LDA     WBYTE+2
        ACI     0
        MOV     D,A
        INX     D
        LHLD    LENGTH
        CALL    CMPDH
        JNC     LWR1

;* УВЕЛИЧИТЬ ФАЙЛ

        CALL    DLINA
        INX     H
        CALL    DSP1
        JNC     RNC2

LWR1:   LHLD    WSEC
        XCHG
        LHLD    NSEC
        DAD     D
        XCHG
        LDA     WBYTE
        POP     H
        POP     B
        PUSH    B
        CALL    WRMAS
        POP     B
        PUSH    H
        LHLD    WBYTE
        DAD     B
        SHLD    WBYTE
        LDA     WBYTE+2
        ACI     0
        STA     WBYTE+2
        POP     H

;* ЗАВЕРШЕНИЕ П/П READ/WRITE

; ВЫХОД : A=NFILE,D=SCODE

LWRET:  LDA     SCODE
        MOV     D,A
        JMP     WRMET0

;--------------------------------------------

; ЗАПУСК ПРОГРАММ

EXEC:   MVI     A,1
EXEC1:  CALL    RDFILE
        RNC
EXEC2:  PCHL

;--------------------------------------------

; ЧТЕНИЕ ФАЙЛА

RDFIL0:
        XRA     A
        MOV     H,A
        MOV     L,A
        MOV     D,A
        MOV     E,A

RDFILE: CALL    RDF1
        RNC
        PUSH    H
        CALL    CHSUM
        LHLD    KONTRL
        CALL    SUB_HB
        MOV     A,H
        ORA     L
        POP     H
        STC
        RZ
        MVI     A,0AH
        ORA     A
        RET

;--------------------------------------------

RD_TMP: LXI     B,NAMRC-1
RDF10:
        XRA     A
        MOV     H,A
        MOV     L,A
        MOV     D,A
        MOV     E,A

RDF1:   PUSH    D
        PUSH    H
        PUSH    B
        CALL    DLINA
        INX     H
        XTHL
        CALL    OPEN
        POP     B
        POP     H
        POP     D
        RNC
        MOV     A,D
        ORA     E
        JNZ     RDF2

;* АДРЕСА НЕ УКАЗАНЫ

        LXI     B,0FFFFH
        MOV     A,H
        ORA     L
        JNZ     RDF2
        LHLD    ADRAM
        INX     H
        MOV     A,H
        ORA     L
        MVI     A,9
        RZ
        DCX     H
RDF2:   PUSH    H
        CALL    LRD1
        JNC     RNC1
        POP     H
        PUSH    H
        DAD     B
        DCX     H
        XCHG
        POP     H
        STC
        RET

;--------------------------------------------

; ЗАПИСЬ ФАЙЛА

WRFILE: PUSH    H
        PUSH    B
        PUSH    PSW
        CALL    CHSUM
        MOV     H,B
        MOV     L,C
        SHLD    CSUM1
        POP     PSW
        POP     B
        POP     H
WRF1:   PUSH    H
        PUSH    B
        CALL    DLINA
        INX     H
        MOV     C,H
        MVI     B,0
        INX     B
        XTHL
        CALL    CREATE
        JC      WRF2
        CPI     4
        JNZ     RNC2
WRF2:   LHLD    CSUM1
        SHLD    KONTRL
        CALL    CLR1
        POP     B
        POP     H
        RNC
        SHLD    ADRAM
        LDA     RSCODE
        STA     SCODE
        CALL    LWRET
        JMP     LWRITE

;--------------------------------------------

; ЗАПУСК RAMDOS COMMANDER

EXRC:   PUSH    PSW
        PUSH    H
        PUSH    D
        PUSH    B
        LDA     0BFFFH
        DCR     A
        JZ      POPRC
EXRC1:
        CALL    WR_TMP

.comment \
        CALL    RDFLAG
        ORA     A
        JM      RDRAM

;* ЧТЕНИЕ ИЗ ПЗУ

        XRA     A
        OUT     PA
        MVI     A,8
        CALL    STROB
        LXI     B,0EFFH
        XRA     A
        CALL    RDM3
        CALL    8000H
        JMP     RETRC
\

;--------------------------------------------

;* ЧТЕНИЕ RC ИЗ ФАЙЛА *

RDRAM:  LXI     D,0
        MOV     H,D
        MOV     L,E
        LXI     B,NAMRC
        CALL    EXEC
RETRC:
        CALL    RD_TMP  ;* RETURN FROM RC
        JMP     POPRC

;--------------------------------------------

WR_TMP: LXI     H,RC
        LXI     D,RC+0EFFH
        MVI     A,0FFH
        LXI     B,NAMRC-1
        JMP     WRF1

;--------------------------------------------

        defb    '*'
NAMRC:  defb    'RC',0
NAMSCR: defb    '**',0

;--------------------------------------------

;* ОБРАБОТКА ФУНКЦИЙ RC

RDF:
        LXI     D,8
        LXI     H,RC+0E00H
        CALL    WRSEC
        CALL    RD_TMP
        LXI     B,NAME2
        CALL    RDFIL0
        PUSH    PSW
        JNC     RDF11
        LDA     SCODE
        ANI     7FH
        DCR     A
        JNZ     RDF11

;* ЗАПУСК EXE-ФАЙЛА

        PUSH    H
        LXI     B,NAMSCR
        CALL    RDF10
        POP     H
        CALL    EXEC2

;* ПОВТОРНЫЙ ЗАПУСК RC

RDF11:
        CALL    WR_TMP
        LXI     B,NAMRC
        CALL    RDFIL0
        JNC     ENTER
        LXI     D,8
        LXI     H,RC+0E00H
        CALL    RDSEC
        POP     PSW
        RET

;--------------------------------------------

;**********************
;* ОБРАБОТКА ДИРЕКТИВ *
;**********************

DIRS:   CPI     'D'
        JZ      DIR_D
        CPI     'R'
        JZ      DIR_R
        CPI     'W'
        JZ      DIR_W
        CPI     'X'
        JZ      DIR_X
        CPI     'N'
        JZ      DIR_N
        CPI     'Z'
        JZ      DIR_Z
        JMP     MDIRS

;--------------------------------------------

DIR_D:  LXI     H,D_HEAD
        CALL    MSSG
        MVI     A,-1
        PUSH    PSW
DIRD1:  POP     PSW
        INR     A
        PUSH    PSW
        CALL    RDMETF
        JZ      DIRD1
        JNC     DIRD4
        LDA     SCODE
        INR     A
        JNZ     DIRD5
           
        LDA     PAR_H
        ORA     A
        JZ      DIRD1

DIRD5:  POP     PSW
        PUSH    PSW
        CALL    ERR1

;* ИМЯ ФАЙЛА

DIRD6:  LXI     H,NAMF
        MVI     B,8
        CALL    DIRD3

;* РАСШИРЕНИЕ

        MVI     C,'.'
        CALL    COUT
        MVI     B,3
        CALL    DIRD3

;* ТИП

        CALL    SPACE
        MOV     A,M
        CALL    ERR2
        INX     H
        INX     H

;* ДЛИНА,СЕКТОР,КОНТР,АДРЕС

        MVI     B,4
DIRD2:  MOV     E,M
        INX     H
        MOV     D,M
        INX     H
        XCHG
        CALL    HEXHL@
        XCHG
        DCR     B
        JNZ     DIRD2
        JMP     DIRD1

;--------------------------------------------

DIRD3:  MOV     C,M
DIRD31: CALL    COUT
        INX     H
        DCR     B
        JNZ     DIRD3
        RET

;--------------------------------------------

;* ВЫВЕЛИ ВЕСЬ ДИРЕКТОРИЙ

DIRD4:  POP     PSW
        CALL    LF

        LXI     B,262DH
DIRD7:  CALL    COUT            ; Вывод линии из 38-ми '-'
        DCR     B
        JNZ     DIRD7

        LXI     H,T_USED
        CALL    MSSG
        LHLD    FFSEC
        PUSH    H
        LXI     B,10H
        CALL    SUB_HB
        CALL    HEXHL@
        LXI     H,T_FREE
        CALL    MSSG
        LHLD    LFSEC
        INX     H
        POP     B
        CALL    SUB_HB
        CALL    HEXHL@
        JMP     LF

;--------------------------------------------

D_HEAD: defb    10,'FH FILENAME.EXT SC SIZE SECT CSUM ADDR',0
T_USED: Defb    10,'  USED ',0
T_FREE: Defb    ' FREE ',0

;--------------------------------------------

;  ЗАПИСЬ ФАЙЛА

DIR_W:  MOV     A,C             ; ТИП
        CALL    RDNAME
        CALL    WRFILE
DIRW1:  JNC     ERROR
        RET

;--------------------------------------------

;  ЧТЕНИЕ ФАЙЛА

DIR_R:  MOV     A,C             ; ТИП
        CALL    RDNAME
        CALL    RDFILE
        JNC     ERROR
        PUSH    D
        PUSH    H
        JMP     DIRI5

;--------------------------------------------

DIR_Z:  CALL    RDNAME
        CALL    EXEC
        JMP     DIRW1

;--------------------------------------------

; УНИЧТОЖЕНИЕ

DIR_X:  CALL    RDNM1
        LHLD    PAR_H
        MOV     D,L
        CALL    KILL
        JMP     DIRW1

;--------------------------------------------

; ПЕРЕИМЕН.

DIR_N:  CALL    RDNM1
        MOV     E,A
        PUSH    D
        LXI     H,T_NEW
        CALL    MSSG
        CALL    RDNAME
        LXI     H,NAME2
        CALL    OPEN
        MVI     A,4
        POP     D
        JC      ERROR
        LDA     PAR_H
        MOV     D,A
        MOV     A,E
        CALL    RDMETF
        LXI     H,NAME2
        MOV     A,E
        CALL    RENAME
        JMP     DIRW1

T_NEW:  defb    10,14,'НОВОЕ ',15,0

;--------------------------------------------

; ВВОД ИМЕНИ
; ВЫХОД : HL=HL,DE=DE
; PSW=PSW,BC=NAME2

RDNAME: PUSH    PSW
        PUSH    H
        PUSH    D

        LXI     H,MSNAM@
        CALL    MSSG

        LXI     H,NAME2
        PUSH    H
        LXI     D,NAME2+15
        CALL    STRIN
        JMP     POPRC

;--------------------------------------------

RDNM1:  CALL    RDNAME
        MOV     D,L
        LXI     H,NAME2
        CALL    OPEN
        RC
        POP     H
ERROR:
        CALL    ERR1
        JMP     ERROR0

;--------------------------------------------

;ERROR0: LXI    H,MSGER
;ERR001: CALL   MSSG
;       JMP     ENTER

;--------------------------------------------

DIRI5:  LXI     H,BEGADR
        CALL    MSSG
        XTHL
        CALL    HEXHL@          ; ПЕЧАТЬ НАЧ.АДР.
        POP     H
        INX     H               ; КОН.АДР - СЛЕДУЮЩИЙ
        CALL    MSSG
        POP     H
        CALL    HEXHL@          ; ПЕЧАТЬ КОН.АДР.
DIRI6:  CALL    PILIK
        JMP     LF

;--------------------------------------------

;LF:    PUSH    B
;       MVI     C,10
;       CALL    COUT
;       POP     B
;       RET

;--------------------------------------------

ERR1:   CALL    LF
ERR2:   CALL    HEX_A
        JMP     SPACE

;--------------------------------------------

;HEXHL@: CALL   HEX_HL
;       JMP     SPACE

;HEX_HL: MOV    A,H
;       CALL    HEX_A
;       MOV     A,L
;       JMP     HEX_A

;--------------------------------------------

        REPT    18
        defb    0
        ENDM

;--------------------------------------------

CHKSUM: DW      09946H

        .dephase
       
        END

Данная DOS не годится для винта или флопа, только для RAM-дисков (они могут быть физически любыми, т.е из ОЗУ ЭВМ или внешними). DOS хранит файлы впритык и при удалении непоследнего файла массив схлопывается, что для дискеты неприемлемо (по этим же причинам не стОит иметь RAM-диск объёмом более 1 мб, это неприятно затормозит при удалении файлов при почти заполненном диске).

При переделке на другую схемотехнику (тип носителя) требуется переделать только п/п-ммы нижнего уровня (чтение/запись байта и массива). Переделку для эл.диска из излишнего ОЗУ ЭВМ уже делали, это несложно. Примечательно, что размер кода DOS всего 2 кб - никто не сможет сделать аналогичный код меньшего размера.

Описание пока в КОИ-7, не отредактированное и не конвертированное в нижний регистр. Позже м.быть сделаю это и заменю.

функции RAMDOS:

 СПРАВОЧНИК ПО СИСТЕМНЫМ ФУНКЦИЯМ RAMDOS 1.5
 -------------------------------------------

INIDSC,D800 - РАЗМЕТКА ДИСКА, ЗАПИСЬ E6 В ЯЧ 1C
   ПРИ НАЛИЧИИ В ПЗУ НА RAM-ДИСКЕ РАСШИРЕНИЯ
   RAMDOS ЗАГРУЖАЕТ ЕГО В ОЗУ. ПРОВЕРЯЕТ НА RC.

RDBYTE,D803 - ЧТЕНИЕ БАЙТА. ВХОД: DE-N СЕКТОРА
   B-N БАЙТА В СЕКТОРЕ; ВЫХОД: A-БАЙТ, DE И B
   УКАЗЫВАЮТ НА СЛЕДУЮЩИЙ БАЙТ В ДИСКЕ

WRBYTE,D806 - ЗАПИСЬ БАЙТА. ВХОД: DE-N СЕКТОРА,
   B-N БАЙТА В СЕКТОРЕ, A-БАЙТ ДЛЯ ЗАПИСИ; ВЫX:
   DE,B УКАЗЫВАЮТ НА СЛЕДУЮЩИЙ БАЙТ RAM-ДИСКА

RDMAS, D809 - ЧТЕНИЕ МАССИВА. ВХ: DE-N СЕКТОРА,
   A-N БАЙТА В СЕКТОРЕ, HL-НАЧАЛО ОБЛАСТИ ОЗУ,
   КУДА ЧИТАТЬ. BC-ДЛИНА СЧИТЫВАЕМОГО МАССИВА
   (БАЙТ!); ВЫХОД: DE,A УСТАНОВЛЕНЫ НА ПЕРВЫЙ
   БАЙТ ПОСЛЕ МАССИВА, HL - УКАЗЫВАЕТ НА АДРЕС
   В ОЗУ ПОСЛЕ СЧИТАННОГО МАССИВА

WRMAS, D80C - ЗАПИСЬ МАССИВА. ВХ: DE-N СЕКТОРА,
   A-N БАЙТА В СЕКТОРЕ, HL-НАЧАЛО МАССИВА В ОЗУ
   BC-ДЛИНА ЗАПИСЫВАЕМОГО МАССИВА (БАЙТ). ВЫХ:
   DE,A И HL ПЕРЕСТАВЛЯЮТСЯ АНАЛОГИЧНО RDMAS

COPSEC,D80F - КОПИРОВАНИЕ СЕКТОРОВ. ВХ: HL-НАЧ.
   АДРЕС ОБЛАСТИ ИСТОЧНИКА (АДРЕС СЕКТОРА), DE-
   НАЧ.АДРЕС ОБЛАСТИ ПРИЕМНИКА, BC-ДЛИНА КОПИ-
   РУЕМОЙ ОБЛАСТИ, СЕКТОРОВ. КОПИРОВАНИЕ В ЛЮ-
   БУЮ СТОРОНУ С ЛЮБЫМ ПЕРЕКРЫТИЕМ.ОГРАНИЧЕНИЕ!
   НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ 7 СЕКТОР (СЕКТ.СВОПИНГА)
   П/П ЗА СЧЕТ СВОПИНГА ПОЛНОСТЬЮ СОХРАНЯЕТ ОЗУ

OPEN, D812  - ОТКРЫТЬ ФАЙЛ. ВХОД: HL-УКАЗАТЕЛЬ
   ИМЕНИ, D-ОЖИДАЕМЫЙ ТИП ФАЙЛА. ЕСЛИ ТИП ФАЙЛА
   НЕИЗВЕСТЕН, ТО D=0. ЕСЛИ D НЕ 0, ТО БУДЕТ
   ОТКРЫТ ФАЙЛ ТОЛЬКО ПРИ СООТВ-И ТИПА. ВЫХ: D-
   ТИП ФАЙЛА, А-НОМЕР МЕТКИ СОЗДАННОГО ФАЙЛА, В
   ОБЛАСТИ NAMF СОЗДАЕТСЯ КОПИЯ МЕТКИ ФАЙЛА.
   ПРИ РАБОТЕ OPEN И ДР.Ф-Й ВОЗМОЖНО ВОЗНИКНО-
   ВЕНИЕ ОШИБКИ. ПРИ ЭТОМ СБРАСЫВАЕТСЯ ПРИЗНАК
   CY И В РЕГ.A ВОЗВР-СЯ КОД ОШИБКИ. ПРИ НОРМА-
   ЛЬНОМ ЗАВЕРШЕНИИ РАБОТЫ ФУНКЦИИ  CY=1.

CREATE,D815 - СОЗДАНИЕ ФАЙЛА. ВХОД: HL-УКАЗАТЕЛЬ
   ИМЕНИ, D-ТИП СОЗДАВАЕМОГО ФАЙЛА, BC - ДЛИНА
   ФАЙЛА (В СЕКТОРАХ!); ВЫХОД: D-ТИП, A-N ФАЙЛА

KILL, D818  - УНИЧТОЖЕНИЕ ФАЙЛА. ВХОД: A-N ФАЙЛА
   D-ТИП ФАЙЛА. В ПЕРВЫЙ БАЙТ МЕТКИ ЗАПИСЫВАЕТ-
   СЯ 0. САМ ФАЙЛ ФИЗИЧЕСКИ УНИЧТОЖАЕТСЯ СДВИ-
   ЖКОЙ ПОСЛЕДУЮЩИХ ФАЙЛОВ НА ЕГО МЕСТО!

RENAME,D81B - ПЕРЕИМЕНОВАНИЕ ФАЙЛА. ВХОД: A -
   N ФАЙЛА, D-ТИП, HL-УКАЗАТЕЛЬ НА НОВОЕ ИМЯ;
   ВЫХОД: A-N ФАЙЛА, D - ТИП ФАЙЛА.

CLEAR, D81E - ОЧИСТКА ФАЙЛА. ВХОД: A-N ФАЙЛА,
   D-ТИП. ВЫХОД: УКАЗАТЕЛИ WBYTE,WSEC,RBYTE И
   RSEC ОБНУЛЯЕТСЯ (ДАННЫЕ В ФАЙЛЕ ОСТАЮТСЯ)

REWIND,D821 - ПЕРЕСТАНОВКА НА ЧТЕНИЕ С НАЧАЛА.
   ВХОД: A-НОМЕР ФАЙЛА. ВЫХОД: УКАЗАТЕЛИ RBYTE,
   RSEC ОБНУЛЯЮТСЯ, WBYTE,WSEC БЕЗ ИЗМЕНЕНИЙ.

LREAD, D824 - ЧТЕНИЕ МАССИВА ИЗ ФАЙЛА. ВХ: A-N
   ФАЙЛА, HL-АДРЕС В ОЗУ, КУДА ЧИТАТЬ, BC-ДЛИНА
   (БАЙТ!). ВЫХОД: A-N ФАЙЛА, HL УКАЗЫВАЕТ НА
   СЛЕДУЮЩИЙ ЗА МАССИВОМ БАЙТ. УКАЗАТЕЛИ RBYTE
   И RSEC ПЕРЕМЕЩАЮТСЯ НА ДЛИНУ СЧИТАННОГО МАС-
   СИВА. ЕСЛИ ДОСТИГНУТ КОНЕЦ ФАЙЛА В ПЕРВЫЙ
   РАЗ, ТО ВОЗВР-ЕТ В РЕГ.BC ДЛИНУ, А ВО ВТОРОЙ
   РАЗ ВОЗНИКАЕТ КОД ОШИБКИ O8.

LWRITE,D827 - ЗАПИСЬ МАССИВА В ФАЙЛ. ВХОД: A-N
   ФАЙЛА, D-ТИП И КОД ЗАЩИТЫ, HL-АДРЕС ЗАПИСИ
   ИЗ ОЗУ, BC-ДЛИНА МАССИВА. ВЫХОД: A-N ФАЙЛА
   D-ТИП И КОД ЗАЩИТЫ, HL-АДРЕС БАЙТА ЗА ЗАПИ-
   САННЫМ МАССИВОМ. ПРИ ПЕРЕПОЛНЕНИИ ФАЙЛА ОН
   АВТОМАТИЧЕСКИ РАСШРЯЕТСЯ НА 2 СЕКТОРА,ОШИБКИ
   НЕ ВОЗНИКАЕТ (ЕСЛИ ПРИ ЭТОМ НЕ ПЕРЕПОЛНЯЕТСЯ
   ДИСК). ПРИ ЭТОМ ВСЕ ПОСЛЕДУЮЩИЕ ФАЙЛЫ СДВИ-
   ГАЮТСЯ, ЧТОБЫ ОСВОБОДИТЬ МЕСТО.

DSPACE,D82A - ИЗМЕНЕНИЕ РАЗМЕРА ФАЙЛА. ВХОД: A -
   N ФАЙЛА, HL-КОЛ-ВО СЕКТОРОВ НА КОТОРОЕ НАДО
   ИЗМЕНИТЬ РАЗМЕР ФАЙЛА (ДЛЯ УВЕЛИЧ-Я - ПОЛОЖ.
   ЧИСЛО, ДЛЯ УМЕНЬШЕНИЯ ОТРИЦАТЕЛЬНОЕ)

EXEC, D82D  - ЗАПУСК ПРОГРАММЫ. ПАРАМЕТРЫ КАК В
   RDFILE. ПРОВЕРЯЕТСЯ КОНТРОЛЬНАЯ СУММА. БУДЕТ
   ЗАПУЩЕН ФАЙЛ С РАСШИРЕНИЕМ EXE, ИНАЧЕ БУДЕТ
   ОШИБКА 01 ИЛИ 02.

RDFILE,D830 - СЧИТАТЬ ЦЕЛЫЙ ФАЙЛ В ОЗУ. ВХОД:
   HL-АДРЕС НАЧАЛА В ОЗУ, DE-АДРЕС КОНЦА В ОЗУ.
   BC-УКАЗАТЕЛЬ НА ИМЯ, A-ТИП ФАЙЛА. ЕСЛИ
   HL=DE=0, ТО ФАЙЛ СЧИТЫВАЕТСЯ В ОЗУ ПО АДРЕСУ
   ADRAM ИЗ МЕТКИ, ЕСЛИ ЖЕ ADRAM ОТСУТСТВУЕТ,
   ТО ВОЗНИКАЕТ ERROR 09.

WRFILE,D833 - ЗАПИСЬ ФАЙЛА НА RAM-ДИСК. ПАРАМЕТ-
   РЫ СМ. RDFILE. АВТОМАТИЧЕСКИ СОЗДАЕТСЯ НОВЫЙ
   ФАЙЛ С УКАЗАННЫМ ИМЕНЕМ (ЕСЛИ УЖЕ БЫЛ ФАЙЛ С
   ТАКИМ ИМЕНЕМ, ТО ОН ПРЕДВАРИТЕЛЬНО УНИЧТО-
   ЖАЕТСЯ). НАЧАЛЬНЫЙ АДРЕС ЗАНОСИТСЯ В ADRAM
   В МЕТКЕ ЗАПИСАННОГО ФАЙЛА.

RDMETF,D836 - СЧИТЫВАНИЕ МЕТКИ ФАЙЛА В ОЗУ
   В ОБЛАСТЬ NAMF. ВХОД: A - N ФАЙЛА

WRMETF,D839 - ЗАПИСЬ МЕТКИ НА RAM-ДИСК. ВХОД:
   A-N ФАЙЛА. ПЕРЕПИСЫВАЕТСЯ МЕТКА ТЕКУЩЕГО
   ФАЙЛА ИЗ ОБЛАСТИ NAMF В МЕТКУ ФАЙЛА В КАТА-
   ЛОГЕ RAM-ДИСКА.

RASPAK,D83C - РАСПАКОВКА ИМЕНИ ФАЙЛА. ПРЕОБРАЗО-
   ВАНИЕ ИМЕНИ ФАЙЛА ИЗ БУФЕРА ВВОДА В ФОРМАТ
   RAMDOS В БУФЕРЕ RNAMF:8F88-8F92, SCODE В
   ЯЧЕЙКЕ 8F93. ВХ: HL-УКАЗ-ЛЬ НА ИМЯ (КОНЕЦ-
   0DH), D-ТИП. ВЫХ: HL=RNAMF (8F88), D-ТИП.

EXERC, D83F - СИСТЕМНЫЙ ВЫЗОВ ПРОГРАММЫ RC.EXE
   СОХРАНЯЕТ ВСЕ РЕГИСТРЫ В СТЕКЕ, ЗАПИСЫВАЕТ
   СОДЕРЖИМОЕ ОЗУ 8000-BFFF В ФАЙЛЕ '02'RC.EXE
   И ЗАГРУЖАЕТ ИЗ ПЗУ ИЛИ ОЗУ RAM-ДИСКА ПРОГ-
   РАММУ "RAMDOS-COMMANDER".

EXECOM,D842 - ВЫЗОВ ВНЕШНЕЙ КОМАНДЫ RAMDOS. ВХ:
   HL-УКАЗАТЕЛЬ НА ИМЯ ФАЙЛА КОМАНДЫ (ТИП=X3).
   АНАЛОГИЧНО EXERC СОХРАНЯЕТ ВСЕ РЕГИСТРЫ, ЗА-
   ПИСЫВАЕТ ОЗУ 8000-B7FF В ФАЙЛ '02'COM.EXE,
   ЗАГРУЖАЕТ С 8000 И ВЫЗЫВАЕТ П/П ПО АДРЕСУ
   8000. ПРОГРАММА ВНЕШНЕЙ КОМАНДЫ НЕ ДОЛЖНА
   ПОРТИТЬ СТЕКА. ИСПОЛЬЗУЕТСЯ ДЛЯ ВЫЗОВА КО-
   МАНДЫ 'CAT' И КОМАНДЫ 'STAT'. ВОЗВРАЩАЕТ CY.

ДЛЯ ВЫЗОВА ВНЕШНЕЙ КОМАНДЫ CAT ВЫЗЫВАЕТСЯ Ф-Я
EXECOM С ПАРАМЕТРАМИ: HL-УКАЗАТЕЛЬ НА ИМЯ ФАЙЛА
01CAT.COM (ТИП 83), DE-УКАЗАТЕЛЬ НА ИМЯ КАТАЛОГА
BC-УКАЗАТЕЛЬ ИМЕНИ 2-ГО КАТАЛОГА ИЛИ B=N ФАЙЛА,
A-НОМЕР ФУНКЦИИ, ГДЕ 1-CHDIR,2-FILE COPY, 3-OPEN
ФУНКЦИЯ CHDIR СОЗДАЕТ НОВЫЙ ФАЙЛ-КАТАЛОГ (BC),
ГДЕ РАЗМЕЩАЮТСЯ ВСЕ ВИДИМЫЕ НЕКОМАНДНЫЕ ФАЙЛЫ И
МЕТКИ ИЗ ОБЛАСТИ КАТАЛОГА, А В ОБЛАСТЬ КАТАЛОГА
RAM-ДИСКА ПЕРЕНОСЯТСЯ МЕТКИ ИЗ ПЕРВОГО ФАЙЛА-КА-
ТАЛОГА (DE), А ТАКЖЕ УДАЛЯЕТСЯ МЕТКА ЭТОГО ФАЙЛА
КАТАЛОГА. ТЕМ САМЫМ ПЕРЕХОД В ДРУГОЙ КАТАЛОГ ЗА-
МЕНЯЕТСЯ ПЕРЕЗАПИСЬЮ В ОБЛАСТИ METOK ФАЙЛОВ.
ФУНКЦИЯ 2 ПОЗВОЛЯЕТ СКОПИРОВАТЬ ФАЙЛ В ФАЙЛ-КА-
ТАЛОГ. ФУНКЦИЯ 3 ОТКРЫВАЕТ ВСЕ ФАЙЛЫ, ПЕРЕМЕЩАЯ
ИХ МЕТКИ ИЗ ФАЙЛА КАТАЛОГА В ОБЛАСТЬ МЕТОК НА
RAM-ДИСКЕ.

ПРИ ВЫЗОВАХ УКАЗАТЕЛЬ ИМЕНИ АДРЕСУЕТ ИМЯ ФАЙЛА
СЛЕДУЮЩЕГО ВИДА: ИМЯ ФАЙЛА (ОТ 1 ДО 8 СИМВ),ТОЧКА <.>,
РАСШИРЕНИЕ (ОТ 1 ДО 3 СИМВОЛОВ). ТОЧКИ И РАСШИ-
РЕНИЯ МОЖЕТ НЕ БЫТЬ. ПОСЛЕДНИЙ БАЙТ ИМЕНИ 00 ИЛИ
0DH. ВОЗВРАТ ИЗ ВЫЗОВА: ПРИЗНАК CY=1 - ПРОЦЕДУРА
ВЫПОЛНЕНА НОРМАЛЬНО, CY=0 - ОШИБКА, КОД ОШИБКИ
ВОЗВРАЩАЕТСЯ В РЕГИСТРЕ A:

01 - FILE NOT FOUND
02 - FILE TYPE MISMATCH (НЕСОВПАДЕНИЕ ТИПА)
03 - R/O - WRITE PROTECTED
04 - FILE ALLREADY EXIST
05 - DIRECTORY MISMATCH (N ФАЙЛА ЗАДАН >55)
06 - DISK FULL
07 - DIRECTORY OVERFLOW (НА ДИСКЕ УЖЕ 56 ФАЙЛОВ)
08 - END OF FILE (ПОПЫТКА ЧТЕНИЯ ДАЛЬШЕ КОНЦА)
09 - LOAD ADDRESS NOT DEFINED (RDFILE БЕЗ ADRAM)
0A - BAD SECTOR (НЕ СОВПАДЕНИЕ КОНТР.СУММЫ)

КАТАЛОГ ЗАНИМАЕТ СЕКТОРА С 0 ПО 6, 7 СЕКТОР ИС-
ПОЛЬЗУЕТСЯ ДЛЯ СВОПИНГА ДАННЫХ. НА СЕКТОРАХ НА-
ЧИНАЯ С 8 РАСПОЛАГАЮТСЯ ФАЙЛЫ. МЕТКА СОДЕРЖИТ 32
БАЙТА, Т.О НА 7-МИ СЕКТОРАХ КАТАЛОГА МОЖЕТ БЫТЬ ЗА-
ПИСАНО 56 МЕТОК. ПРИ РАБОТЕ С ФАЙЛОМ ЕГО МЕТКА
СЧИТЫВАЕТСЯ В ОЗУ В ОБЛАСТЬ NAMF - 8FA8...8FC7.
НИЖЕ ОПИСАНО СОДЕРЖИМОЕ МЕТКИ ФАЙЛА И СООТВ.АД-
РЕСА В ОБЛАСТИ RNAMF.

8FA8..8FAF - NAME
8FB0..8FB2 - EXT (РАСШИРЕНИЕ)

8FB3 - SCODE. ТИП И КЛЮЧ ЗАЩИТЫ ФАЙЛА. ТИП ОПРЕ-
   ДЕЛЯЮТ МЛАДШИЕ 7 БАЙТОВ SCODE. СТАНДАРТНЫ
   СЛЕДУЮЩИЕ ТИПЫ ФАЙЛОВ:

0 - ФАЙЛ-ПОДКАТАЛОГ (РАСШИРЕНИЕ USR). СОДЕРЖИТ
   В СЕБЕ ДО 48 ДРУГИХ ФАЙЛОВ И ИХ КАТАЛОГ.
1 - ИСПОЛНЯЕМАЯ ПРОГРАММА (РАСШ-Е EXE)
2 - BASIC ПРОГРАММА (.BAS)
3 - СИСТЕМНЫЙ КОМАНДНЫЙ ФАЙЛ (.COM)
4 - ТЕКСТОВЫЙ ФАЙЛ, ФОРМАТ SCREEN (.TXT)
5 - ТЕКСТОВЫЙ ФАЙЛ, ФОРМАТ '0D,0A' (.DOC)

СТАРШИЙ БИТ SCODE - КЛЮЧ ЗАЩИТЫ ФАЙЛА, ЕСЛИ =1
ТО ФАЙЛ ЗАЩИЩЕН. ПРИ ЭТОМ ЗАПИСЬ И УДАЛЕНИЕ
ФАЙЛА МОЖЕТ БЫТЬ ОСУЩЕСТВЛЕНО ТОЛЬКО ПРИ ТОЧНОМ
УКАЗАНИИ SCODE.

8FB4 - NFILE, НОМЕР МЕТКИ ФАЙЛА (0...55)

8FB5/B6 - LENGTH. ДЛИНА ФАЙЛА,СЕКТОРОВ. ЭТО КО-
ЛИЧЕСТВО СЕКТОРОВ, ОТВЕДЕННОЕ ФАЙЛУ НА ДИСКЕ. НО
ФАКТИЧЕСКАЯ ДЛИНА ФАЙЛА ЕСТЕСТВЕННО МЕНЬШЕ ИЛИ
РАВНА LENGTH.

8FB7/B8 - NSEC. НОМЕР ПЕРВОГО СЕКТОРА ФАЙЛА,
Т.Е ЕГО АДРЕС НА RAM-ДИСКЕ

8FB9/BA - CHSUM. КОНТРОЛЬНАЯ СУММА ЗАПОЛНЕННОЙ
ЧАСТИ ФАЙЛА

8FBB/BC - ADRAM. АДРЕС ЗАГРУЗКИ ФАЙЛА В ОЗУ. ЕС-
ЛИ АДРЕС В ОЗУ НЕ ИСПОЛЬЗУЕТСЯ ТО УКАЗЫВАТЬ FFFF

8FBD,8FBE/BF - WBYTE,WSEC. КОЛИЧЕСТВО ЗАПОЛНЕН-
НЫХ БАЙТОВ ФАЙЛА, Т.Е ЕГО ФАКТИЧЕСКАЯ ДЛИНА. У
ТОЛЬКО, ЧТО СОЗДАННОГО ФАЙЛА ЭТИ ПАРАМЕТРЫ - 0.

8FC0,8FC1/C2 - RBYTE,RSEC. АДРЕС, ОТНОСИТЕЛЬНО
НАЧАЛА ФАЙЛА, С КОТОРОГО БУДЕТ СЧИТАНА ОЧЕРЕДНАЯ
ПОРЦИЯ ИЗ ФАЙЛА. ИСПОЛЬЗУЕТСЯ ДЛЯ ПОСЛЕДОВАТЕЛЬ-
НОГО ЧТЕНИЯ (ПОСЛЕДОВАТ.ДОСТУП К ФАЙЛУ)
БАЙТЫ 1B-1D - DATE. ДАТА СОЗДАНИЯ ИЛИ ИЗМЕНЕНИЯ
ФАЙЛА В ДЕСЯТИЧНОМ ВИДЕ (ДЛЯ ПЕЧАТИ П/П PRHEX) В
ФОРМАТЕ - <ДЕНЬ>,<МЕСЯЦ>,<ГОД>.
БАЙТЫ 1E/1F - TIME. ВРЕМЯ СОЗДАНИЯ ФАЙЛА В ФОР-
МАTE <ЧАС>,<МИНУТЫ>. В ДЕСЯТИЧНОМ ВИДЕ.
ФАЙЛ ИМЕЮЩИЙ МЕТКУ С НОМЕРОМ 0, НЕ МОЖЕТ ИМЕТЬ
ПАРАМЕТРОВ DATE И TIME.
ПАРАМЕТРЫ DATE/TIME НЕ СЧИТЫВАЮТСЯ В ОЗУ В ОБ-
ЛАСТЬ RNAMF, И СЛЕДУЮЩИЕ ЯЧЕЙКИ ОПИСЫВАЮТ СОС-
ТОЯНИЕ ВСЕГО RAM-ДИСКА.

8FC3/C4,FFSEC - ПЕРВЫЙ СВОБОДНЫЙ ОТ ФАЙЛОВ СЕК-
ТОР RAM-ДИСКА.

8FC5/C6,LFSEC - ПОСЛЕДНИЙ СЕКТОР RAM-ДИСКА.
ЭТИ 2 ПЕРЕМЕННЫЕ ДУБЛИРУЮТСЯ НА RAM-ДИСКЕ В МЕТ-
КЕ 00-ФАЙЛА В БАЙТАХ 1C,1D (FFSEC) И 1E/1F
(LFSEC). ПОСЛЕ ПЕРВОНАЧАЛЬНОЙ ИНИЦИАЛИЗАЦИИ
ОБЫЧНО FFSEC=8, LFSEC=7F8 (512K, ПРИ 256 =3F8)
КРОМЕ ЭТОГО В ЯЧЕЙКЕ 27 (1BH) В ОБЛАСТИ 00-ФАЙЛА
ХРАНИТСЯ ПРИЗНАК ИНИЦИАЛИЗАЦИИ. Ф-Я INIDSC ЗАПИ-
СЫВАЕТ ТУДА E7H, ЕСЛИ ОБНАРУЖЕНО ПЗУ НА RAM-ДИС-
КЕ, ИЛИ 0E6H ЕСЛИ ПЗУ НЕТ.

ПО СРАВНЕНИЮ С ВЕРСИЕЙ 1.4 ИЗМЕНЕНА П/П EXERC
И ДОБАВЛЕНА НОВАЯ П/П EXECOM, ПОЗВОЛЯЮЩАЯ В ДА-
ЛЬНЕЙШЕМ РАСШИРЯТЬ СИСТЕМУ НЕ НАРУШАЯ СОВМЕСТИ-
МОСТИ И НЕ ИЗМЕНЯЯ ПЗУ, ПУТЕМ СОЗДАНИЯ ВНЕШНИХ
ФУНКЦИЙ - КОМАНДНЫХ ФАЙЛОВ RAMDOS.

       ЛЕНИНГРАД, ОКТЯБРЬ 1990 Г.


_________________
***
barsik
barsik
Мастер+

Сообщения : 458
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty трудности текстовых редакторов медленных машин

Сообщение  barsik в Вс Фев 03 2019, 12:20

9
Текстовый редактор это одна из самых важных программ компьютера. К сожалению, на медленных машинах, а также на машинах с большим графическим экраном для текстообработки 8-ми разрядкам обычно не хватает скорости.

В то же время в текстовом редакторе процессор 95 процентов времени простаивает, ожидая нажатия клавиш. Нельзя-ли используя это обстоятельство улучшить динамические характеристики редакторов. Рассмотрим вначале какие критичные к скорости прогона ситуации возникают в ходе работы текстового редактора.

Для графических экранов очень тормозной процедурой является ролик, который бывает вверх или вниз. Ролик вверх понятно возникает, если нажать <ВК> в последней строке экрана. Эта процедура есть в ROM-BIOS-ах всех самодельных ЭВМ кроме Специалиста.

Но вот обратной процедуры, ролика экрана вниз нет ни в одном отечественном ROM-BIOS. Это естественно ошибка, т.к такой код есть во всех терминалах и его наличие существенно ускоряет текстовые редакторы (достаточно попробовать турбо-паскалевский редактор на ОРИОНЕ с грамотным драйвером и без него). Это делается искейп-кодом для вставки строки. Новая строка может вставляться в любой строке (не обязательно верхней) и при этом все строки ниже вставленной сдвигаются вниз экрана, происходит обратный ролик.

Естественно ролик вниз нужен не только при вставке строк, но и когда курсор находится в верхней строки и нажимается клавиша <Вверх>. Тогда все строки должны мгновенно отъехать вниз. Ясно, что не имея искейп-кода для вставки строки нет возможности стандартно сделать ролик вниз. Это означает, что хороший редактор нельзя написать в виде корректной программы, т.е написать текстов редактор, который прекрасно работал бы одновременно на ОРИОНЕ, РК86 и Львове.

Т.к, чтобы сделать ролик вниз программе придётся лезть в экранную область и самостоятельно сдвигать экранный буфер на строку, а экран, естественно, у разных машин устроен по разному. И только наличие в машине драйвера VT52 позволит на любой машине использовать универсальный текстов редактор, который рассчитан на данный процессор и на данный терминал.

В редакторах для текстовых машин из ситуации отсутствия ролика вниз выходят способом полной очистки экрана и выводом заново всего экрана. Для текстовой машины это тоже неприятно, но на графической это вообще катастрофа. Т.к на графической машине вывод одного символа отнимает в 50...150 раз больше времени, чем на текстовой. Особенно тормознуто получается при небайтовом шрифте и в цвете.

Если в редакторе ролик вверх быстрый, а ролик вниз медленный и с полной перерисовкой экрана это значит писал неграмотный автор. Ролик и вверх и вниз должен происходить с одинаковой скоростью и без очистки всего экрана и перерисовки заново. Нетрудно понять, что текстов редактор МИКРОН первой версии для РК86 неграмотный. Впрочем, он ещё более неудачен тем, что вообще не экранный, а нечто среднее. Такую концепцию авторы выбрали возможно ошибочно опасаясь, что скоростей РК не хватит на полноценный экранный режим.

Ролик экрана 12 кб стеком даже при клоке 2 МГЦ получается вполне приемлемым (проблема лишь в том, что не все авторы умели это делать). О проблемах со скоростью вывода и ролика почти все знают. Но есть более труднопреодолимая причина тормознутости текстовых редакторов на 8-ми разрядках. Это проблема сдвижки текста.

Есть два подхода хранения текста в ОЗУ. Первый - распакованный, применённый в родном текстовом редакторе ИРИШИ. Для медленных машин это позволяет выиграть скорость.

Суть в том, что весь текст, например с шириной в 80 символов в строке хранится в ОЗУ в распакованном виде и в таком виде и редактируется. Тогда любая строка, даже если в ней нет вообще ни одного символа занимает в ОЗУ ровно 80 байтов. Ясно, что ОЗУ тратится очень неэффективно. Из-за этого текстов редактор ИРИШИ и имеет ограничение всего в 300 строк (а даже РК может редактировать текст, где число строк в 10 раз больше), но зато никаких сдвигов и скорость работы не страдает.

Из этого ясно, что текстов редактор ИРИШИ не имеет практической ценности (вряд-ли существуют приличные ассемблерные программы умещающиеся в 300 строк) и даже в 80-тые был пригоден только для написания писем бабушке. Кстати, если при выводе на МГ редактор не нормализует текст, сокращая его табуляциями и отбрасывая пустоты в конце строк, то это совсем кошмар (глупо писать на МГ-ленту 40 кб, если можно писать всего 5 кб).

А теперь сообразим почему разработчики выбрали такой метод редактирования текста. Да, точно. Им тоже не хватило скорости процессора, т.к ИРИША очень тормозная в режимах 2 и 3.

Чтобы понять почему нужна скорость, рассмотрим, как хранит текст грамотный текстов редактор. Строки разделены разделителем. Это может быть CR или LF или CR+LF (в CP/M используют CR+LF). Пустые пробельные хвосты строк не пишутся и текст уплотняется табуляциями.

Алгоритм редактирования в грамотном текстовом редакторе построчный. Та строка на которой стоит курсор распаковывается в строчный буфер. Т.е все табуляции расширяются пробелами и конец строки после последней отображаемой буквы тоже заполняется пробелами. Таким образом при ширине строки в 64 символа размер строчного буфера д.быть не менее 64 байт (обычно делают немного больше, чтобы при случайной сдвижке за край экрана буквы не терялись). Когда курсор сдвигают с одной строки на другую без редактирования, то каждый раз в строчный буфер перезагружается новая текущая строка.

Если же ввести какие либо символы в строку, то в зависимости от режима (вставка/замена) новые символы будут вставляться с автораздвижкой или взамен старого текста. Допустим исходная строка содержала одно слово в 8 букв. После окончания редактирования строки и нажатия <ВК> выполняется нормализация строки, т.е в полной строке длиной 64 символа, там где можно вставляется табуляция, а пробельные хвосты строк отбрасываются. Допустим после редактирования и нормализации длина строки увеличилась до 30 символов. Но в исходном месте для этой строки было всего 9 байтов (8 символов и разделитель 0DH). Как же туда вставить 31 байт отредактированной строки?

Для этого надо выполнить раздвижку последующего текста на 31-9= 22 байта. Значит, если весь текст занимает в ОЗУ 40 кб, и редактируемая строка в начале текста, нам надо сдвинуть на 22 байта огромный массив в 40 кб. На скоростях ИРИШИ в режимах 2/3 это занимает ~3-4 секунды. Это значит, что после каждого изменения надо ждать 3 секунды. А если это последняя строка экрана, то одновременно делается ролик, т.е сдвижка экрана 16 кб и сдвижка текста в 40 кб, что ещё тормознее. Понятно, что такой редактор будет удобен только для маленьких текстов, т.к чем больше текст, тем медленнее редактирование.

С другой стороны пока идёт редактирование строки, процессор 95 % времени простаивает ожидая нажатий. Если модифицированная строка занимает меньше места, чем исходная, то можно её вставить заполнив пустоту в конце строки нулями. Если же новая строка больше старой, то на старое место она уже не влезет. Чтобы не делать раздвижку можно на месте старой строки оставить указатель на новое место хранения этой строки, а саму строку вставить в ОЗУ за концом текста в самой вершине ОЗУ (чуть ниже стека).

Понятно, что текст при этом сделается рваным, строки будут следовать не подряд. Но зато скорость редактирования вообще не пострадала. Никаких долгих сдвигов огромных массивов. Чтобы быстро находить такие перенесённые строки составляется таблица адресов таких перенесённых строк.

Пока процессор ждёт нажатия, у него есть время для сдвижек текста, как бы в фоновом режиме. Тогда процессор берёт в таблице самую верхнюю перенесённую строку, что сдвинута за конец текста и вставляет её на то место, где она должна быть, выполняя при этом раздвижку текста. При этом процессор не только выполняет сдвижку незаметно для пользователя, но и непрерывно проверяет статус клавиатуры. Как только есть нажатие, сдвижка текста мгновенно прекращается и редактор обслуживает нажатие клавиш.

Сдвижка (нормализация) текста в фоновом режиме незаметна для пользователя и не тормозит даже на тормозной машине. Но такой редактор значительно сложнее в разработке и отладке и имеет объём кода вдвое больше, чем редактор с традиционным тупым алгоритмом. Вот почему программисты не любят тормозные машины, на них низкую производительность приходится компенсировать существенным усложнением программ. Потому в 100 раз разумнее сделать аппаратное ускорение, чем мучиться пытаясь решить программно проблему нехватки скорости.

Есть и другие алгоритмы позволяющие ускорить работу текстового редактора (например, пустые карманы через каждые 50 строк, тогда сдвигать приходится в худшем случае лишь 50 строк, а не весь текст), но все они существенно усложняют текстовый редактор, который исходно прост, т.к фактически состоит лишь из подпрограммы редактирования строки, процедуры её вставки в текст (с соответствующей раздвижкой или сдвижкой) и процедуры перемещения курсора на одну строку и страницами.

_________________
***
barsik
barsik
Мастер+

Сообщения : 458
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программное обеспечение (ПО) общая тема. Empty Re: Программное обеспечение (ПО) общая тема.

Сообщение  Спонсируемый контент

10

Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения