nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 10:32



Reply to topic  [ 28 posts ]  Go to page Previous  1, 2
ПК-01 Львов 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Сегодня получил из Словакии ещё один подарочек :)



Фотка кликабельна. Поздравления принимаются прямо тут :roll:

_________________
:dj: https://mastodon.social/@Shaos


18 Jun 2016 19:10
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Что-то ты распокупался... это не к добру... или - к пенсии? :mrgreen:

_________________
iLavr


18 Jun 2016 19:24
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Lavr wrote:
Что-то ты распокупался... это не к добру... или - к пенсии? :mrgreen:

Угу - готовлюсь к весёлому времяпровождению после выхода на пенсию :)

Для аутентичности вот сделал себе фейковую лейбочку:

Image

Нашёл в инете крупную фотку, распечатал на лазернике, заклеил скотчем и приклеил :roll:

P.S. Источник фоток: http://ru.pc-history.com/pk-01-lvov.html

_________________
:dj: https://mastodon.social/@Shaos


18 Jun 2016 20:00
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Вроде правдоподобно получилось (кликабельно):



В реальности там была металлическая плашка с чёрной печатью...

_________________
:dj: https://mastodon.social/@Shaos


18 Jun 2016 20:06
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
В Вике написано, что ПК-01 Львов выпустили аж 80 тысяч, но к сожалению большинство из них остались на Украине, в Росию попало мало. Это графический компьютер не использующий идеи Специалиста (потому и тормозной).

Без дисковода, или хотя-бы эмулятора дисковода компьютером пользоваться неудобно. По счастью для Львова, есть даже целых две дисководные ДОС. Надо только спаять контроллер, прошить ПЗУ РФ2 и поставить его в свободную панельку на плате.

Во вложении исходник ДОС А.Мамонтова для Львова и описание. Но от разных версий, т.к версии 5.5 для которой описание, не нашёл. Из-за чего есть небольшие отличия по некоторым входным точкам. Это для контроллера с одинарной плотностью записи (т.е годятся дискеты SD). На дискете в этом формате 82 физ.трека, в каждом 9 секторов по 256 байт, что даёт 82*2*9*256= 369 кб на диск.

ДОС очень примитивная (и в этом её ценность, т.к всего 2 кб), нефрагментирующая файлы и даже не позволяющая вторично использовать объём от ранее удалённых файлов. Вероятно что-то похожее на ОС РАФОС, там для схлопывания файлов на диске на место удалённых используется (опасная при плохих дисках) команда SQEEZE, которая сравнительно долго "пилит" диск перемещая по нему файлы. В данной DOS, если файлы удалялись, отчего впустую теряется много места, приходится пофайлово скопировать весь диск на другой. Но можно и для этой DOS написать программу SQEEZE.

К сожалению, в коде есть небольшое количество вызовов ROM-BIOS Львова, так что для адаптации этой ДОС для другой ЭВМ, надо искать коды или исходники ROM-BIOS Львова. Но проще написать свою аналогичную по идеологии ДОС с размером в 2 кб. Знаю, т.к уже когда-то по образцу это делал, т.е написал полностью аналогичную ДОС.

Я потому и отношусь хорошо к этой DOS, что именно она дала мне толчок к написанию собственных DOS. После этого я написал ещё 3 или 4 разных CPM-несовместимых DOS и обнаружил, что трудность не том, чтобы закодировать, а в том, чтобы придумать идеологию DOS, рассматривая в качестве исходного уровень ОС CP/M, т.е ставя целью улучшить какой-то параметр CP/M (например, отсутствие подкаталогов, непродуктивный расход каталогового места и др).


 описание DOS
Code:
CHAMELEON DOS version 5.5

Краткая информация о ДОС:

1. Отдает пользователю всё ОЗУ, кроме 295 байт системного ОЗУ
2. Сама ДОС располагается в ПЗУ по адресам С000-С7FFH
3. Ha диске находится только каталог и программы пользователя
4. В каталог умещается до 134 файлов (в каждом из 9 секторов каталога 15 записей)
5. 165 дорожка диска зарезервирована для копии каталога (но самой DOS не исп-ся)

Итак, после того, как вы установили в панельку ПЗУ с ДОС и включили компьютер,
на экране должна появиться заставка 'ПК-01 ЛЬВIВ' на черном фоне, потом экран
очистится и в верхнем левом углу появится надпись:

CHAMELEON DOS 5.5
(C)MASKSOFT&144КБ

После этого ДОС попытается найти на диске файл с именем COMMAND.COM и если на
диске есть такой файл, она считает и запустит его. Под именем COMМАND.COM может
быть любой фaйл программы, который нужно запустить после сброса, например:
Монитор, Norton Commander, CP/M-Boot, редакторы и другие.

Но если файл COMMAND.COM не найден, то появится приглашение к вводу команд вида:

А:>

Ниже приведены внутренние команды DOS и формат их ввода:

1. DIR - вызывается клавишей <F0>, выводит каталог диска на экран

2. LOAD - вызывается клавишей <F1>, запускает чтение файла в формате BLOAD"",R

3. SAVE FFFF.RRR NNNN,KKKK - вызывается клавишей <F2>, записывает файл на диск.
   Формат команды: FFFF-имя файла 8 символов, RRR-расширение из 3-х символов,
   NNNN-начальный адрес программы, КККК-конечный адрес

4. REN WWWWW.RRR=FFFFF.RRR - вызывается клавишей <F3>, позволяет переименовать
   файл, где WWWWW - новое имя файла

5. ERA FFFFF.RRR - вызывается клавишей <F4>, удаление файла с диска

6. TYPE FFFFF.RRR - вызывается клавишей <F5>, распечатка файла

7. CP/M36 - вызывается клавишей <П/Д>, читает СP/M36 с диска и запускает

8. X: - переход на другой диск, где X - логическое имя диска (А,B,C или D).

Выход из команд REN, ERA, SAVE, TYPE возможен посредством нажатия клавиши <F5>.

Чтение с диска файлов происходит набором имени файла без расширения, пробелы
можно опустить. Запускаемый файл должен иметь расширение 'COM', иначе ДОС выдаст
сообщение об ошибке "*NO FILE*".

При наборе имени файла для команд REN, ERA, SAVE, TYPE необходимо вводить все 8
символов (клавиша <Забой> не действует). Такая жёсткость обусловлена малым
объёмом ПЗУ, на все про всё дано 2 килобайта.

Ниже приведены подпрограммы DOS и формат обращения к ним:

C79D Установка головки дисковода на требуемую дорожку.
Перед обращеним заносим в ячейки памяти:
 BFB0 - номер дорожки (0-165),
 BFB4 - номер дисковода (0-А, 1-В, 2-С, 3-D).

C7A0 Чтение сектора с диска.
Перед обращением сначала должна быть выполнена п/п C79D, а также заносим в ячейку:
 BFB1 - номер сектора (1-9).

C7A3 Запись сектора. Остальное как и у п/п C7A0.

C7A6 Чтение определённого количества секторов в память.
Перед обращением:
 BFB0 - номер дорожки,
 ВFB1 - номер сектора,
 BFB4* - номер дисковода,
 BFB6 - число читаемых секторов (1-255),
 HL - начальный адрес куда читать.

C7A9 Запись определеного количества секторов на диск из памяти. Ее параметры
такие же как и п/п C7A6, только в HL заносим нач. адрес области памяти для записи.

C7AC найти файл и прочитать атрибуты файла с диска.
Перед обращением:
 DE - адрес, где находится имя файла с расширением (11 симв),
 BFB4* - см.выше.
Выходные данные:
 А = 00 - конец каталога,
 А = 01 - файл найден, по адресу BE1F-BE2F расположены атрибуты файла.
 А = 02 - в каталоге нет места,

C7AF Чтение файла с диска.
Перед обращением:
 BE1F-BE29 - имя файла с расширением,
 BFB4* - cм.выше,
 BFB5 - запустить, если значение этой ячейки больше нуля.
Выходные данные:
 А = 01 - файл считан, иначе файл не найден.

C7B2 Запись файла на диск.
Перед обращением:
 BE1F-BE29 - см. подпрограмму C7AF,
 BE2D - начальный адрес файла,
 BE2F - длина файла в секторах.
Выходные данные:
 A = 00 - запись произведена нормально,
 A = 01 - на диске уже есть файл с таким именем,
 A = 02 - в каталоге нет места.

C6E9 Вычисление длины программы в секторах.
Перед обращением:
 HL - нач.адрес,
 DE - кон.адрес.
Выходные данные:
 BE2F - длина в секторах.

C7B5 Вывод каталога диска (аналогично команде DIR).

C1BA Чтение атрибутов диска по адресу BED0-BEDF.
После обращения заполняются ячейки:
 BED0-BEDA - имя диска,
 BEDB - номер сектора первого свободного сектора диске
 BEDC - номер трека первого свободного сектора диске
 BEDF - флаг запрета команды SAVE (диск R/O)

C60F Выполняется вычитание регистров HL=HL-BC.

C708 Чтение с диска ОС CP/M-36 с последующим запуском (TPA этой ОС 36 кб)

C7D0 Этой подпрограммой подменяют п/п DD31 (вывода на ленту), после чего
программы при выводе будут выноситься не на ленту, а на диск. К имени
полученному на входе (6 символов) добавляется два пробела и расширение COM.

Входные параметры:

 BEA4 - нач.адрес,
 BEA6 - кон.адрес,
 BE8C - имя файла (6 символов).

Как видите, параметры такие же, что и для DD31. Выносимые на диск файлы
получают расширение СОМ.

C7CD Этой подпрограммой подменяют п/п DD94 (чтение с ленты). После чего ввод
файлов происходит с дискеты, а не с МГ-ленты.

Входные параметры:
BE8C - имя файла (6 символов и два пробела).

C7B8 Подпрограмма ЕRA. Ввод как в командном режиме. После завершения
     управление передается по адресу BFE8.

C7BB Подпрограмма REN. Ввод как в командном режиме. Выход по вектору BFE8.

C7BE Подпрограмма TYPE. Ввод как в командном режиме. Выход по вектору BFE8.

C7C0 Подпрограмма SAVE. Ввoд как в командном режиме. Выход по вектору BFE8.

C7C4 Ввод в аккумулятор HEX-числа.
Выходные данные:
 А = HEX-число.
При возникновении ошибки ввода будет произведен выход по адресу BFE8.

C7CA Ввод в рег.пару HL 16-ричного двухбайтового числа.

Выходные данные:
 HL = 16-ричное двухбайтовое число.
При возникновении ошибки ввода будет произведен выход по адресу BFE8.

* - в эту ячейку заносить данные не обязательно, только если вы
    хотите перейти на другой диск.

К подпрограммам C7B8, C7BB, C7BE, C7C0 следует обращаться командой JMP.
При этом в ячейки памяти BFE9-BFEA необходимо занести адрес, куда
требуется перейти после выполнения.

Ошибки, выдаваемые DOS:

*ERROR I/O* - выдается при чтении и записи на диск, например:

1. Чтение сектора с ошибкой (перед выдачей ДОС пытается считать сектор 32 раза)
2. Не найден требуемый сектор или дорожка
3. Диск аппаратно защищён от записи (заклеен вырез R/O)
4. Не хватает места на диске (об этом можно узнать,
   по значению в яч.BFB0 числа большего 16-ричного А4).

*NO FILE* - указанный файл не найден на диске. Выдается при попытке
            уничтожить файл со статусом запрещающим ЕRA.

*NO SAVE* - выдается как в случае когда на диске уже есть такой файл,
            так и если на диск программным путем запрещена запись.

*SN.ERORR* - выдается при синтаксической ошибке.

Теперь информация о ячейках в системном ОЗУ:

BD00-BDFF - используется как буфер при работе с каталогом диска;
BE00-BE0F - буфер, используемый ДОС при вводе файла;
BE1F-BE2F - здесь хранятся атрибуты читаемого файла, поэтому о них поподробней:
 BE1F-BE26 - имя файла, 8 символов;
 BE27-ВЕ29 - расширения файла;
 ВЕ2А - статус файл: 00-свободный, 01-запрет ERA, 02-скрытый файл и запрет ЕRA;
 BE2B - номер сектора на дорожке занимаемый первым сектором файла;
 BE2C - номер дорожки, где находится первый сектор файла;
 BE2D - начальный адрес файла в ОЗУ, он же адрес запуска;
 BE2F - число секторов занимаемых файлом на диске, т.е длина файла в секторах.
В такой же последовательности находятся атрибуты файла в каталоге.

BEF0 - по этому адресу переходят п/п-ммы при ошибках чтения, записи,
       установки головки на дорожку (ERROR I/O), ровно как при работе
       с лентой (ОШИБКА В/В);
BED0-BEDF - атрибуты диска, см.п/п-мму C1BA;
BFB0 - номер дорожки
BFB1 - ноmeр сектора
BFB2 - сторона диска*
BFB3 - реальный номер дорожки для контроллера*
BFB4 - номер дисковода (1,2,3,4)
BFB5 - запуск файлa (1), нет запускa (0)
BFB6 - длина в секторах
BFB7 - используется при работе с диском* (текущий дисковод).

* - в эти ячейки значения заносит сама ДОС.

Информация о диске после того, как он был отформатирован:

1. Низкоуровневыйй формат - одинарная плотность FM
2. В одном секторе 256 байт
3. На одной дорожке 9 секторов - с 1 по 9 (0-го сектора нет)
4. На диске 165 логических дорожек (0...165, 83 физические)
5. Нулевая дорожка: в первом секторе на месте первой каталогой
   записи хранится имя диска, информация о диске и каталог диска

6. С 1-ой по 164-ю дорожки размещаются файлы
7. 165 дорожка DOS не используется и может быть использована для
   копии каталога диска, но это должна делать программа пользователя.

БИС ВГ93 занимает адреса E0...E3. Порт E4 - служебный регистр КНГМД.

При записи в порт E4:

0-1 биты - выбирает номер дисковода
2 бит - сбрасывает ВГ93
3 бит - останавливает ВГ93
4 бит - выбирает сторону диска
5 бит - -------------
6 бит - плотность FM/MFM
7 бит - -------------

При чтении из порта E4:

0-5 биты - ---------
6 бит - равен 0, если команда выполнена
7 бит - готовность к обмену.

На системном диске поставляются внешние системные команды DOS:

1. Format - форматирование дискет
2. Таpes - чтения файлов с диска и затем вынос их на ленту
3. Wcopy2 - копия дискеты на другую дискету
4. МС - графич.оболочка, которая реализует расширенные функции ДОС.

PS. Сейчас под Chameleon-DOS адаптированы все игровые и системные
    программы Львова, например: Samara, Picaso, ASS-91.

 исходник DOS
Code:
; Хамелеон-ДОС, версия 7.7
; (c) Алексей Мамонтов, 1994

        .Z80
        aseg
        ORG     100H

MCONIN  EQU     0F803H
MF806   EQU     0F806H          ; ввод байта
MCOUT   EQU     0F809H
YFCA6   EQU     0FCA6H          ; ???

YE043   EQU     0E043H          ; ROM бейсика (похоже это вход в ROM-бейсик)
YE14A   EQU     0E14AH          ; ROM бейсика
TRANS   EQU     0E11FH          ; ROM бейсика (блок (DE) -> (HL) длиной BC)
FILL_E  EQU     0E12AH          ; ROM бейсика (FILL блока длиной BC байтом из E)
YE260   EQU     0E260H          ; ROM бейсика (возможно это пауза)
CMPDH   EQU     0E425H          ; ROM бейсика
MSSG    EQU     0E4A4H          ; ROM бейсика
PAUS_A  EQU     0E5FBH          ; ROM бейсика
YE627   EQU     0E627H          ; ROM бейсика
YE6AA   EQU     0E6AAH          ; ROM бейсика
YE6A3   EQU     0E6A3H          ; ROM бейсика
YEBD0   EQU     0EBD0H          ; ROM бейсика
YDD31   EQU     0DD31H          ; ROM бейсика (запись файла на МГ-ленту)
YDD94   EQU     0DD94H          ; ROM бейсика (загрузка МГ-файла)

VG93    EQU     0E0H
RG_UPR  EQU     0E4H

RGCOM   EQU     VG93            ; регистр команд
RGTRK   EQU     VG93+1          ; регистр дорожки
RGSEC   EQU     VG93+2          ; регистр сектора
RGDATA  EQU     VG93+3          ; регистр данных

CMDBUF  EQU     0BE00H          ; буфер ввода команд

NAME1   EQU     0BE8CH          ; входное имя для МГ-файла (всего 6 букв)
NAME2   EQU     0BE92H          ; похоже, что это имя МГ-файла считанное с ленты
BEGADR  EQU     0BEA4H          ; адрес начала МГ-файла (ROM-BIOS)
ENDADR  EQU     0BEA6H          ; адрес конца МГ-файла (ROM-BIOS)
YBEA9   EQU     0BEA9H          ; адрес старта загруженного МГ-файла

D_PARM  EQU     0BED0H          ; область загрузки параметров всего диска
                                ; далее следуют параметры диска:

DSKNAM  EQU     0BED0H          ; имя дискеты 10 символов (не 11)
FR_SEC  EQU     0BEDBH          ; номер сектора первого свободного сектора на диске
FR_TRK  EQU     0BEDCH          ; номер трека первого свободного сектора на диске
CLOSED  EQU     0BEDEH          ; флаг зпрета DIR
DISKRO  EQU     0BEDFH          ; флаг диск R/O

DIRBUF  EQU     0BD00H          ; буфер для работы с каталогом диска (256 байт)

YBE1E   EQU     0BE1EH          ; какой-то, похоже, неиспользуемый флаг
RECORD  EQU     0BE1FH          ; сюда грузится каталоговая запись файла:

FNAME   EQU     0BE1FH          ; имя файла, 8 символов
F_EXT   EQU     0BE26H          ; расширение, 3 символа
F_ATTR  EQU     0BE2AH          ; атрибут файла: 0 - R/W, 1 - R/O, 2- SYS & R/O
FF_SEC  EQU     0BE2BH          ; номер сектора на дорожке занимаемый первым сектором файла
FF_TRK  EQU     0BE2CH          ; номер дорожки, где находится первый сектор файла
F_BEGA  EQU     0BE2DH          ; начальный адрес файла в ОЗУ = адрес запуска
F_NSEC  EQU     0BE2FH          ; длина файла в секторах

YB880   EQU     0B880H
YBE38   EQU     0BE38H          ; похоже флаг горячего старта
YBE3A   EQU     0BE3AH
YBE40   EQU     0BE40H

STACK   EQU     0BE80H

TRACK   EQU     0BFB0H          ; логический номер текущего трека (0...164)
SECTOR  EQU     0BFB1H          ; номер текущего сектора (1-9)
SIDE    EQU     0BFB2H          ; текущая сторона диска (0/1)
FIZTRK  EQU     0BFB3H          ; физический номер дорожки для контроллера
DISK    EQU     0BFB4H          ; номер текущего дисковода (1,2,3,4)
EXEFLG  EQU     0BFB5H          ; если >0 запуск файлa, =0 нет запускa
LENGTH  EQU     0BFB6H          ; число читаемых секторов (1-255)
CURDSK  EQU     0BFB7H          ; используется при работе (диск к которому лезем)
YBFB8   EQU     0BFB8H          ; возможно это число секторов в треке (заготовка для DD)

JBFE8   EQU     0BFE8H          ; здесь код C3 (команда JMP)
YBFE9   EQU     0BFE9H          ; здесь в ДОС адрес ABORT

JBFEB   EQU     0BFEBH          ; здесь код C3 (команда JMP)
YBFEC   EQU     0BFECH          ; здесь AC6CD

JERROR  EQU     0BEF0H          ; здесь код C3 (сюда переход при ошибках дисковых операций)
YBEF1   EQU     0BEF1H          ; здесь в ДОС адрес ABORT

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

.msg    MACRO   ADDR
        LD      HL,ADDR
        CALL    MSSG
        ENDM

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

.msg_B  MACRO   SIZE
        LD      B,SIZE
        CALL    MSSG_B
        ENDM

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

.emit   MACRO   SYM
        LD      C,SYM
        CALL    MCOUT
        ENDM

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

.home   MACRO                   ; процедура HOME
        XOR     A               ; она исп-ся 4 раза, лучше сделать п/п-му HOME
        LD      (TRACK),A
        INC     A
        LD      (SECTOR),A
        ENDM

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

INCLOC  MACRO   LOC
        LD      A,(LOC)
        INC     A
        LD      (LOC),A
        ENDM

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

        .phase  0C000H

        JP      START

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

SREAD:  LD      B,32            ; число попыток чтения сектора каталога
AC005:  DI
        PUSH    HL
        CALL    SREAD1
        POP     HL
        IN      A,(RGCOM)
        AND     00011100B
        EI
        RET     Z
        DEC     B               ; DJNZ
        JP      NZ,AC005
        JP      ERROR

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

SREAD1: LD      A,(SECTOR)
        OUT     (RGSEC),A
        JP      SREAD2

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

        JP      CMPDH           ; для совместимости с прежними версиями

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

SREAD2: LD      C,0C0H
        LD      A,(SIDE)
        OR      A
        LD      A,82H
        JP      Z,JJJ_01
        LD      A,8AH
JJJ_01: CALL    EXEC
        JP      RD_LOO          ; && перенести сюда процедуру RD_LOO

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

        defb    255,255,255,255

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

SWRITE: LD      B,32            ; число попыток записи
AC03C:  DI
        PUSH    HL
        CALL    SWRIT1
        POP     HL
        IN      A,(RGCOM)
        AND     01111100B
        EI
        RET     Z
        JP      AC105

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

SWRIT1: LD      A,(SECTOR)
        OUT     (RGSEC),A

        LD      C,0C0H
        LD      A,(SIDE)
        OR      A
        LD      A,0A2H
        JP      Z,AC05D
        LD      A,0AAH
AC05D:                          ; физическая запись сектора
        CALL    EXEC
WR_LOO: IN      A,(RG_UPR)
        AND     C
        JP      Z,WR_LOO
        LD      A,(HL)
        OUT     (RGDATA),A
        INC     HL
        JP      P,WR_LOO
        RET

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

PODGOT:                         ; подготовка дисковых операций
        PUSH    HL              ; установка головки на требуемую дорожку
        PUSH    BC              ; в HL куда грузить
        LD      C,10
        LD      HL,CURDSK
        LD      A,(DISK)
        CP      (HL)
        JP      Z,AC080
        LD      (HL),A
AC07D:  CALL    SELDSK
AC080:  LD      A,(TRACK)
        OR      A               ; CY=0
        RRA
        LD      (FIZTRK),A
        LD      A,0
        RLA
        LD      (SIDE),A
        OR      A
        LD      A,(HL)
        LD      B,00001100B
        JP      NZ,AC097        ; если сторона 1
        LD      B,00011100B     ; бит стороны в контроллере инвертированный
AC097:  OR      B
        LD      B,A
        INC     HL
        INC     HL
        LD      A,(HL)
        OR      A
        JP      Z,AC63D
AC0A0:  LD      A,B
        XOR     01000000B
        CALL    AC656
        JP      AC632           ; && перенести сюда процедуру AC632

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

        defb       0

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

LDNSEC: CALL    PODGOT          ; загрузить LENGTH секторов на
AC0AD:  CALL    SREAD
        LD      A,(LENGTH)
        DEC     A
        RET     Z
        LD      (LENGTH),A
        CALL    AC0C1
        JP      C,AC0AD
        JP      LDNSEC

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

AC0C1:  LD      BC,100H         ; Выход: CY
        ADD     HL,BC
        PUSH    HL
        LD      HL,SECTOR
        LD      A,(YBFB8)
        INC     (HL)
        CP      (HL)
        JP      NC,AC0F7
        LD      (HL),1          ; первый сектор трека: SECTOR= 1
        DEC     HL              ; теперь HL указывет на TRACK
        LD      A,(HL)
        CP      164             ; превышен последний трек ?
        JP      AC0F3           ; && перенести сюда процедуру AC0F3

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

        defb    255,255

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

WRNSEC: CALL    PODGOT
AC0DF:  CALL    SWRITE
        LD      A,(LENGTH)
        DEC     A
        RET     Z
        LD      (LENGTH),A
        CALL    AC0C1
        JP      C,AC0DF
        JP      WRNSEC

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

AC0F3:  JP      NC,ERROR
        INC     (HL)
AC0F7:  CCF
        POP     HL
        RET

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

AC0FA:  CALL    EXEC
        CALL    READY
        IN      A,(RGCOM)
        AND     00011000B
        RET

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

AC105:  DEC     B
        JP      NZ,AC03C        ; DJNZ
        JP      ERROR

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

        defb    255,255

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

RD_DIR: CALL    PODGOT          ; читаем сектор каталога
AC111:  PUSH    HL
        LD      HL,DIRBUF
        CALL    SREAD
        POP     HL
        RET

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

WR_DIR: PUSH    HL              ; запись сектора каталога
        LD      HL,DIRBUF
        CALL    PODGOT
        CALL    SWRITE
        POP     HL
        RET

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

FIND:                   ; поиск файла в каталоге
        .home           ; если файл найден, то загрузка пар-ров файла в область RECORD
FNLOO1: CALL    RD_DIR
        LD      HL,DIRBUF
FNLOO2: PUSH    HL
        PUSH    DE
        CALL    CMPSTR
        POP     DE
        POP     HL
        OR      A
        RET     Z
        CP      1               ; имена были равны?
        JP      Z,AC17F         ; если равны, на загрузку пар-ров файла в область RECORD

        LD      BC,17           ; шаг каталоговых записей
        ADD     HL,BC           ; к следующей каталоговой записи в DIR-буфере
        LD      A,L
        CP      0FFH            ; была последняя запись сектора ? (кстати, короче INC A)
        JP      NZ,FNLOO2
     
        INCLOC  SECTOR          ; на следующий сектор
        CP      10              ; был последний сектор трека ?
        JP      C,FNLOO1        ; если был не последний сектор
RET_A2: LD      A,2
        RET

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

CMPSTR: LD      A,(HL)          ; Сравнение двух имён длиной 11 символов (всез значащие)
        OR      A               ; Выход: A=1, если строки сравнились O'KAY
        RET     Z               ;        A=2, если строки неодинаковые
        LD      C,11
CMPLOO: LD      A,(DE)          ; сравнение строк по (HL) и (DE) длиной из C
        CP      (HL)
        JP      NZ,RET_A2
        INC     HL
        INC     DE
        DEC     C
        JP      RETZA1          ; && перенести сюда процедуру RETZA1

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

        defb       0

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

        LD      A,E             ; ?? бредятина
        CP      0FFH
        JP      Z,65CH
        CP      B
        JP      C,0F065H
        JP      0F168H

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

RETZA1: JP      NZ,CMPLOO
        LD      A,1
        RET

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

AC17F:  EX      DE,HL           ; DE= откуда
        LD      HL,RECORD       ; куда
        LD      BC,17           ; сколько (это длина каталоговой записи)
        CALL    TRANS
        LD      A,1
        RET

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

LOAD:   LD      DE,FNAME
AC18F:  CALL    FIND
        CP      1
        RET     NZ              ; если такого файла нет
        CALL    PODG_W          ; на выходе HL= адрес начала блока
        CALL    LDNSEC
        LD      HL,(F_BEGA)
        CALL    CHKEXE          ; проверить атрибут запуска файла
        RET     Z
        POP     AF
        JP      (HL)

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

PODG_W: LD      A,(FF_SEC)      ; подготовка к записи файла
        LD      (SECTOR),A
     
        LD      A,(FF_TRK)
        LD      (TRACK),A
     
        LD      A,(F_NSEC)
        LD      (LENGTH),A
     
        LD      HL,(F_BEGA)
        RET

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

@C1BA:
RDDPRM:                         ; считать параметры всего диска в область D_PARM
        .home
        CALL    RD_DIR

        LD      HL,D_PARM       ; куда
        LD      DE,DIRBUF       ; откуда
        LD      BC,16           ; сколько
        JP      TRANS

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

SAVE:                           ; запись целого файла
        CALL    RDDPRM          ; читаем общие параметры диска в D_PARM
        LD      A,(DISKRO)
        OR      A
        RET     NZ              ; если диск R/O

        LD      DE,FNAME        ; проверяем есть ли уже такой файл
        CALL    FIND            ; на выходе HL указывает на запись в DIRBUF
        OR      A
        RET     NZ              ; если такой файл уже есть
                                ; HL указывает на конец списка файлов в DIRBUF
        LD      A,(FR_SEC)
        LD      (FF_SEC),A      ; пишем файл на DISK TOP

        LD      A,(FR_TRK)
        LD      (FF_TRK),A

        XOR     A
        LD      (F_ATTR),A      ; атрибут файла R/W

                                ; HL откуда, указывает на конец списка файлов в DIRBUF
        LD      DE,FNAME        ; куда
        LD      BC,17           ; сколько (длина каталоговой записи)
        CALL    TRANS           ; копирует из FNAME в DIRBUF на место записи

        CALL    WR_DIR          ; обновляем сектор каталога (куда добавлена нов.запись)
     
        CALL    PODG_W
        CALL    WRNSEC          ; пишем сам файл

        LD      A,(SECTOR)
        INC     A
        CP      10              ; был последний сектор ?
        JP      Z,AC231         ; если ДА

        LD      (FR_SEC),A      ; ставим новый DISK TOP

        LD      A,(TRACK)
AC212:  LD      (FR_TRK),A      ; ставим новый DISK TOP

        .home                   ; читаем первый сектор и пишем его с новыми параметрами
        CALL    RD_DIR

        LD      HL,DIRBUF       ; куда
        LD      DE,D_PARM       ; откуда
        LD      BC,16           ; сколько
        CALL    TRANS

        CALL    WR_DIR          ; пишем обновлённый первый сектор
        XOR     A
        RET

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

AC231:  LD      A,1             ; переход на следующий трек при записи
        LD      (FR_SEC),A
        LD      A,(TRACK)
        CP      164             ; последний трек ?
        CALL    Z,WRFSEC        ; если ДА, то на запись N сектора указателя DISK TOP и RET
        INC     A
        JP      AC212           ; на чтение первого сектора и запись его с новыми параметрами

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

MSSG_B: .emit   (HL)            ; вывод Z-строки длиной в B-символов
        INC     HL
        DEC     B               ; поменяв на JP NZ можно использовать DJNZ
        RET     Z
        JP      MSSG_B

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

TDNAME: defb    'ИМЯ ДИСКА:  ',0

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

XDIR:                           ; вывод каталога диска
        CALL    RDDPRM          ; читаем общие параметры диска в D_PARM
        LD      A,(CLOSED)
        OR      A
        RET     NZ

        .msg    TDNAME          ; выводим текст 'ИМЯ ДИСКА: '
     
        LD      HL,DSKNAM       ; выводим само имя дискеты
        .msg_B  10
        CALL    CR              ; на начало следующей строки
     
        LD      HL,DIRBUF +17   ; начало списка файлов в 1-м секторе (первые 17 байт - пар-ры диска)
DIRLOO: LD      A,(HL)
        OR      A
        RET     Z
        CALL    AC2BF
        CP      0FFH
        CALL    Z,AC2AE
        CP      10
        RET     Z
        LD      A,E
        CP      1
        JP      Z,DIRLOO
        CALL    SPACE
        .emit   ':'
        CALL    SPACE
AC294:  LD      A,(HL)
        OR      A
        RET     Z
        CALL    AC2BF
        CP      0FFH
        CALL    Z,AC2AE
        CP      10
        RET     Z
        LD      A,E
        CP      1
        JP      Z,AC294
        CALL    CR
        JP      DIRLOO

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

AC2AE:  INCLOC  SECTOR
        CP      10              ; был последний сектор трека ?
        RET     Z
        CALL    AC111
        LD      HL,DIRBUF
        RET

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

AC2BF:  LD      A,(HL)
        CP      1
        JP      Z,AC2EA
        PUSH    HL
        LD      BC,11
        ADD     HL,BC
        LD      A,(HL)
        POP     HL
        CP      2
        JP      NC,AC2EA

        PUSH    HL
        .msg_B  8
        .emit   '.'
        .msg_B  3
        POP     HL

        LD      E,0
HLADD17:                        ; переходим к следующей записи в каталоге
        LD      BC,17           ; шаг каталоговых записей
        ADD     HL,BC
        LD      A,L
        RET

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

AC2EA:  LD      E,1
        JP      HLADD17

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

SEL_A:  XOR     A
        LD      (DISK),A
        LD      (CURDSK),A
SELDSK: XOR     A               ; установка диска CURDSK и проверка готовности
        OUT     (RG_UPR),A
     
        LD      A,(CURDSK)
        LD      B,00011100B     ; не понял, зачем грузить маску в рег.B
        OR      B
        OUT     (RG_UPR),A
     
        LD      A,0D8H
        CALL    EXEC
AC306:  IN      A,(RGCOM)
        RRA
        JP      C,AC306
     
        LD      A,8
        CALL    EXEC
        CALL    READY
     
        CALL    YE260
        JP      YE260

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

READY:  IN      A,(RGCOM)       ; ждём готовности
        RLA
        JP      C,READY
READY1: IN      A,(RGCOM)
        RRA
        JP      C,READY1
        RET

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

AC327:  LD      DE,TCMND
        LD      A,D             ; A= 0C3H
        LD      (EXEFLG),A      ; не 0, запуск файлa разрешён
        JP      AC18F

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

TCMND:  defb    'COMMAND COM'           ; имя автостартующего при старте DOS файла

TITR:   defb    'CHAMELEON-DOS 7.7',13
        defb    '(C)MASKSOFT&144KБ',13,0

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

AC361:  XOR     A
        LD      (YBE38),A       ; похоже флаг горячего старта
        CALL    YEBD0           ; возможно инициализация чего-то
CCP:                            ; вход в командный процессор DOS
        LD      SP,STACK
        .msg    TITR
     
        CALL    SEL_A
        CALL    V_INIT          ; инициализация векторов ошибок
        CALL    RDDPRM          ; читаем общие параметры диска в D_PARM
        CALL    AC327
ABORT:
        LD      SP,STACK
        CALL    V_INIT          ; инициализация векторов ошибок
        CALL    RDDPRM          ; читаем общие параметры диска в D_PARM
        CALL    CR              ; на начало следующей строки
        LD      A,(DISK)
        ADD     A,'A'

        .emit   A
        .emit   ':'
        .emit   '>'

        LD      HL,CMDBUF       ; буфер ввода команд
        PUSH    HL
        LD      BC,15           ; длина блока (здесь длина ком.строки)
        LD      E,20H           ; чем заполнять
        CALL    FILL_E
        POP     HL
                                ; HL буфер ввода команд
        CALL    MF806           ; первое слово можно ввести ключевой клавишей
        CP      7               ; клавиша <F0>
        JP      Z,ZDIR
        CP      12H
        JP      Z,ZSAVE
        CP      15H             ; клавиша <F1>
        JP      Z,BLOAD
        CP      16H             ; клавиша <F3>
        JP      Z,RENAME
        CP      14H             ; клавиша <F4>
        JP      Z,ERA
        CP      13H             ; клавиша <F5>
        JP      Z,TYPE
        CP      6               ; клавиша <П/Д>
        JP      Z,RUNCPM
        CP      0BH
        JP      Z,YE14A
        CP      0CH
        JP      Z,CMD_0C
        LD      (HL),A
        CALL    COUTA
        INC     HL
AC3DE:  CALL    MCONIN
        CP      7FH
        JP      Z,ZABOJ
        CP      13
        JP      Z,AC40A
        LD      (HL),A
        CALL    COUTA
        LD      A,L
        CP      15 + low CMDBUF
        JP      NC,AC3DE
        INC     HL
        JP      AC3DE

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

ZABOJ:  LD      A,L
        OR      A
        JP      Z,AC3DE
        DEC     HL
        .emit   7FH
        LD      A,20H
        LD      (HL),A
        JP      AC3DE

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

AC40A:  DEC     HL
        LD      A,(HL)
        CP      ':'
        JP      NZ,AC420
        DEC     HL
        LD      A,(HL)
        SUB     'A'
        CP      4
        JP      NC,ABORT
        LD      (DISK),A
        JP      ABORT

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

AC420:  LD      HL,FNAME        ; куда
        LD      DE,CMDBUF       ; откуда
        LD      BC,8            ; сколько
        CALL    TRANS

        LD      (HL),'C'        ; короче на 5 байтов CALL MOVCOM
        INC     HL
        LD      (HL),'O'
        INC     HL
        LD      (HL),'M'

        LD      A,1
        LD      (EXEFLG),A

        CALL    LOAD
        JP      NO_FND          ; && перенести сюда процедуру NO_FND

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

ZDIR:   .msg    TDIR
        CALL    WAITWK          ; ждём нажатия <ВК>
        CALL    XDIR
        JP      JBFE8

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

WAITWK: CALL    MCONIN
        CP      13
        JP      Z,CR            ; если <ВК>, то на начало следующей строки
        JP      WAITWK

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

BLOAD:  .msg    TLOAD
        CALL    WAITWK

        LD      HL,NAME1
        LD      BC,6            ; длина заполняемого блока
        LD      E,20H           ; чем заполнять
        CALL    FILL_E

        CALL    YDD94           ; загрузка МГ-файла
        LD      HL,(YBEA9)
        JP      (HL)

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

ASCHEX: SUB     30H             ; из ASCII получить HEX-число
        CP      10H
        RET     C
        SUB     7
        RET

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

IS_HEX: CP      30H
        JP      C,RETCY1
        CP      3AH
        JP      C,RETCY0
        CP      'A'
        JP      C,RETCY1
        CP      'G'
        JP      NC,RETCY1
RETCY0:
        OR      A
        RET

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

RETCY1: SCF
        RET

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

GETHEX: PUSH    HL              ; считывает из F806 и выводит HEX-число
        CALL    MF806
        CALL    IS_HEX
        JP      C,SYNTAX
        LD      H,A
        CALL    COUTA
        CALL    MF806
        CALL    IS_HEX
        JP      C,SYNTAX
        LD      L,A
        CALL    COUTA
        LD      A,L
        CALL    ASCHEX
        LD      B,A
        LD      A,H
        CALL    ASCHEX
        RLCA
        RLCA
        RLCA
        RLCA
        OR      B
        POP     HL
        RET

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

GET_HL: CALL    GETHEX
        LD      H,A
        CALL    GETHEX
        LD      L,A
        RET

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

COUTA:  LD      C,A
        JP      MCOUT

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

GETNAM: LD      HL,FNAME        ; считывает имя файла из п/п-ммы F806 на FNAME
AC4CF:  CALL    MF806
        CP      13H
        JP      Z,SYNTAX
        LD      (HL),A
        CALL    COUTA
        LD      A,L
        CP      (low FNAME) +7  ; 26H
        INC     HL
        JP      C,AC4CF         ; если введено не более 8 символов
        .emit   '.'
AC4E7:  CALL    MF806
        CP      13H
        JP      Z,SYNTAX
        LD      (HL),A
        CALL    COUTA
        INC     HL
        LD      A,L
        CP      (low FNAME) +11 ; 2AH   
        RET     NC              ; если был последний 12-тый символ в имени
        JP      AC4E7

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

SPACE:  LD      C,20H
        JP      MCOUT

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

CR:     LD      C,13            ; на начало следующей строки
        JP      MCOUT

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

ZSAVE:  .msg    TSAVE
        CALL    GETNAM          ; считывает имя файла из п/п-ммы F806
        CALL    SPACE
        CALL    GET_HL
     
        PUSH    HL
        LD      (F_BEGA),HL
        CALL    SPACE
        CALL    GET_HL
        EX      DE,HL
        POP     HL
     
        CALL    GET_NS          ; расчёт длины файла в секторах. Блок: HL...DE
        CALL    WAITWK
        CALL    SAVE
        OR      A
        JP      NZ,NOSAVE
        JP      JBFE8

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

ERROR:  .msg    TEROR
        JP      JERROR

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

NO_FND: LD      HL,TNOFIL
MSGEXI: CALL    MSSG
        JP      JBFE8

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

NOSAVE: LD      HL,TNOSAV
        JP      MSGEXI

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

SYNTAX: LD      HL,TSNERR       ; синтаксическая ошибка в команде
        JP      MSGEXI

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

TEROR:  defb    13,'*ERORR I/O*',13,0
TDIR:   defb    'DIR',0
TLOAD:  defb    'LOAD ',0
TSAVE:  defb    'SAVE ',0
TERA:   defb    'ERA ',0
TREN:   defb    'REN ',0
TNOFIL: defb    13,'*NO FILE*',0
TNOSAV: defb    13,'*NO SAVE*',0
TTYPE:  defb    'TYPE ',0
TSNERR: defb    13,'*SN.ERROR*',0

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

ERA:    .msg    TERA
        CALL    GETNAM          ; считывает имя файла из п/п-ммы F806
        CALL    WAITWK
        LD      DE,FNAME
        CALL    FIND
        CP      1               ; короче DEC A
        JP      NZ,NO_FND
        EX      DE,HL           ; DE указывает на следующую запись файла в DIRBUF
        LD      BC,17           ; шаг каталоговых записей
        CALL    DSUB_B
        PUSH    HL              ; HL указывает на начало каталоговой записи
        LD      BC,11           ; смещение в каталоговой записи до атрибута
        ADD     HL,BC
        LD      A,(HL)          ; A= атрибут файла
        POP     HL              ; HL указывает на начало каталоговой записи
        CP      1
        JP      NC,NO_FND       ; если файл R/O
        LD      A,1             ; короче LD (HL),1
        LD      (HL),A          ; удаляем файл, записав 1 первым символом имени
        CALL    WR_DIR          ; пишем обновлённый первый сектор
        JP      JBFE8

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

RENAME: .msg    TREN
        CALL    GETNAM          ; считывает имя файла из п/п-ммы F806

        LD      HL,CMDBUF
        LD      DE,FNAME
        LD      BC,11
        CALL    TRANS
        .emit   '='
        CALL    GETNAM          ; считывает имя файла из п/п-ммы F806

        LD      DE,FNAME
        CALL    FIND
        CP      1
        JP      NZ,NO_FND
        EX      DE,HL
        LD      BC,17           ; шаг каталоговых записей
        CALL    DSUB_B          ; вернём указатель HL на найденный файл в DIRBUF
        LD      DE,CMDBUF       ; откуда
        LD      BC,11           ; сколько
        CALL    TRANS           ; скопируем новое имя в каталоговую запись в DIRBUF
        CALL    WR_DIR          ; обновляем сектор каталога
        JP      JBFE8

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

@C60F:
DSUB_B: LD      A,L             ; вычитание HL минус BC
        SUB     C
        LD      L,A
        LD      A,H
        SBC     A,B
        LD      H,A
        RET

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

TYPE:   .msg    TTYPE
        LD      (EXEFLG),A      ; A=0 запуск файлa запрещён
        CALL    GETNAM          ; считывает имя файла из п/п-ммы F806
        CALL    WAITWK
        CALL    LOAD
        DEC     A
        JP      NZ,NO_FND
        LD      HL,(F_BEGA)
        JP      MSGEXI

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

AC632:  LD      (HL),1
        JP      NZ,AC64C
        DEC     HL              ; HL указывает на SECTOR
        LD      (HL),9
        POP     BC
        POP     HL              ; в HL куда грузить
        RET

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

AC63D:  LD      A,B
        CALL    AC656
        JP      NZ,AC0A0
        LD      (HL),0
        DEC     HL
        LD      (HL),10H
        POP     BC
        POP     HL
        RET

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

AC64C:  DEC     (HL)
        DEC     HL
        DEC     HL
        DEC     C
        JP      NZ,AC07D
        JP      ERROR

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

AC656:  OUT     (RG_UPR),A
        CALL    PAUS15
        LD      A,(FIZTRK)
        OUT     (RGDATA),A              ; ?? а не должно тут быть RGTRK
        LD      A,1CH                   ; команда для ВГ93
        JP      AC0FA                   ; && перенести сюда процедуру AC0FA

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

START:  OUT     (0),A
        LD      SP,0BF99H               ; начальный стек

        LD      A,88H
        OUT     (0C3H),A

        LD      A,8AH
        OUT     (0D3H),A

        LD      A,2
        OUT     (0C2H),A

        LD      A,8FH
        OUT     (0C1H),A

        LD      A,0BFH
        OUT     (0D0H),A

        IN      A,(0D1H)
        CP      0FBH
        JP      NZ,AC696

        LD      HL,0000
AC688:  LD      A,(HL)
        CPL
        LD      (HL),A
        CP      (HL)
        JP      NZ,YE043

        INC     HL
        LD      A,H
        CP      0C0H
        JP      NZ,AC688
AC696:  CALL    AC786

        LD      A,0DFH
        OUT     (0D0H),A

        IN      A,(0D1H)
        CP      7FH
        JP      Z,AC6AA

        LD      HL,AC6CD
        LD      (YBFEC),HL

AC6AA:  LD      A,0C3H
        LD      (JBFEB),A

        LD      HL,0B000H
        LD      BC,0EEFH
        LD      E,0
        CALL    FILL_E

        LD      HL,YB880
        LD      (YBE40),HL

        LD      A,1
        LD      (YBE3A),A

        LD      A,255
        LD      (YBE1E),A

        JP      0E0F5H

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

AC6CD:  LD      HL,DIRBUF       ; откуда
        LD      DE,80C0H        ; куда
        LD      BC,100H         ; сколько
        PUSH    HL
        PUSH    DE
        PUSH    BC
        CALL    TRANS
        CALL    AC777
        POP     BC
        POP     HL
        POP     DE
        CALL    TRANS

        JP      AC361

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

        defb       0

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

@C6E9:
GET_NS: PUSH    HL              ; расчёт длины файла в секторах. Блок: HL...DE
        PUSH    DE              ; заносит рассчитанную длину в RECORD
        LD      A,1
        LD      (F_NSEC),A      ; начиная с одного сектора
        CALL    GNSLOO          ; здесь п/п-мма не нужна (теряем байт)
        POP     DE
        POP     HL
        RET

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

GNSLOO: LD      BC,256
        ADD     HL,BC
        CALL    CMPDH           ; сравнение HL и DE (CMPDH)
        RET     NC              ; если достигнут или превышен конечный адрес

        LD      A,(F_NSEC)
        INC     A
        LD      (F_NSEC),A

        JP      GNSLOO

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

@C708:
RUNCPM: .home
     
        LD      A,31            ; длина файла в секторах
        LD      (LENGTH),A
     
        LD      HL,9000H        ; куда грузим
        CALL    LDNSEC
        JP      0A600H

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

AC71E:                          ; формирование имени DOS-файла из имени МГ-файла
        LD      DE,NAME1        ; откуда
        JP      FNFORM

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

        LD      DE,NAME2        ; откуда
FNFORM: LD      HL,FNAME        ; куда
        LD      BC,6            ; сколько
        CALL    TRANS
        LD      (HL),20H
        INC     HL
        LD      (HL),20H
        INC     HL
MOVCOM: LD      (HL),'C'
        INC     HL
        LD      (HL),'O'
        INC     HL
        LD      (HL),'M'
        RET

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

AC73F:
        CALL    AC71E           ; формирование имени DOS-файла из имени МГ-файла

        LD      HL,(ENDADR)
        EX      DE,HL
        LD      HL,(BEGADR)     ; адреса начала и конца блока в HL,DE
        LD      (F_BEGA),HL     ; готовим каталоговую запись в RECORD
        CALL    GET_NS          ; расчёт длины файла в секторах. Блок: HL...DE
        JP      SAVE            ; && перенести сюда процедуру SAVE

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

AC752:                          ; загрузка и запуск COM-файла
        CALL    AC71E           ; формирование имени DOS-файла из имени МГ-файла
        XOR     A
        LD      (EXEFLG),A      ; =0 запуск файлa запрещён
        JP      LOAD

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

V_INIT: LD      A,0C3H          ; инициализация векторов ошибок
        LD      (JBFE8),A
        LD      (JERROR),A
        LD      (JBFEB),A

        LD      HL,ABORT
        LD      (YBEF1),HL
        LD      (YBFE9),HL

        LD      HL,CCP
        LD      (YBFEC),HL

        RET

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

AC777:  LD      HL,80C0H                ; запуск
        LD      DE,YFCA6
        LD      BC,0EAH                 ; 234 дес
        CALL    TRANS

        JP      80D4H

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

AC786:  CP      0F7H
        RET     NZ

        LD      HL,YB880
        LD      (YBE40),HL

        LD      C,33H
        CALL    YE6AA

        LD      C,17H
        CALL    YE6A3

        JP      YE627

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

        defb     80H

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

; Входы в функции ДОС
                             
@C79D:  JP      PODGOT          ; подготовка
@C7A0:  JP      SREAD           ; читать сетор
@C7A3:  JP      SWRITE          ; запись сектора
@C7A6:  JP      LDNSEC          ; считать LENGTH секторов
@C7A9:  JP      WRNSEC          ; записать LENGTH секторов
@C7AC:  JP      FIND            ; поиск файла и чтение его каталоговой записи
@C7AF:  JP      LOAD            ; загрузка файла
@C7B2:  JP      SAVE            ; запись файла
@C7B5:  JP      XDIR            ; вывод каталога диска
@C7B8:  JP      ERA             ; удаление файла
@C7BB:  JP      RENAME          ; переименование файла
@C7BE:  JP      TYPE            ; вывод текстового файла на экран
@C7C1:  JP      ZSAVE           ; запись файла с вводом командной строки
@C7C4:  JP      GETHEX          ; считать однобайтовое HEX-число
@C7C7:  JP      GETNAM          ; считывает имя файла из п/п-ммы F806
@C7CA:  JP      GET_HL          ; считать двухбайтовое HEX-число
@C7CD:  JP      AC752
@C7D0:  JP      AC73F

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

CMD_0C: LD      A,165
        LD      (TRACK),A
        CALL    PODGOT
        JP      AC361           ; && перенести сюда процедуру AC361

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

CHKEXE: LD      A,(EXEFLG)      ; проверить атрибут запуска файла
        OR      A               ; Выход: флаг Z=1, если запуск файлa запрещён
        LD      A,1
        RET     Z
        RET

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

RD_LOO: IN      A,(RG_UPR)      ; физическое чтение сектора
        AND     C
        JP      Z,RD_LOO
        IN      A,(RGDATA)
        RET     M
        LD      (HL),A
        INC     HL
        JP      RD_LOO

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

EXEC:   OUT     (RGCOM),A
PAUS15: LD      A,15
        JP      PAUS_A       

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

        defb       0

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

WRFSEC: LD      (FR_SEC),A      ; записать N сектора указателя DISK TOP
        RET

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

        .dephase

        END


Attachments:
DOS для Львова.rar [47.99 KiB]
Downloaded 439 times


Last edited by barsik on 25 Oct 2018 12:53, edited 8 times in total.

24 Oct 2018 13:48
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Post Re:
barsik wrote:
В Вике написано, что ПК-01 Львов выпустили аж 80 тысяч, но к сожалению все они остались на Украине, в Росию попало мало.

Неправда ваша - у нас в Екатеринбурге в 1991 году он очень даже продавался :)

P.S. О - вот эту песенку я помню, но то что это было про ПК-01 - не помню :roll:


https://youtu.be/l6iFDlWzPz0

P.P.S. Поменял код видео на другой т.к. старое видео исчезло...

_________________
:dj: https://mastodon.social/@Shaos


24 Oct 2018 19:01
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Как бы то ни было Львов был очень популярен в основном на Украине, хотя действительно, в России он тоже присутствовал. В частности, некоторые фирмы сделавшие существенный вклад в развитие ПО и доработки железа были как раз в Москве. Но мне лично Львов в 90-тые ни разу не попадался, ни в магазинах, ни на радио-барахолке. Возможно поставки были в определённые регионы. Например болгарский "Полдин-601" поставлялся в основном в Архангельскую область, а Правец-82 в Узбекистан.

Выложенную ранее версию исходника существенно отредактировал (те кто скачал ранее удалите) и соответственно заменил вложение в свой предыдущий пост.

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

Благодаря большему использованию подпрограмм бейсика, освободилось место в двух килобайтовом ПЗУ РФ2, что и позволило автору доработать DOS. Но как видно по тексту, автор старался совместить все старые входные точки, отчего процедуры раздроблены на куски и стоит много одиноких промежуточных JMP-ов. При переделке с несоблюдением совместимости по внутренним входам освободится ~50 байт, что возможно позволит получить DOS не привязанную к ПЗУ Львова и пригодную для любой ЭВМ. Назначение некоторых подпрограмм ROM-бейсика удалось определить по логике. А на остальные надо искать его код и дизассемблировать.

Во вложении предыдущего поста теперь не только сам исходник, но и полный комплект программ для трансляции в Windows или MSDOS. Достаточно запустить BAT-файл. BAT-файлом исходник перекодируется из АЛЬТ-кодировки в КОИ-7, транслируется, а затем полученный результирующий файл сравнивается с оригиналом с помощью Windows-программы FC.EXE, чтобы было ясно, что исходник правильный. Подробности в файле _READ_ME.TXT.


25 Oct 2018 01:56
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Post Re:
Shaos wrote:
Воспоминания зрителя демонстрации Львова в питерском магазине Электроника в конце 80-х:

https://pdp11-spb.livejournal.com/4861.html

Ну вот же человек пишет - в Питере:
Quote:
В каком году не помню, но где-то в 87г, присутствовал на презентации "Львов-ПК" в магазине "Электроника". Тогда за него просили вроде бы 750руб, но народ в зале этого не оценил и просил цену ополовинить, ибо нет чего-то особо выдающегося в нём.
Как узнал про демонстрацию уже не помню, но очень вероятно, что увидел объявление о предстоящем мероприятии в этом же магазине. По молодости туда часто наведывался, даже просто прогуляться-поглазеть.
Фирменный магазин "Электроника", тогда ещё в Ленинграде, представляет из себя первый этаж многоэтажного дома. Витрины во всю высоту помещения. Внутри достаточно просторные залы, разделённые колоннами. В одном из таких залов, между колонн, и проходило обсуждение-демонстрация "Львов-ПК". Выглядело всё достаточно традиционно, по советски. Стол, вроде был какой-то плакат, сам компьютер подключённый к монитору, вроде Электроника 32 ВТЦ. То ли кто-то из авторов, то ли представитель завода рассказывал о новом изделии, демонстрировали программы. Потом дали слово зрителям. Тогда и высказались, что дело оно конечно хорошее, но цену надо бы поменьше, поскольку просто ничего сверхъестественного. Посетовали на малое количество программ и выразили сомнение в том, что все сразу кинуться их писать. Авторы и завод изготовитель программной поддержкой заниматься не собирались. Это не дословная цитата. Но насколько помню, главной проблемой называлась отсутствие программ и тех, кто ими будет заниматься. Народ выражал сомнения в том, что они появятся в скором времени. Да и давно это было. Осталось от демонстрации скорее общее ощущение, что не плохо, но не выдающееся, дорого и нет софта. Потом все желающие могли разжиться рекламными листовками, такие серебристые с рыжими надписями, с фотографией аппарата и его характеристиками. У меня такой долгое время висел на стенке, приколотый булавками за обои, если найду, то постараюсь отсканировать. Больше ПК-01"ЛЬВОВ" мне встречать не приходилось...

_________________
:dj: https://mastodon.social/@Shaos


26 Oct 2018 06:05
Profile WWW
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Shaos wrote:
Фирменный магазин "Электроника", тогда ещё в Ленинграде, представляет из себя первый этаж многоэтажного дома. Витрины во всю высоту помещения. Внутри достаточно просторные залы, разделённые колоннами.
Это случаем не тот, который в последствии стал "Микроникой"?


26 Oct 2018 06:12
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
jdigreze wrote:
Shaos wrote:
Фирменный магазин "Электроника", тогда ещё в Ленинграде, представляет из себя первый этаж многоэтажного дома. Витрины во всю высоту помещения. Внутри достаточно просторные залы, разделённые колоннами.
Это случаем не тот, который в последствии стал "Микроникой"?


Нет - Электроника была на Гагарина, http://www.citywalls.ru/house29689.html ... sjluuvofe6

В 1988 я в ней еще детали для 86РК с рук покупал, ВГ75 стоил 25 рублей. Так и не заработал тогда...


26 Oct 2018 07:19
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
На "вики" ,кстати, есть картинка более раннего варианта с названием "Львiв" :

 Львiв
Attachment:
lviv.jpg
lviv.jpg [ 315.75 KiB | Viewed 2918 times ]


( экземпляр о.к.б. Л.п.и. )

upd. : Вот наискал ещё вариант :

Attachment:
lvov3.jpg
lvov3.jpg [ 21.58 KiB | Viewed 2918 times ]


30 Oct 2018 09:14
Profile
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
Shaos wrote:
Воспоминания зрителя демонстрации девайсов в московском магазине Электроника в конце 80-х:


Бывал там ребенком пару раз. Если бы возростом был бы поменьше. Заревел бы и сказал Папе - КУПИ!

П.С. Чутка подправил реплику, админ сам грешен.

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


30 Oct 2018 10:01
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Случайно нашлось кем-то сохранённое видео от vinxru про починку ПК-01 Львов:


https://www.youtube.com/watch?v=3DmZyyy5ukE

_________________
:dj: https://mastodon.social/@Shaos


13 Sep 2023 22:25
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 28 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.