Последние темы
» Вити больше нет!автор bug19 Пн Фев 20 2023, 19:54
» Собираем оригинальный Орион 128
автор bug19 Пн Фев 20 2023, 19:47
» Проблема плющеного экрана ОРИОНА
автор kanzler Пн Ноя 28 2022, 12:05
» Орион 128 и его клоны возрождение 2019-2022 год
автор kanzler Пн Ноя 28 2022, 12:03
» Электроника КР-04. Информация, документы, фото.
автор kanzler Пн Ноя 28 2022, 12:02
» Новости форума
автор kanzler Пн Ноя 28 2022, 11:52
» Орион-128 НГМД запуск 2021 года
автор matrixplus Сб Сен 10 2022, 17:36
» ПЗУ F800 для РК86
автор ведущий_специалист Сб Сен 10 2022, 10:37
» Микропроцессорная лаборатория "Микролаб К580ИК80", УМК-80, УМПК-80 и др.
автор Электротехник Вт Июл 26 2022, 19:33
» Орион-128 SD карта в Орионе
автор matrixplus Чт Июн 02 2022, 09:00
» 7 Мая. День Радио!
автор Viktor2312 Чт Май 12 2022, 10:58
» Серия: Массовая радио библиотека. МРБ
автор Viktor2312 Ср Май 11 2022, 12:17
» Полезные книги
автор Viktor2312 Пн Май 09 2022, 15:07
» Орион 128 Стандарты портов и системной шины Х2
автор matrixplus Вс Май 08 2022, 23:08
» Орион-128 и Орион ПРО еще раз про блоки питания
автор matrixplus Вс Май 08 2022, 19:09
» Орион-128 Программаторы
автор matrixplus Вс Май 08 2022, 19:02
» Орион ПРО история сборки 2021 до 2022
автор matrixplus Вс Май 08 2022, 18:47
» Анонсы монет (New coin).
автор Viktor2312 Сб Май 07 2022, 23:11
» Хочу свой усилок для квартиры собрать не спеша
автор Viktor2312 Сб Май 07 2022, 19:33
» Амфитон 25у-002С
автор Viktor2312 Сб Май 07 2022, 09:38
» Майнер: T-Rex
автор Viktor2312 Вс Май 01 2022, 09:12
» GoWin. Изучение документации. SUG100-2.6E_Gowin Software User Guide. Среда разработки EDA.
автор Viktor2312 Пн Апр 25 2022, 01:01
» GoWin. Изучение документации. UG286-1.9.1E Gowin Clock User Guide.
автор Viktor2312 Сб Апр 23 2022, 18:22
» GoWin. Documentation Database. Device. GW2A.
автор Viktor2312 Ср Апр 20 2022, 14:08
» GOWIN AEC IP
автор Viktor2312 Ср Апр 20 2022, 12:08
Самые активные пользователи за месяц
Нет пользователей |
Поиск
ПО. ПЭВМ "Ириша". Общая тема.
RUЭВМ :: Отечественные ЭВМ, ПЭВМ и МВК :: ПЭВМ и МВК "Ириша", "Ириша-Л" , "Ириша-М" :: Программное обеспечение ПЭВМ "Ириша"
Страница 1 из 1 • Поделиться
ПО. ПЭВМ "Ириша". Общая тема.
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 шт.
---
Из того, что по идее возможно найти, или оно уже есть:
---
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 (Сб Окт 05 2019, 14:23), всего редактировалось 2 раз(а)
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: ПО. ПЭВМ "Ириша". Общая тема.
2
Вчера/сегодня посидел помучил программу подсчёта контрольной суммы, что представлена в красной книжечке. Общий смысл того, что она делает уловил, использованные команды просмотрел, алгоритм для себя вычертил, для лучшего понимания, что она делает, в коды перевёл.
Но пока детально не разобрался, нужно ещё мучать теорию, как вообще подсчитывается контрольная сумма.
Но время провёл интересно, перед сном.
Вот её код:
11 00 40 01 80 03 21 00 00 1A 85 6F 13 1A 8C 67
13 0B 78 B1 C2 09 01 CF
Буду потихоньку дальше мучать ПО от Иришки, довольно увлекательно...
Но пока детально не разобрался, нужно ещё мучать теорию, как вообще подсчитывается контрольная сумма.
Но время провёл интересно, перед сном.
Вот её код:
- Код:
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
Буду потихоньку дальше мучать ПО от Иришки, довольно увлекательно...
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Re: ПО. ПЭВМ "Ириша". Общая тема.
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- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
.
5
Вы неграмотно выкладываете исходники. На этом движке ни тэг {code}, ни тэг предформатирования {pre}, не работают. Тэг {code} лишь придаёт шрифту зеленый цвет и делает рамку и всё... Движок и внутри тэга {code} по-прежнему заменяет табуляции и более двух подряд стоящих пробелов на один пробел и даже не заменяет шрифт на моноширинный.Viktor2312 пишет:Кину тут, пригодится...
Я ещё несколько месяцев назад открыл способ, как на этом движке показывать преформатированные тексты. Для этого достаточно иметь лишь приличный текстовый редактор (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- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия
.
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. Не оригиналы, что в формате редактора МИКРОН, а переделанные уже под нормальный компилятор ассемблера. Возможно даже в более приличной мнемонике, а то древнюю мнемонику большинство программистов уже давно не понимает.
ИРИША прямо сейчас не отличается изобилием программ, т.к оригинальные программы утеряны, а новые еще в процессе (я знаю лишь иришин текстов редактор, 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- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия
ассемблер МИКРОН для ИРИШИ
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- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия
.
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- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия
трудности текстовых редакторов медленных машин
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 строк, а не весь текст), но все они существенно усложняют текстовый редактор, который исходно прост, т.к фактически состоит лишь из подпрограммы редактирования строки, процедуры её вставки в текст (с соответствующей раздвижкой или сдвижкой) и процедуры перемещения курсора на одну строку и страницами.
В то же время в текстовом редакторе процессор 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- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия
.
10
Несколько недель назад в первом приближении CP/M для ИРИШИ сделал.
Сделал как Low TPA (это для базовой ИРИШИ без доп.ОЗУ), так и High TPA (это уже, если есть доп.ОЗУ, как минимум 128 кб, т.е дополнительные 64 кб вдобавок к имеющимся на граф.адаптере). Пишу в первом приближении, т.к пока сделал только минимум нужный для использования стандартной CP/M. Постепенно буду улучшать. Но уже можно редактировать тексты не только латинскими, но и русскими буквами (и клавиши перемещения курсора работают) и прогонять любые CP/M-программы. Например, можно уже писать программы на Паскале и проверять их в эмуляторе.
В самОм имеющемся эмуляторе писать программы неудобно, из-за того, что в эмуляторе без поддержки DOS пользоваться CP/M-текстовыми редакторами неудобно. Например, чтобы воспользоваться SuperText-ом надо сначала полчаса вручную загружать 165 кб его кода, т.к SuperText такой большой по объёму. Думаю, что позже кто-то сделает эмулятор ИРИШИ, где таких проблем не будет.
Архитектура ИРИШИ не идеал, но привыкнув к ней, особых проблем нет. Просто надо всегда помнить, что сегменты 0 и 8000 не переключаются при смене карты. Всяко архитектура ИРИШИ лучше архитектуры ОРИОНА или ЭРИКА.
Но пока занимался программированием для ИРИШИ очень мало, в последние 3 недели вообще и двух часов не наберётся. Лишь начал делать Нортон. Потому, что всегда сделав DOS, затем делается Нортон.
Но тут выяснилось, что 80 символов в строке, как я всегда и полагал, ни для чего невыгодны и особенно невыгодны для Нортона CP/M. Собственно, почти весь процесс написания Нортона ИРИШИ для меня сводится к написанию рамы и глюкала (это обслуживание движения балки выбора по панелям). Для двух-колоночных панелей глюкало уже есть готовое. Код команд работающих с дисками тоже писать не надо, он тоже есть готовый от Нортонов для других CP/M-систем.
Ранее мне доводилось делать Нортоны только для экрана на 48 символов в строке. И для DOS без даты этого вполне хватало. Вот стандартная горизонтальная раскладка рамы, что я применял в Нортонах ОРИОНА:
00 10 20 30 40
012345678901234567890123456789012345678901234567
| 88888888.333 | 55555 || 88888888.333 | 55555 |
Как видите 48 символов в строке (что есть в ОРИОНЕ и Специалисте) идеально подходят для 2-х панелей файлов с именами типового вида (т.е когда в имени 8 символов до точки и 3 символа расширение), а размеры файлов не превышают 99999 байт. Когда приходилось делать Нортон для экрана в 64 символа, то справа от панели делал вывод статистики.
А для 80-ти символов в строке для CP/M просто не придумать доп.столбцов, чтобы вставить в раму. Делая NC для MSDOS, Питер Нортон выкрутился вставив даты файлов. Это позволило растянуть раму на все 80 символов. Но увы, с этим у нас облом, - в стандартной CP/M нет дат у файлов.
Дату ввести несложно, причём никак не мешая программам. Я это уже делал, это совсем немного кода. А вот Digital Research перемудрили, - они вставляли отметки даты в стандартный каталог CP/M. Так тоже можно, но это увеличивает объём каталога вдвое и значит вдвое тормозит работу с каталогом. Я поступил проще, ввёл параллельный каталог, причем на той же дорожке, но на другой стороне дискеты (отчего чтение даты никак не тормозит, т.к головка уже стоит на нужной дорожке).
Например, чтобы узнать дату выполняется стандартная функция поиска в каталоге. При возврате в переменных TRACK/SECTOR стоит позиция и в регистре A возвращается код оффсета каталогового экстента в буфере чтения. После чего чтобы получить дату файла достаточно вместо трека 4 в переменную трек подставить 5 и выполнить чтение сектора, после чего в буфере с полученным ранее оффсетом мы имеем дату без всяких дополнительных хлопот.
При введении дат в CP/M моим способом общий объём доп.кода не превышал 200 байт, введение дат было написано и отлажено за один день. Называлась CP/M-Plus (т.к имела и другие преимущества перед CP/M), но работала только на ОРИОНЕ с Z80CARD-II. Так, что я могу без особых усилий ввести в CP/M для ИРИШИ даты файлов. Хотя это и бесполезно без наличия часов 512ВИ1.
Т.е сейчас я рассматриваю два варианта. Это писать драйвер более широкого шрифта для ИРИШИ. Речь о шрифте 12*8, что даёт 640:12= 53 символа в строке или о шрифте 10*8, что даёт 640:10= 64 символа в строке. 64 символа в строке мне слишком много, склоняюсь к 53, это кстати, мой любимый формат экрана для написания программ (потому у меня в текстовом адаптере было 53 символа в строке). Небайтовый шрифт конечно будет предельно тормозным, но для компенсации этого достаточно применить процессор Z80 тактируемый клоком в 8 МГЦ.
53 символа в строке это вполне нормально для двухпанельного Нортона с двумя колонками в каждой панели. Причём даже нормально и для РК-ДОС, т.к там формат имени файлов более длинный - 10 символов имя и 3 символа расширение.
Ещё одним доводом за вариант шрифта с широким знакоместом является необходимость каким-то образом делать маркировку отмеченных в панелях файлов в монохроме. Инверсия знакомест уже занята на балку подсветки в панелях. При большой матрице можно попробовать сделать маркировку редкой мозаикой точек, т.е снег из точек в фоне символа. Если будет плохо, то придётся ограничиться галочкой показывающей маркированность, как было сделано в моих Нортонах для РК86 или менять шрифт у маркированных файлов на жирный или же использовать подчёркивание.
А второй вариант это, естественно, доработать CP/M до дат файлов и сделать раму один к одному как в NC для IBM PC. Трудозатрат на это даже меньше, чем написать полноценный экранный драйвер.
- - - Добавлено - - -
В минимальную систему программного обеспечания новой машины как минимум должны входить DOS, Нортон для этой DOS, текстов редактор и ассемблер.
Например, хотя DOS для РК86 не было, но редактор и ассемблер были сделаны для РК86, (естественно, на уровне возможностей любителей тех лет). А для Специалиста и ОРИОНА эти редактор и ассемблер были заимствованы у РК. Потому после DOS и Нортона нужны ещё, как минимум, текстов редактор и макроассемблер. При наличии винта или флопа в CP/M есть достаточный выбор. Т.е для дисководной системы с этим нет проблем.
WordStar и подобные импортные развитые текстовые редакторы (называемые текстовыми процессорами) - все в основном семибитовые, а WordMaster хоть и маленький, простой и 8-ми битовый, но его команды мне не удобны. Так что возможно, как изучу PL/M и напишу на нём Нортон , перетранслирую для ИРИШИ свой примитивный редактор.
Он примитивный, аналог турбо-паскалевского редактора, написан ещё в кодах КР580 для карты 2 и магнитофонный, не для дисковода (переделать под CP/M несложно, надо заменить МГ-процедуры на дискетные LOAD/SAVE). Хотя в примитивном редакторе размер редактируемого файла ограничен размером TPA за вычетом размера кода самого редактора, но т.к сам редактор имеет объём всего 5 кб, то при TPA в 58 кб можно редактировать текст размером более 50 кб, чего с избытком достаточно.
Маленький размер позволяет сделать резидентный инструментарий для бездисководных систем (тех, где нет ни винта ни флопа, а только эл.диск из ОЗУ). Тогда в ПЗУ храним CP/M (чтобы грузилась по сбросу) и примитивные дисковые текстов редактор и макроассемблер (отдельными программами).
Примитивный текстов редактор означает, что он редактирует только текст в ОЗУ. А примитивный ассемблер означает, что он транслирует только исходник, что уместился в ОЗУ, причём не линкует, а сразу даёт объектный код.
Заметим, что все отечественные самодельные текстовые редакторы для КР580 (кроме SED-а) и все ассемблеры (кроме ассемблера А.Вакуленко с линковкой) - примитивные. Потому любителям программирования и было так трудно писать программы с размером более, чем в 2 кб. Потому программы отечественных бытовых машин заметно слабее, чем иностранных. Т.к иностранные любители программирования имели DOS и у них были редакторы, могущие редактировать текст любого объёма и ассемблеры могущие транслировать исходник любого размера.
Это потому, что в написанных профессионалами CP/M редакторах и ассемблерах используется дисковый свопинг. Текстов редактор или ассемблер располагает в ОЗУ не весь текст (размер которого больше, чем TPA), а только кусок, окно, с которым именно в данный момент производится работа. А весь остальной текст скидывается в swap-файл (иногда называемый spill-файл или дисковым буфером) и куски из него подгружаются в ОЗУ по мере перемещения курсора по тексту. Именно потому текстов редактор WordMaster имеет размер в 12 кб, а текстов редактор МИКРОН имеет размер всего в 2 кб.
Только полные новички в программировании пишут программы на ассемблере, Си или Паскале в виде одного файла, т.к эти ЯВУ поддерживают модульность, а все дисковые ассемблеры тоже имеют оператор INCLUDE. Потому и достаточно самодельного текстового редактора, что может редактировать файл размером хотя бы в 40 кб.
Сделал как Low TPA (это для базовой ИРИШИ без доп.ОЗУ), так и High TPA (это уже, если есть доп.ОЗУ, как минимум 128 кб, т.е дополнительные 64 кб вдобавок к имеющимся на граф.адаптере). Пишу в первом приближении, т.к пока сделал только минимум нужный для использования стандартной CP/M. Постепенно буду улучшать. Но уже можно редактировать тексты не только латинскими, но и русскими буквами (и клавиши перемещения курсора работают) и прогонять любые CP/M-программы. Например, можно уже писать программы на Паскале и проверять их в эмуляторе.
В самОм имеющемся эмуляторе писать программы неудобно, из-за того, что в эмуляторе без поддержки DOS пользоваться CP/M-текстовыми редакторами неудобно. Например, чтобы воспользоваться SuperText-ом надо сначала полчаса вручную загружать 165 кб его кода, т.к SuperText такой большой по объёму. Думаю, что позже кто-то сделает эмулятор ИРИШИ, где таких проблем не будет.
Архитектура ИРИШИ не идеал, но привыкнув к ней, особых проблем нет. Просто надо всегда помнить, что сегменты 0 и 8000 не переключаются при смене карты. Всяко архитектура ИРИШИ лучше архитектуры ОРИОНА или ЭРИКА.
Но пока занимался программированием для ИРИШИ очень мало, в последние 3 недели вообще и двух часов не наберётся. Лишь начал делать Нортон. Потому, что всегда сделав DOS, затем делается Нортон.
Но тут выяснилось, что 80 символов в строке, как я всегда и полагал, ни для чего невыгодны и особенно невыгодны для Нортона CP/M. Собственно, почти весь процесс написания Нортона ИРИШИ для меня сводится к написанию рамы и глюкала (это обслуживание движения балки выбора по панелям). Для двух-колоночных панелей глюкало уже есть готовое. Код команд работающих с дисками тоже писать не надо, он тоже есть готовый от Нортонов для других CP/M-систем.
Ранее мне доводилось делать Нортоны только для экрана на 48 символов в строке. И для DOS без даты этого вполне хватало. Вот стандартная горизонтальная раскладка рамы, что я применял в Нортонах ОРИОНА:
00 10 20 30 40
012345678901234567890123456789012345678901234567
| 88888888.333 | 55555 || 88888888.333 | 55555 |
Как видите 48 символов в строке (что есть в ОРИОНЕ и Специалисте) идеально подходят для 2-х панелей файлов с именами типового вида (т.е когда в имени 8 символов до точки и 3 символа расширение), а размеры файлов не превышают 99999 байт. Когда приходилось делать Нортон для экрана в 64 символа, то справа от панели делал вывод статистики.
А для 80-ти символов в строке для CP/M просто не придумать доп.столбцов, чтобы вставить в раму. Делая NC для MSDOS, Питер Нортон выкрутился вставив даты файлов. Это позволило растянуть раму на все 80 символов. Но увы, с этим у нас облом, - в стандартной CP/M нет дат у файлов.
Дату ввести несложно, причём никак не мешая программам. Я это уже делал, это совсем немного кода. А вот Digital Research перемудрили, - они вставляли отметки даты в стандартный каталог CP/M. Так тоже можно, но это увеличивает объём каталога вдвое и значит вдвое тормозит работу с каталогом. Я поступил проще, ввёл параллельный каталог, причем на той же дорожке, но на другой стороне дискеты (отчего чтение даты никак не тормозит, т.к головка уже стоит на нужной дорожке).
Например, чтобы узнать дату выполняется стандартная функция поиска в каталоге. При возврате в переменных TRACK/SECTOR стоит позиция и в регистре A возвращается код оффсета каталогового экстента в буфере чтения. После чего чтобы получить дату файла достаточно вместо трека 4 в переменную трек подставить 5 и выполнить чтение сектора, после чего в буфере с полученным ранее оффсетом мы имеем дату без всяких дополнительных хлопот.
При введении дат в CP/M моим способом общий объём доп.кода не превышал 200 байт, введение дат было написано и отлажено за один день. Называлась CP/M-Plus (т.к имела и другие преимущества перед CP/M), но работала только на ОРИОНЕ с Z80CARD-II. Так, что я могу без особых усилий ввести в CP/M для ИРИШИ даты файлов. Хотя это и бесполезно без наличия часов 512ВИ1.
Т.е сейчас я рассматриваю два варианта. Это писать драйвер более широкого шрифта для ИРИШИ. Речь о шрифте 12*8, что даёт 640:12= 53 символа в строке или о шрифте 10*8, что даёт 640:10= 64 символа в строке. 64 символа в строке мне слишком много, склоняюсь к 53, это кстати, мой любимый формат экрана для написания программ (потому у меня в текстовом адаптере было 53 символа в строке). Небайтовый шрифт конечно будет предельно тормозным, но для компенсации этого достаточно применить процессор Z80 тактируемый клоком в 8 МГЦ.
53 символа в строке это вполне нормально для двухпанельного Нортона с двумя колонками в каждой панели. Причём даже нормально и для РК-ДОС, т.к там формат имени файлов более длинный - 10 символов имя и 3 символа расширение.
Ещё одним доводом за вариант шрифта с широким знакоместом является необходимость каким-то образом делать маркировку отмеченных в панелях файлов в монохроме. Инверсия знакомест уже занята на балку подсветки в панелях. При большой матрице можно попробовать сделать маркировку редкой мозаикой точек, т.е снег из точек в фоне символа. Если будет плохо, то придётся ограничиться галочкой показывающей маркированность, как было сделано в моих Нортонах для РК86 или менять шрифт у маркированных файлов на жирный или же использовать подчёркивание.
А второй вариант это, естественно, доработать CP/M до дат файлов и сделать раму один к одному как в NC для IBM PC. Трудозатрат на это даже меньше, чем написать полноценный экранный драйвер.
- - - Добавлено - - -
В минимальную систему программного обеспечания новой машины как минимум должны входить DOS, Нортон для этой DOS, текстов редактор и ассемблер.
Например, хотя DOS для РК86 не было, но редактор и ассемблер были сделаны для РК86, (естественно, на уровне возможностей любителей тех лет). А для Специалиста и ОРИОНА эти редактор и ассемблер были заимствованы у РК. Потому после DOS и Нортона нужны ещё, как минимум, текстов редактор и макроассемблер. При наличии винта или флопа в CP/M есть достаточный выбор. Т.е для дисководной системы с этим нет проблем.
WordStar и подобные импортные развитые текстовые редакторы (называемые текстовыми процессорами) - все в основном семибитовые, а WordMaster хоть и маленький, простой и 8-ми битовый, но его команды мне не удобны. Так что возможно, как изучу PL/M и напишу на нём Нортон , перетранслирую для ИРИШИ свой примитивный редактор.
Он примитивный, аналог турбо-паскалевского редактора, написан ещё в кодах КР580 для карты 2 и магнитофонный, не для дисковода (переделать под CP/M несложно, надо заменить МГ-процедуры на дискетные LOAD/SAVE). Хотя в примитивном редакторе размер редактируемого файла ограничен размером TPA за вычетом размера кода самого редактора, но т.к сам редактор имеет объём всего 5 кб, то при TPA в 58 кб можно редактировать текст размером более 50 кб, чего с избытком достаточно.
Маленький размер позволяет сделать резидентный инструментарий для бездисководных систем (тех, где нет ни винта ни флопа, а только эл.диск из ОЗУ). Тогда в ПЗУ храним CP/M (чтобы грузилась по сбросу) и примитивные дисковые текстов редактор и макроассемблер (отдельными программами).
Примитивный текстов редактор означает, что он редактирует только текст в ОЗУ. А примитивный ассемблер означает, что он транслирует только исходник, что уместился в ОЗУ, причём не линкует, а сразу даёт объектный код.
Заметим, что все отечественные самодельные текстовые редакторы для КР580 (кроме SED-а) и все ассемблеры (кроме ассемблера А.Вакуленко с линковкой) - примитивные. Потому любителям программирования и было так трудно писать программы с размером более, чем в 2 кб. Потому программы отечественных бытовых машин заметно слабее, чем иностранных. Т.к иностранные любители программирования имели DOS и у них были редакторы, могущие редактировать текст любого объёма и ассемблеры могущие транслировать исходник любого размера.
Это потому, что в написанных профессионалами CP/M редакторах и ассемблерах используется дисковый свопинг. Текстов редактор или ассемблер располагает в ОЗУ не весь текст (размер которого больше, чем TPA), а только кусок, окно, с которым именно в данный момент производится работа. А весь остальной текст скидывается в swap-файл (иногда называемый spill-файл или дисковым буфером) и куски из него подгружаются в ОЗУ по мере перемещения курсора по тексту. Именно потому текстов редактор WordMaster имеет размер в 12 кб, а текстов редактор МИКРОН имеет размер всего в 2 кб.
Только полные новички в программировании пишут программы на ассемблере, Си или Паскале в виде одного файла, т.к эти ЯВУ поддерживают модульность, а все дисковые ассемблеры тоже имеют оператор INCLUDE. Потому и достаточно самодельного текстового редактора, что может редактировать файл размером хотя бы в 40 кб.
barsik- Ветеран
- Сообщения : 1032
Дата регистрации : 2016-11-10
Откуда : Россия
Похожие темы
» Общая тема. ПЭВМ "Океан-240" и другие его модификации
» Общая тема!!!
» Общая тема.
» Общая тема.
» СМ-1800. Общая тема.
» Общая тема!!!
» Общая тема.
» Общая тема.
» СМ-1800. Общая тема.
RUЭВМ :: Отечественные ЭВМ, ПЭВМ и МВК :: ПЭВМ и МВК "Ириша", "Ириша-Л" , "Ириша-М" :: Программное обеспечение ПЭВМ "Ириша"
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|