PC-01 Lviv
http://pc01.lviv.ua/forum/

Описание Chameleon DOS
http://pc01.lviv.ua/forum/viewtopic.php?f=14&t=172
Page 1 of 1

Author:  liberation [ 26 Jul 2012, 22:08 ]
Post subject:  Описание Chameleon DOS

Предуведомление.
Данный материал был подготовлен на основе материалов, которые удалось обнаружить на дисках Д. Казимирова, и публикации в бюллетене "Файл" бр. Данюков. При этом материал был подвергнуть незначительной коррекции, дабы устранить наиболее вопиющие поругания грамматики и орфографии. :D

CHAMELEON DOS version 5.5

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

1. Отдает пользователю все ОЗУ, кроме 295 байт системного ОЗУ;
2. Сама ДОС распологается в ПЗУ по адресам С000-С7FFH;
3. Ha диске находится только каталог и программы пользователя;
4. Каталог может содержать до 135 файлов;
5. 165 дорожка диска зарезервирована для копии каталога.

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

CHAMELEON DOS 5.5
(C)MASKSOFT&144КБ.

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

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

А:>

Ниже приведены внутренние команды 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. N: - переход на другой диск, где N - логическое имя диска (А, B, C, D).

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

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

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

Ниже приведены подпрограммы и формат обращения к ним:
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 - конец каталога,
А = 02 - в каталоге нет места,
А = 01 - файл найден, по адресу BE1F-BE2F расположены атрибуты файла.

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.

C60F HL=HL-BC (вычитание).

C708 Чтение с диска CP/M36 с последующим запуском.

C7D0 Этой подпрограммой подменяют п/п DD31 (вывода на ленту), посредством ее программы будут выносится не на ленту, а на диск.
Входные параметры:
BEA4 - нач.адрес,
BEA6 - кон.адрес,
BE8C - имя файла(6 символов).
Как видите, параметры такие же, что и для DD31. Выносимые файлы получают расширение СОМ.

C7CD Этой подпрограммой подменяют п/п DD94 (чтение с ленты).
Входные параметры:
BE8C - см.выше.

C7B8 Подпрограмма ЕRA. Ввод как в командном режиме. После завершения п/п переходит по адресу BFE8.
C7BB Подпрограмма REN. Ввод как в командном режиме. Выход как и в ЕRA.
C7BE Подпрограмма TYPE. Ввод как в командном режиме. Выход как и в ERA.
C7C0 Подпрограмма SAVE. Ввoд как в командном режиме. Выход как и в ЕRA.

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

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

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

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

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

*ERROR I/O* - выдается при чтении и записи на диск, например:
1. Чтение сектора с ошибкой (перед выдачей ДОС пытается считать сектор 32 раза),
2. Не найден требуемый сектор или дорожка,
3. Диск защишен от записи (наклейка),
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 дорожок (82);
5. Нулевая дорожка: на ней хранится имя диска, информация о диске, каталог диска;
6. С 1-ой по 164-ю дорожки размещаются файлы пользователя;
5. 165 дорожка может быть использована для копии каталога диска, это должна делать программа пользователя.

Информация о порте 0Е4Н.

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

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

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

P.S.
Сейчас под CHAMELEON DOS адаптированы все игровые и системные программы, например: Samara, Picaso, ASS-91.

UPD.
Дополнительная информация о версии 7.7, которая предназначалась для ПК-02 "Львов" с процессором Z80. Ее главное отличие заключалось в том, что корректно поддерживалась двойная плотность записи MFM, что позволило разместить на одной дорожке не 9-ть, а 16-ть секторов, которые нумеровались с 1h по 10h (1-16), нулевой сектор по-прежнему отсутствовал. Более никаких отличий эта версия в себе не несла.

2UPD.
Любознательный b2m установил значение еще двух недокументированных байт 0xBFB8 и 0xBFB9:
Quote:
Есть ощущение, что этот байт (0xBFB9) отвечает за плотность записи - 9/16 секторов на дорожке. Однако запись туда производится после чтения, к тому-же производятся какие-то действия с дисководом. Похоже на детект FM/MFM. И он у меня не срабатывает.

Скорее всего производится попытка чтения либо FM, либо MFM (в зависимости от байта), и если есть ошибка чтения - переключается на другой формат. А у меня ошибка чтения никогда не выдаётся.

А если количество секторов на дорожке - 9, то сектора 10-16 пропускаются. Поэтому программы не работают.

Кстати, по адресу 0BFB8h записывается как раз число секторов на дорожке (после детекта).
Послесловие.
Скачать образ ПЗУ с Chameleon DOS 7.7 из файлового хранилища. Обсуждение его работы можно найти тут.

Author:  kapitan [ 01 Sep 2014, 08:34 ]
Post subject:  Re: Описание Chameleon DOS

Могу добавить, что порты ВГ93 Е0 - Е3

Author:  kapitan [ 19 Sep 2014, 03:35 ]
Post subject:  Re: Описание Chameleon DOS

поправка: на диске 83 дорожки, а не 82
и под CP/M36 тоже 83
--
в Хамелеоне 7 работает забой
--

Lviv PK-01 Chameleon DOS and CP/M36
* note PK-01 is unable to WRITE MFM disks due to CPU constraints
it READS MFM OK

MFM, 300rpm, 250000 bps
IBM ISO 2 sides, 83 tracks, 16 sectors per track, 256 bytes per sector
679 936 formatted capacity

and

FM, 300rpm, 250000 bps
IBM ISO 2 sides, 83 tracks, 9 sectors per track, 256 bytes per sector
382 464 formatted capacity

sector order 1,2,3 ...

Track header:
0x4e x 80 - GAP1
0x00 x 12 - sync
0xC2 x 3 - desync
0xFC - marker
0x4e x 65 - GAP

Sector header::
0x00 x 12 - sync
0xa1 x 3 - desync
0xfe - IDAM marker
tt - track number (starting #0)
sd - side
sc - sector number (starting #1)
0x01 - 256 bytes per sector
cc x 2 - CRC
0x4e x 22 - GAP2

Sector Data:
0x00 x 12 - sync
0xa1 x 3 - desync
0xfb - DATA AM marker
dd x 256 - data
cc x 2 - CRC
0x4e x 70 - GAP3

0x4e x 141 - GAP4

6510 bytes total

unformated MFM track at 300RPM = 6250 bytes
extra 40 bytes may be at GAP1 or GAP4

For FM and MFM disks
catalog location: Side 0 Track 0 Sectors 1-9

Sector 1: 17 bytes disk attributes + 14 x 17 bytes file records + 1 byte = 0x00 padding to 256 bytes
Sector 2-9: 15 x 17 bytes file records + 1 byte = 0x00 padding to 256 bytes
Therefore maximum number of files: 134

Disk attr in catalog - 17 bytes
- 11 bytes disk name
- 1 byte first free sector
- 1 byte first free track
- 1 byte unknown
- 1 byte hidden DIR flag
- 1 byte write protection
- 1 byte not used, just padding to 17 bytes

File entry in catalog - 17 bytes
- 8 bytes file name (if first byte = 0x01 then file is marked as deleted)
- 3 bytes file extention
- 1 byte file status: 0x00 Normal, 0x01 Protected, 0x02 Protected and Hidden;
- 1 byte file location sector
- 1 byte file location track
- 2 bytes RAM loading address = start address (for BAS files: file length in bytes)
- 1 byte file length in sectors of 256 bytes

Author:  kapitan [ 22 Sep 2014, 00:48 ]
Post subject:  Re: Описание Chameleon DOS

Провел эксперименты с каталогом: действительно для обоих типов дисков (FM & MFM) каталог сидит
в первых 9 секторах => макс кол-во файлов 134 в обоих случаях.
После форматирования MFM диска певый своботный сектор,дорожка = 01,01
т.е. 7 секторов гуляют. простой перебивкой на 0x0A,0 можно получить еще 1792 байт места на MFM диске.
Толку никакого, просто интересно :-)

Author:  kapitan [ 22 Sep 2014, 04:27 ]
Post subject:  Re: Описание Chameleon DOS

Quote:
C7CD Этой подпрограммой подменяют п/п DD94 (чтение с ленты).
Входные параметры:
BE8C - см.выше.
К имени полученному на входе (6 символов) добавляется два пробела и расширение COM

Author:  kapitan [ 22 Sep 2014, 22:00 ]
Post subject:  Re: Описание Chameleon DOS

доплнение
C1BA Чтение атрибутов диска по адресу BED0-BEDF.
BEDE - полностью скрыть каталог
но диск работает как обычно если знать имена файлов
----
BFB7 Текущий дисковод
BFB8 количество секторов на дорожке 9 или 16 (выше адрес ячейки указан неправильно)

Author:  kapitan [ 22 Sep 2014, 23:05 ]
Post subject:  Re: Описание Chameleon DOS

Попала ко мне в руки игра Дракула в виде teledisk образа диска.
HxC софт понимает TD0 формат, поэтому все было просто переброшено на эмулятор дисковода и сразу заработало на живом львове.

Но вот, что интересно:
- игра стартует автоматом после сброса
- если поставить другой диск и выйти на командную строку хамелеона,
а потом поставить дракулу и сказать DIR, то каталога неувидим и игра снова стартует автоматом
- просмотр кода первого сектора показал, что там мусор и совсем непохоже на хамелеоновский каталог.
- копировть диск неполучается

Это было все очень интересно и заставило потратить пару часов на дизассемблирование хамелеона :-)

Вот как это работает.
Сам диск интересно размечен. Установить структуру очень просто: берем HxC софт, загружаем TD0 и сохраняем как XML.

Вот небольшая выдержка:
Code:
<number_of_track>83</number_of_track>

<number_of_side>2</number_of_side>

<format>IBM_FM</format>

<start_sector_id>1</start_sector_id>

<sector_per_track>3</sector_per_track>

<sector_size>1024</sector_size>

<formatvalue>0</formatvalue>

<gap3>255</gap3>

<bitrate>250000</bitrate>

<pregap>0</pregap>

-<sector sector_size="1024" sector_id="1">

-<sector sector_size="1024" sector_id="16">

-<sector sector_size="128" sector_id="19">
<data_fill>0x00</data_fill> 
т.е. по 3 сектора на дорожке
номера секторов 1, 16, 19
размеры секторов 1024, 1024, 128
сектор 128 байт всегда заполнен нулями, два других неcут информацию.

Хамелеон пытается прочесть первый сектор каталога в буфер 0xBD00
ВГ93 читает сектор целиком, все 1024 байта.
Получается buffer overflow attack :-)
Начало стека известно из листинга хамелеона 0xBE80
0xBE80-0xBD00 = 0x180

вычислять положение указателя на момент чтения сектора совсем необязательно, можно просто пробить стек нужным адресом на некоторую глубину. В Дракуле 16 раз повторяется адрес 0xBD00

Вот такие люди в стране советской были! :-)

Author:  Zelya [ 05 Apr 2016, 11:53 ]
Post subject:  Re: Описание Chameleon DOS

Quote:
Sector Data:
0x00 x 12 - sync
0xa1 x 3 - desync
0xfb - DATA AM marker
dd x 256 - data
cc x 2 - CRC
0x4e x 70 - GAP3
У меня, почему-то GAP3 - 54 байта.
Дракулу не выложите? :)

Page 1 of 1 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/