(c) 2000 d40/d80.mdos info by pol/pht <jurica@sknet.sk>
(c) 2000 mb02.bs-dos info by laesq/ra <laesq@ethree.demon.co.uk>
(c) 2000 imported by faster/tnl+pht <faster@hotbox.ru>
(c) translated by alff/cpu
(c) corrected by elf/cpu

here's the file u wanted :)
have fun
laesq/raww arse

jo! как-то давно я просматривал/прочитывал se#3 и наткнулся на статью macbuster'а, где он сетовал на то, что west хает "russian" tr-dos и не дает доку на свои дисковые системы... мне все это показалось давольно-таки забывным, поскольку спросить разве нельзя было? например, когда мне понадобилась документация на d40/d80 и mb02, мне ее сразу же прислали, за что огромное спасибо pol/pht.sk и laesq/ra.uk соответственно! что же касается обхаивания tr-dos'a в плане программирования на низком уровне, то я абсолютно солидарен с macbuster'ом, поскольку здесь tr-dos рулит без базара! ну а вообще, если брать в сравнении эти три дисковые системы, то, безусловно, 1-е место держит mb02 - rulez foreva!!! если вы хоть немного разбираетесь в дисковых системах, вы поймете почему... скажу, что я так последний раз протащился только когда ознакомился с документацией на z380!

уже более года назад я сделал ответный шаг и послал pol'у в словакию книжку-малышку ;-) по tr-dos:

----------------------------------------
from: "pol" <jurica@sknet.sk>
organization: phantasy
to: alexander yudin <fas7er@yahoo.com>
date: wed, 13 sep 2000 21:58:21 +0200
subject: trdos manual


hello faster!


big thanks for manual for trdos! it's great piece of spectrum literature and it's curiosity for us! i'll scan cover and send to my friends in uk where trdos originated. once again - thank you!
pol/pht.sk

----------------------------------------

судя по всему, на западе уже должны были поиметь english version of trdos manual. поэтому настала ваша очередь знакомиться с ихними дисковыми системами. если возникнут какие-либо вопросы, то можете обращаться на контактные адреса! напоследок хотелось бы отметить, что mb02 - самая (???) распространенная дисковая система, которой пользуются от uk до portugal и slovakia... а d40/d80 используют в основном в чехии/словакии - (типа как у нас tr-dos :). например в польше это fdd3000, ну и тд.


have a good luck!
p.s. dos'em all! dos'em up! dos'em fuck!
09.10.01


from: "pol" <jurica@sknet.sk>
to: fas7er@yahoo.com
date: tue, 1 aug 2000 19:03:10 +0200
subject: bios for mdos


bios для mdos
описание подпрограмм

bios для mdos это программа длиной 1024 байта, которая может быть использована в программах для легкой работы с диском. весь код является релоцируемым.
вызов операций:

 а - номер функции, другие регистры по описанию.

операция 0 - запись

запись участка памяти на диск.

обрабатываются ошибки:

drive not ready (дисковод не готов)
disk full (на диске нет места)
directory full (каталог полон)
corrupted fat structure (нарушение в структуре fat'а)
bad device type (неправильный тип устройства)
disk write protect... (включена защита от записи)

необрабатываемые ошибки:

crc error (ошибка crc)
sector not found... (сектор не найден)

на входе:

hl - file identification (описатель файла)
de - start of memory block to save
     (начало записываемого блока)
bc - length (длина)

на выходе:
a=0 and z=1 - no error (ошибки не было)
a<>0 and z=0 - error (произошла ошибка)
hl - address of error message (in bios file)
адрес сообщения об ошибке (в файле bios'а)

операция 1 - загрузка

загрузка файла в память.

обрабатываются ошибки:

drive not ready (дисковод не готов)
bad device type (неправильный тип устройства)
file too long... (файл слишком длинный)

не обрабатываются ошибки:

corrupted fat structure (нарушена структура fat'а)
crc error (ошибка crc)
sector not found... (сектор не найден)

в регистр bc можно задать максимально возможную длину файла.
я не знаю как это работает, но если туда занести -1, то все
файлы будут загружаться наверняка.

на входе:

hl - file identification (описатель файла)
de - where to load (куда грузить)
bc - length (длина)

на выходе:

a=0 and z=1 - no error (нет ошибки)
a<>0 and z=0 - error (ошибка)
hl - address of error message (in bios file)
     адрес сообщения об ошибке (в файле bios'а)


операция 2 - удаление

удаление файла(ов). можно использовать символы с любыми кодами в имени.

обрабатываются ошибки:

drive not ready (дисковод не готов)
bad device type (неправильный тип устройства)
disk write protect... (диск защищен от записи)
file not found... (файл не найден)

не обрабатываются ошибки:

crc error (ошибка crc)
sector not found... (сектор не найден)
corrupted fat structure (нарушена структура fat'а)

на входе:

hl - file identification (описатель файла)

на выходе:

a=0 and z=1 - no error (нет ошибки)
a<>0 and z=0 - error (ошибка)
hl - address of error message (in bios file)
адрес сообщения об ошибке (в файле bios'а)

операция 3 - каталог

file not found (a=27).

это  выборочный  каталог. это значит, что
если вы вызвали эту операцию, то получите
имя файла. вы можете определять типы фай-
лов  в  каталоге (*.b, file??.*). если не
найдено ни одного файла, то будет возвра-
щена ошибка - файл не найден (а=27).

на входе:

hl  - file identification (описатель фай-
ла).

на выходе:

a=0 and z=1 - file found (файл найден)
a<>0 and z=0 - error - no other files in directory
(ошибка, нет файлов в каталоге)
hl - address of error message (in bios file)
     адрес сообщения об ошибке (в файле bios'а)

операция 4 - load1st

загрузить  первый  сектор из файла. можно
использовать для идентификации файла.

на входе:

hl - file identification (описатель файла)
de - where to load (куда грузить)


на выходе:

a=0 and z=1 - no error (нет ошибки)
a<>0 and z=0 - error (ошибка)
hl - address of error message (in bios file)
адрес сообщения об ошибке (в файле bios'а)


операция 22 - vers
на выходе:
hl - address of version name (адрес номера версии) я полагаю, что этих операций достаточно для записи/загрузки или просмотра каталога. если вы думаете, что это не слишком полезно для вас, то просто пришлите описание параметров загрузки/записи в alasm, и я сделаю подпрограммы для mdos. я полагаю, это наилучшее решение.
file identification: (описатель файла) это строка содержащяя номер дисковода, имя файла и расширение. file defb "a: filename. b"
ну, я думаю это все. да вот еще одно, я предпочел бы, если вы мне прислали входные данные для процедур чтения/записи, и я постарался бы сделать процедуры ввода/вывода, и тогда мы могли бы обсудить эту тему. и постарайтесь делать системы чтения/записи, ориентированые на файлы, а не на чтение/запись сектора.

описание работы с дисководом в дисковой системе mdos

mdos была получена из sindos, так что если вы найдете здесь что-либо знакомое, то это естественно. каждый сектор имеет длину 512 байт.
mdos использует два стандартных формата:
40x9 for 5.25" disks
80x9 for 3.5" disks

скорость загрузки примерно 24 кб/сек, скорость записи немного меньше. существует 2 версии: 1.0 и 2.0. потому как мы используем стандартные точки входа, проблем с совместимостью быть не должно. системное пзу подключается с помощью команды rst 0 (или jp 0, или ld hl, 0: push hl (0): ret, и т.д.). перед тем как сделать это, надо занести число 79 в ячейку памяти 16119 (#247 в basic с mdos). это дисковое теневое озу. смотри bios для mdos, там есть процедура на ассемблере, которая переключает пзу. mdos может использовать 2 дисковода (в любой комбинации).

как переключать пзу:

tab   defw  0
      defw  #3ef7
start ld    a,#4f
      ld    de,tab-26
      call  #25ab
      ld    hl,0
      ld    (tab),hl
      ld    hl,#3ef7
      ld    (tab+2),hl
      rst   0
      ...
включаем дисковое пзу. после jp 5888 в пзу basic'a вернется.
sector 0 - boot

смещение  длина    содержание           описание
!128      4     информация о диске  инфо о формате диска
                                     (tracks/sects/sides)
 177      4     информация о диске  инфо о формате диска
                                     (tracks/sects/sides)
!181      4     информация о диске  инфо о формате диска
                                     (tracks/sects/sides)
 192      10    имя диска (10 сим.) имя диска созданое с
                                     помощью format
 202      2      случайное число    идентификационный номер,
                     (1-65536)      созданный с помощью format
 204      4       строка "sdos"     используется mdos для
                                        идентификации

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

177 - установлен  4 бит, если диск двухсторонний
    - установлен  3 бит, если диск форматировался на d40
178 - треков на одной стороне
179 - секторов на треке
180 - ноль

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

sector 1-5 - fat

это обычный 12-битный fat (да-да fat12 на pc). это место нас особо не интересует, mdos в курсе как работать с ним.

sector 6-13 - dir

каждый файл занимает в каталоге 32байта. (mdos не имеет подкаталогов.) например:

 
байт        описание
----        --------
0       расширение (ascii код: p, c, n, b, s, q)
1-10    имя файла, имена короче 10 символов дополняются до 10
        нулями.
11,12   длина дайла
13,14   стартовый адрес,стартовая строчка для basic прог. (.p)
15,16   не используется (кроме длины basic без переменных)
17,18   номер первого сектора (входная точка в fat)
19      ноль
20      флаги (каждый бит один из таких: hsparwed)
21      еще один байт длины (для файлов типа sequence)
22-31   заполнено числом 229

как вы можете видеть, возможно написать систему, которая будет использовать более 10 символов для имени файла, и все останется совместимо с старой mdos (хе-хе, m$ sux: ) используемые расширения:

p - programm (basic)
c - character array
n - numeric array
b - bytes
s - snapshot
q - sequence

 флаги:

bit 7 - скрытый (не виден в каталоге)
bit 6 - системный
bit 5 - защищен (not implemented) (не используется)
bit 4 - архивный (not implemented) (--//--)
bit 3 - только для чтения (файл можно читать:)
bit 2 - записываемый (в файл можно записывать)
bit 1 - исполняемый
bit 0 - стираемый (можно его стреть, при надобности)

sector 14-???

сектор данных, смотри информацию о формате выше.

from: "laesq" 
to: fas7er@yahoo.com
date: sat, 9 sep 2000 12:00:03 +0100
subject: mb02 manual

mb-02 техническое описание

 содержание:

  1. rom bios
  2. fdc bios
  3. bs-dos операторы
  4. особенности дискового формата

 (c)   busy soft, index 20000531171000

rom-bios

rom-bios переключает банки озу и запрещает запись в банки памяти mb-02. это позволяет вызывать программу между банками озу, без использования памяти выше #4000.

обзор

  call #3c98 ... переключение на банк rom, запись невозможна
                 (работает в обоих банках)
  call #3c9a ... переключение на банк dos, запись невозможна
                 (работает в обоих банках)
  call #3c9c ... включение банка rom, запись возможна
                 (работает в обоих банках)
  call #3c9e ... включаем dos банк, запись возможна
                 (работает в обоих банках)
  call #3ca0 ... вызов из одного банка процедур другого
                 (работает в обоих банках)
  call #3ca2 ... установить магнитофон как текущее устройство
                 (работает только в банке пзу)
  call #3ca4 ... установить дисковод как текущее устройство
                 (работает только в банке пзу)

подробное описание процедур

процедуры переключения банков: #3c98, #3c9a, #3c9c, #3c9e. эти процедуры работают в обоих банках памяти - rom и dos. настоятельно рекомендуется не использовать комманду out для переключения банков памяти, потому что адреса и данные переключения портов зависят от версии mb-02. межбанковый вызов: call #3ca0 используйте это таким образом: программа запущена в банке dos и ей необходимо вызвать какуюлибо процедуру (например #22аа для расчета координат) из банка rom. это делается так:

 program:
    ...
    call #3ca0
    dw #22aa
    ...

таким же образом можно действовать, если включен банк rom, и программе надо вызвать процедуру из банка dos.

после того как вызываемая процедура завершила свою работу, программ продолжит работу в своем банке. процедура по адресу #3ca0 не изменяет ни регистров ни флагов и использует всего 8 байт на стеке. sp должен быть выше #4008.

в банке dos для перехода на адрес #3ca0 можно использовать rst #28, таким образом программа работающая с банком dos и вызывающая процедуры в банке rom, может делать это так:

    ...
    rst #28
    dw #22aa
    ...

переопределение rom load-save процедур между лентой и диском: call #3ca2, call #3ca4.

rom load-save процедуры (точки входа #4c6 и #562) могут работать с классическим магнитофоном класическим путем, или могут работать с дисководом. какое устройсто будет использоваться, определяется с помощью этих двух процедур. это точный эквивалент команды '@': нулевой параметр означает то, что load/save команды перенаправлены на работу с лентой, и не нулевой означает работу с диском.

fdc-bios

вся работа с fdc контроллером происходит с помощью fdc-bios. процессор не загружен работой, занимающей много времени, он может охлаждаться или выполнять программы на im2 прерываниях пока происходит работа дисковых операций.

если вы выполненяете какие-либо процедуры на im2, то они не должны делать следующих вещей: - использовать или изменять какие-либо установки fdc и dma контроллеров; - использовать или изменять какие-либо установки fdc и dma контроллеров;


- содержать циклов, занимающих много времени (потому как dma подтормаживает процессор);
- работать дольше 5-10 мс (но это не так важно);
- переключать mb-02 банки памяти;
- и, конечно, все регистры должны быть сохранены, а потом восстановлены.

все операторы fdc-bios доступны с помощью rst #18 в dos банке. регистр a должен содержать номер операции. другие регистры содержат необходимую информацию для данной операции.

    обзор

    #00: reset ..... сброс fdc контроллера
    #01: status .... чтение информации о состоянии
    #02: restore ... передвинуть головку на трек 0
    #03: seek ...... передвинуть головку на трек n
    #04: rdsec ..... прочитать сектор
    #05: wrsec ..... записать сектор
    #06: rdtrk ..... читать трек (прямое чтение)
    #07: wrtrk ..... форматировать трек
    #08: rdadd ..... прочитать идентификатор сектора
    #09: rezim ..... установить плотность
    #0c: aktive .... включить дисковод n
    #0d: pasive .... выключить все дисководы
    #0e: info ...... получить информацию о дисководе
    #0f: setmax .... установить максимальную длину для обмена данными.
    #10: setmlt .... установить процедуру многозадачности
    #11: setoff .... установить режим отключения мотора

подробное описание операций

номер операции: мнемотехническое имя операции

i: регистр = значение [параметры на входе]
o: регистр = значение [параметр на выходе]

...описание операций...

#00: reset о: а=статус
сброс fdc контроллера. неплохо бы использовать перед работой с fdc bios в начале приложения.

#01: status о: а=статус
возвращает текущий статус, формат описан ниже.

#02: restore о: а=статус
двигает головку на трек 0.

#03: seek i: d=трек o: а=статус
двигает головку на трек, указаный в регистре d.

#04: rdsec i: de=физический номер сектора, hl=адрес o: а=статус
чтение сектора (номер в de) в память с диска адрес в hl.

#05: wrsec i: de=номер физического сектора, hl=адрес o: a=статус
запись участка памяти на диск, в de сектор для записи и в hl адрес участка памяти. перед выполнением операций rdsec или wrsec не надо вызывать оператор seek, т.к. если надо wrsec или rdsec все сделают автоматически.

#06: rdtrk i: d=трек, 7 бит регистра e=сторона, hl=адрес o: а=статус
чтение целого трека в память по адресу в hl. этот оператор читает и межсекторную информацию тоже, crc коды секторов не проходят. этот оператор не подходит для чтения информации с секторов.

#07: wrtrk i: d=трек, 7 бит регистра e=сторона, hl=адрес o: а=статус
форматирование трека. в hl начало последовательности для используемого контроллера (обычно wd2797)

#08: rdadd i: d=трек, 7 бит регистра е=сторона, hl=адрес o: а=статус
чтение идентификатора сектора. читает в память 4 байта: номер трека, сторона, номер сектора и длина сектора. для более подробной информации смотри описание к wd2797. нет необходимости вызывать оператор seek перед операциями #04-#08. если это необходимо, то seek (поиск) будет произведен автоматически.

#09: rezim i: e=0 для dd, 1 для hd, 2 для ed o: z=все нормально, nz=ошибка
установка плотности текущего дисковода. если дисковод не поддерживает данную плотность, то происходит nz.

#0c: aktive i: e=номер дисковода о: а=результат
включить дисковод е и выключить все остальные дисководы (если надо). результаты могут быть следующими:

0 ... неизвестный диск ... дисковод отсутствует
1 ... диск не готов ....  в дисковод не вставлена дискета
2 ... диск активизирован ... успешно, дискета не изменялась
3 ... диск активизирован ... успешно, возможно дискета изменялась

если а=0 или 1, то ни один дисковод не будет активен.

#0d: pasive i: e=номер дисковода
выключить дисковод.

#0e: info i: e=номер дисковода o: de=информация о дисководе
этот оператор возвращает такую информацию:

d = номер треков
e = поддерживаемая плотность

бит 0 = 1 ... dd
бит 1 = 1 ... hd
бит 2 = 1 ... ed

если дисковод отсутствует, de будет содержать 0.

#0f: setmax i: bc=максимальная длина перемещаемых данных
этот оператор устанавливает максимальное количество байт для dma операций. не очень важен для программ пользователя.

#10: setmlt i: hl=адрес процедуры многозадачности (или 0, если в такой процедуре нет необходимости)
пока dma оперирует данными между памятью и fdc контроллером, другая процедура может работать. hl содержит адрес процедуры, вызываемой перед началом работы dma с данными. dma используется в операциих rdsec и wrsec. если вы хотите выполнять какие-либо процедуры во время чтения или записи сектора, тогда данная процедура не должна делать следующее (тоже что и при im2):
- использовать или изменять какие-либо установки fdc или dma контроллеров;
- содержать циклов, занимающих много времени (потому как dma подтормаживает процессор);
- работать дольше 5-10 мс (но это не так важно);
- переключать mb-02 банки памяти как угодно, т.е. никак.
процедура может изменять любые регистры и должна заканчиваться ret.

#11: setoff i: e=включить режим отключения мотора
если е=0, тогда pasive отключит весь дисковод (доступность и мотор).
если е=255, тогда pasive отключит только доступность дисковода. в этом случае, мотор продолжит вращаться. это полезно, если вы хотите обратиться к двум дисководам в короткий промежуток времени, тогда вам не придется ждать включения мотора дисковода.

описание физических номеров секторов:

биты 0-7 регистра d ... трек
бит    7 регистра е ... сторона (головка)
бит  0-6 регистра е ... номер сектора на треке d

описание статусного байта:
если ситуация произошла, то бит будет установлен.

бит  имя события       возможная ситуация         оператор

0.время вышло....оператор слишком долго работал.#04-#05
1.диск не готов.......... нет диска в дисководе.#04-#08
2.потеряна информация.. ....ошибка в работе dma.#04-#08
2.трек 0 ....................головка на 0 треке.#00-#03
3.ошибка crc .................ошибка при чтении.#04
4.записи нет ............диск не отформатирован.#04,#05,#08
4.ошибка поиска..drive не имеет 0-го трека (?!).#02
5.прерывание ........во время работы нажаты q+w.#02
6.защита от записи.......диск защищен от записи.#0-#03,#05,#07
7.не готов ........невозможно включить дисковод.#04-#08

формат диска

сектор boot

	физический номер: трек 0, сторона 0, сектор 1.
	логический номер: 0.
	этот сектор содержит:

	#00-#01 ... переход на системный загрузчик (#18, #7e)
	#02 ....... не используется, обычно #80
	#03 ....... байт #02 (mb-02 маркировка)
	#04-#05 ... количество треков на диске (обычно 80)
	#06-#07 ... количество секторов на треке
	#08-#09 ... сторон на диске (обычно 2)
	#0a-#0b ... количество секторов на кластере (обычно 1)
	#0c-#0d ... логический номер dirs сектора
	#0e-#0f ... количество fat секторов fat (oбычно 1 to 4)
	#10-#11 ... длина fat (#400 * на кол-ов fat секторов)
	#12-#13 ... логический номер первого сектора первого fat
	#14-#16 ... логический номер первого сектора второго fat
	#20 ....... байт #00 (mb-02 маркировка)
	#21-#24 ... дата и время форматирования диска
	#25 ....... byte #00 (mb-02 маркировка)
	#26-#2f ... имя диска
	#30-#3f ... расширение имени диска

 mb-02 маркировки определяют, это ли mb-02 диск.
dirs сектор
 этот сектор содержит 256 элементов, каждый элемент состоит из 4 следующих байт:

	#00 ....... идентификатор
#80 = существующий элемент
для расширеного каталога
другое = каталога нет (обычно #00)
	#01 ....... xor имен каталога (для быстрого поиска)
	#02, #03 ... логический номер первого сектора каталога
 (только биты 0-13)


	subs сектор (сектор каталогов)
 он содержит элементы по 32 байта:

  #00 ....... идентификатор
              #90 = файл содержит только заголовок
              #a0 = файл содержит только данные
                    (без заголовка)
              #b0 = файл содержит и заголовок и данные
              #80 = файл не содержит ни данных ни заголовка
              (встречается не очень часто)
              другие значения означают неправильный элемент
              каталога.
  #01-#04 ... дата и имя файла
  #05-#15 ... классический 17байтный заголовок для магнитофона
  #16-#17 ... добавочный адрес блока данных
  #18-#1b ... длина блока данных
              (#18=младший, #1b=старший байт)
  #1c ....... флаги для блока данных
  #1d ....... атрибуты файла
  #1e-#1f ... номер первого сектора файла

нулевой элемент каталога не содержит фай-
ла, но имеет специальное значение:

  #00 ....... идентификатор (обычно #80)
  #01-#04 ... дата и время файла
  #05 ....... номер верхнего каталога в структуре дерева
              (да и не только в нем!)
  #06-#0f ... имя каталога (команда $"name" ищет именно его)
  #10-#1f ... расширение имени каталога

        file alocation table (fat)

fat содержит 16битные элементы, каждый из
которых описывает один сектор на диске.

 бит 15: 0 ... свободно
         1 ... не свободно (занато или "пробито")
     14: 0 ... последний сектор файла
         1 ... не последний сектор файла
   0-13: [бит 14=0] ... количество байтов до конца файла в
                        этом последнем секторе
         [bit14=1] ... логический номер следующего
                       сектора файла

если  сарший байт (биты 8-15) установлены
в  #ff,  это значит что значение младшего
байта (биты 0-7) различны:

   #00 ... специальный сектор (boot, system, back-up)
   #f? ... неиспользуемый сектор:
       #fc - ошибка [форматер обнаружил crc ошибку]
       #fd - ошибка [форматер обнаружил запись не найдена]
       #fe - сектор не существует
             (2ая сторона одностороннего диска)
       #ff - сектор не существует
             (конец физической области диска)