«Рабовладение» в iS-DOS на Sinclair — Abzac


PeriodicalsAbzac2005 No. 23 → «Рабовладение» в iS-DOS на Sinclair

«Рабовладение» в iS-DOS на Sinclair

Как известно, спецификация IDE (Integrated Drive Electronics) для интерфейса ATA (AT Attachment) предусматривает подключение и последующую совместную работу двух устройств с интегрированным IDE-контроллером. А рaсширенная спецификация E-IDE (Enhanced IDE) допускает совместное функционирование до четырех IDE-устройств. Но четыре IDE-устройства для Sinclair-совместимой машины, - как правило, ненужная жлобская роскошь. А вот для двух устройств, -винчестера и CD-привода или двух винчестеров, - вполне могут найтись целесообразные и оправданные применения.

Реальный, проработанный и программно поддержанный вариант использования двух винчестеров IDE в одной упряжке предоставляет для пользователей Операционная Система iS-DOS. Причем достигается это использование через абсолютно стандартный контроллер IDE-Drive разработки (c)Nemo, без каких-либо переделок или доработок. По большому счету, контроллер лишь предоставляет возможность обмена данными с IDE-устройством. А на одном шлейфе могут быть одновременно подключены и работать два IDE-устройства. И если оба эти устройства - винчестеры, то все аппаратные изменения сводятся к правильной установке перемычек-»джамперов» (Jumper), которые задают логику работы накопителей. Один винчестер должен быть выставлен перемычками на нем как «Master», а другой, естественно, как «Slave» («раб»). Как правило, положение перемычек должно быть указано для каждого режима на наклейке, на корпусе винчестера. Хотя это и необязательно в старых моделях. Встречались, например, винчестеры Seagate, у которых вообще ничего не указано на наклейке. В таких случаях приходится подбирать положение перемычек экспериментальным путем. Хорошо, если там всего лишь одна перемычка, а если две или три - тогда их надо комбинировать. Но особых проблем быть, по идее, не должно. Единственная проблема, которая может встретиться -это если неверно выставить один из винчестеров перемычками, - тогда он будет конфликтовать со вторым и в итоге откажутся работать оба.

Таким образом, вопрос только в программной поддержке. Второй винчестер выбирается именно программно. Среди регистров винчестера, доступных для программирования через IDE-контроллер, есть так называемый SDH-регистр. Изменяя маску, накладываемую на содержимое этого регистра, можно менять IDE-устройство, к которому будет происходить обращение через IDE-контроллер. Используя нужную маску SDH-регистра, можно переделать iS-DOS’ный драйвер винчестера таким образом, что этот драйвер станет работать со «slave»-накопителем. Так что, при необходимости, можно установить два винчестера и работать с ними, - с каждым через свой драйвер. Это может найти применение, скажем, для быстрого копирования с одного винчестера на другой. Или на постоянной основе - для использования второго накопителя в качестве архивного, для хранения нужной, но редко используемой информации. Необходимо уточнить, что в системе для нормальной работы нужно установить или один винчестер «Master» или два винчестера - «Master» и «Slave». Один винчестер «Slave» работать не станет. Возможно, это такая схемотехничесткая реализация контроллера (c) Nemo, или изначальная особенность спецификации/интерфейса IDE/ATA. Но в любом случае, вряд ли это можно считать серьезной помехой для использования винчестера «Slave» под iS-DOS на Sinclair.

В качестве примера использования маски SDH-регистра для обращения к «Slave»-винчестеру здесь приводится комментированный ассемблерный текст сервисной утилиты, созданной на основе усовершенствованной версии «stanby.com» (см., например, заметку «Тормоз для винчестера» в 16 номере «Абзаца»). Формат исходника - iS-DOS Assembler.

;SB_EXIT.COM
;Программа для торможения одного или двух винтов, выхода в Basic-48, TR-DOS, Монитор «JV KRAMIS» или в главное меню (аналогично нажатию кнопки ).
;Версия 1.73 от 15-го ноября 2004 года.
;
    ORG 24000    ;стартовый адрес
LD0    EQU #D0    ;метки портов 
        ;винчестера
LF0    EQU #F0
LP1    EQU #1FFD    ;метки портов 
        ;страниц RAM
LP7    EQU #7FFD
LPD    EQU #DFFD
    JR BEGIN
    DEFM «UnCo»    ;вектор «униколора»:
    DEFB 2    ;начальные цвета
UC1    DEFB 114    ;меню выхода в TRDOS
UC2    DEFB 1    ;при ассемблировании

BEGIN    LD A,(UC1)    ;цвет меню
    LD (WIND+4),A
    LD C,#8A
    LD A,(UC2)    ;цвет тени меню
    LD (WIND+5),A
    LD C,#8A
    RST 16
    EXX
    DI    ;запрещаем прерывания

FKEYS    LD C,#43    ;ищем ключи
    RST 16
    RET C
    RES 5,A    ;приводим к одному 
        ;регистру
    JP NZ,STDBY    ;если нет - тормозим 
        ;и на выход
    CP «S»    ;ключ «S»?
    JP Z,STDBY    ;стоп-кран
    JP KEYS2    ;смотрим, какие есть 
        ;еще

KEYS1    LD C,#43    ;ищем ключи
    RST 16
    RET C
    RES 5,A    ;приводим к одному 
        ;регистру

KEYS2    CP «R»    ;ключ «R»?
    JP Z,EX_GMN    ;сброс (RESET)
    CP «T»    ;ключ «T»?
    JP Z,EX_TRD    ;выход в TR-DOS
    CP «B»    ;ключ «B»?
    JP Z,EX_BAS    ;выход в BASIC-48
    CP «M»    ;ключ «M»?
    JP Z,EX_MON    ;выход в Монитор 
        ;«JV KRAMIS»
EX_IS    XOR A    ;обнуляем аккумулятор
    LD A,#F4    ;грузим код выхода
    EI    ;разрешаем прерывания
    RET    ;и выходим обратно 
        ;в iSDOS
STDBY    IN A,(LF0)    ;тормозим «винты»,
    RLCA    ;если они есть;
    JP C,STDBY
    LD A,#A0    ;stop «master»
    OUT (LD0),A
    LD A,#E0
    OUT (LF0),A
    LD A,#B0    ;stop «slave»
    OUT (LD0),A
    LD A,#E0
    OUT (LF0),A
    JP KEYS1    ;снова ищем ключи

EX_GMN    LD BC,LP1    ;порт #1FFD Scorpion:
    LD A,0    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD BC,LPD    ;порт #DFFD Profi:
    LD A,0    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD BC,LP7    ;порт #7FFD:
    LD A,0    ;ROM 0 - на место!
    OUT (C),A
    LD HL,0    ;и полный RESET.
    PUSH HL
    JP #0

EX_TRD    LD IX,WIND    ;вектор «окна»
    LD A,2
    LD C,$wt    ;координаты окна
    RST 16
    LD C,$adrwt    ;координаты текста 
        ;в окне
    RST 16
    EI    ;разрешаем прерывания
    LD C,$key    ;опрос клавиш:
    RST 16
    CP #10    ;если 
    JR Z,EX_IS    ;обратно в iSDOS;
    CP #20    ;или  -
    JR Z,EX_IS    ;обратно в iSDOS;
;    JR NZ,RUN    ;любая другая - 
        ;в TR-DOS.
RUN    LD BC,LP1    ;порт #1FFD Scorpion:
    LD A,0    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD BC,LPD    ;порт #DFFD Profi:
    LD A,0    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD HL,0    ;и вылет в TR-DOS.
    PUSH HL
    JP #3D2F

EX_BAS    LD BC,LP1    ;порт #1FFD Scorpion:
    LD A,0    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD BC,LPD    ;порт #DFFD Profi:
    LD A,0    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD HL,0    ;и вылет в BASIC-48.
    PUSH HL
    JP #0

EX_MON    LD BC,LP1    ;порт #1FFD Scorpion:
    LD A,10    ;ROM 0 на место RAM 0!
    OUT (C),A
    LD BC,LP7    ;установка ПЗУ ZX-128
    LD A,0
    OUT (C),A
    LD HL,0    ;и выход в Монитор 
        ;«JV KRAMIS»
    PUSH HL
    JP #0

WIND    DEFB 2,11,5,28
    defb 114,1,4,35 ;параметры окна
    DEFM « or  - Quit»
    DEFB 13,13
    DEFM «»
    DEFM « - Exit to TR-DOS!»
    DEFB 3

;И на этом все! Всем спасибо.
;Alan Karin Riverman, 15.11.2004, 
;понедельник.

Краткое описание sb_exit.com, версия 1.73 от 15.11.2004.

Данная программка тормозит до лучших времен один или два винчестера, если, конечно, они у вас есть (сначала тормозится «master», а за ним «slave»), а также обеспечивает выход, в зависимости от использованных ключей, в главное меню компьютера (аналогично нажатию кнопки RESET), или в TR-DOS, или в BASIC-48, или в монитор «JV KRAMIS» (если, конечно, у вас компьютер KAY или модернизированный SCORPION ZS-256 с двумя ПЗУ) из системы iS-DOS - как Classic, так и Chic.

Программа работоспособна в Chic’е на компьютерах KAY, SCORPION и PROFI, а в Classic’е и на всех остальных.

Срабатывают тормоза и выезд на обочину любым известным в iS-DOS способом: по «горячей» клавише, из меню и т.д.

Функции ключей.

Ключ /s - тормоз винчестера перед выполнением основной функции.

Ключ /r - выход в главное меню (полный сброс - RESET); одновременно с ключом /s - с тормозом винчестера.

Ключ /t - выход в TR-DOS с запуском программы «boot» на диске «A»; одновременно с ключом /s - с тормозом винчестера.

Ключ /b - выход в BASIC-48; одновременно с ключом /s - с тормозом винчестера.

Ключ /m - выход в монитор «JV KRAMIS»; одновременно с ключом /s - с тормозом винчестера.

Сначала отрабатывается ключ /s (если он используется, то он должен стоять первым), а затем выполняется выход в указанном направлении. После отработки ключа /s следует команда установки на свое место нулевой банки ПЗУ, а затем отрабатывается команда, заданная вторым ключом:

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

- при выходе в TR-DOS выполняется команда «RANDOMIZE USR 15619: RUN «boot», аналогичная такой же в «EXIT_TRD.COM». Для того, чтобы успеть сменить диск, если дисковод - системное устройство, выводится меню и программа ожидает нажатия клавиши: или

- выход обратно в iS-DOS, любая другая клавиша - выход в TR-DOS.

- при выходе в BASIC-48 осуществляется переход на адрес #0 ROM BANK 1, установленный по умолчанию в iS-DOS.

- при выходе в монитор «JV KRAMIS» осуществляется переход на адрес #0 ROM BANK 0, в котором зашит «теневик».

Ключи можно задавать в виде /s/b или в виде /s /b, программе это безразлично. Регистр букв также не имеет значения.

Пример: Q:BOOT\sb_exit /s/b (выход в BASIC-48 с тормозом винта).

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

Для устойчивого «торможения» винчестера и исключения его перезапуска при выходе из программы обратно в iS-DOS (когда, например, курсор находится в подкаталоге пятого-шестого уровня вложенности) лучше организовать вызов программы sb_exit с ключом /s через короткий bat-файл:

*L-
Q:SHELL\cache /29
CAT S:
Q:SHELL\pan /7
CAT S:
Q:SHELL\pan /7
Q:UTIL\sb_exit /s

* * *

При написании статьи использовались материалы: А. Леонтьева (г. Санкт-Петербург), С. Багана (г. Минск), А. Карныгина (г. Балашов), А. Кубрака и Е. Борисова (г. Старица).