Абзац
:: Поиск
:: ПоддерЖка ПрОекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №20 (27.06.2004) ПрОсмотрОв: 3848

    Автор: Сергей Баган.

    Рубрика: В помощь разработчику.

    Номер: №20 (27.06.2004).



    iS-DOS Chic

    В январе 1995 года создан вариант iS-DOS’a: «iS-DOS Chic» (Исдос Шик), использующий нижние 16 Кб для размещения неизменяемой части ядра системы. Это оказалось возможным на компьютерах KAY-256, Scorpion ZS-256, Profi и др. им подобным. Данные модификации Спектрума позволяют в нижней странице памяти разместить 0-й банк памяти. Вместо него в верхней странице открывается 8-ой банк. При этом появляется возможность изменения значения байтов в нижней странице памяти, что используется при определении типа системы некоторыми программами, например, show.com (см. ниже).

    В нижнюю страницу помещаются, как правило, неизменяемые части системных программ (для возможности прошить эту страницу в ПЗУ), знакогенераторы t42 и t64 (2 Кб + 1 Кб), благодаря чему транзитная область расширяется почти вдвое (до 30 Кб вместо 15 при минимальном количестве резидентов и 29-блочном кэше).

    Вследствие разделения системы на две части - изменяемую и неизменяемую, изменился формат хранения системы - теперь она располагается в двух файлах:

    - is_dos.rom (тут хранится неизменяемая часть системы);

    - is_dos.sys (или *.sys, тут хранится изменяемая часть системы);

    При загрузке системы файл is_dos.rom грузится в область CPU0 (#0000-#3FFF), а файл is_dos.sys грузится по адресу загрузки. Его можно сохранять программой sv.com вместе с установленными резидентами.

    В связи с наличием нескольких моделей компьютеров, на которых возможна работа iS-DOS Chic и наличием разных стандартов расширения памяти и включения банка 0 в раздел CPU0 в этих компьютерах необходимо наличие возможности настройки системы под конкретную модель компьютера. Это достигается введением в состав неизменяемой части системы т.н. вектора системы, драйвера расширенной памяти и списка доступных банков памяти. Эти компоненты можно изменить при настройке системы. Теперь рассмотрим подробно эти компоненты:


    Таблица банков расширенной памяти:

    По адресу #0069 (105 dec) лежит таблица банков расширенной памяти, используемой драйвером расширенной памяти для iS-DOS Chic ed128rom.blk (размещается в памяти компьютера). Маркер конца таблицы не предусмотрен, то есть не делается проверка на размер создаваемого RAM-диска.

    В таблице исключаются банки 0, 2, 5 и 8 в связи с тем, что эти банки используются под саму систему и программы:

    - в банке 0 (адреса #0000-#3FFF) располагается неизменяемая часть системы;

    - банка 5 (адреса #4000-#7FFF) - экранная область, системные переменные и программы используется;

    - банка 2 (адреса #8000-#BFFF) - используется под программы пользователя и частично под нужды системы (области кэша и каналов в зависимости от размера кэша);

    - в банке 8 (адреса #C000-#FFFF) располагается изменяемая часть системы;

    Все вышеперечисленные банки образуют единое адресное пространство #0000-#FFFF и поэтому не могут использоваться под RAM-диск.

    Значения в таблице не отображают напрямую значения, посылаемые в порты расширения, а являются комбинацией значений для двух портов. Для «расшифровки» этих значений и непосредственно переноса данных из банки в память существует отдельная подпрограмма драйвера электронного диска, которая располагается по адресу #003B (59 dec).

    Подпрограмма драйвера электронного диска:

    Используется драйвером расширенной памяти для iS-DOS Chic ed128rom.blk. Для каждого типа компьютера она разная. ВХОДНЫЕ ДАННЫЕ для подпрограммы следующие:

    BC - количество байт, которое надо прочитать из банки (кратно 256, т.е. C=0).

    HL - с какого места памяти считывать данные.

    DE - в какое место памяти помещать считанные данные (HL, DE, BC значения для команды LDIR).

    H’ - изначальное значение для порта #7FFD, необходимое для нормальной работы системы (байт #FA из вектора системы).

    L’ - значение номера банки памяти из таблицы по адресу #0069 (105 dec).

    BC’ = #7FFD - адрес стандартного порта расширения.

    НА ВЫХОДЕ альтернативные регистры сохраняются, значение основных будет как после завершения команды LDIR.


    Теперь посмотрим, как же выглядят таблица и подпрограмма драйвера для различных компьютеров:


    KAY-1024:

    Таблица: #40, #41, #42, #43, #44, #45, #46, #47, #48, #49, #4A, #4B, #4C, #4D, #4E, #4F, #80, #81, #82, #83, #84, #85, #86, #87, #88, #89, #8A, #8B, #8C, #8D, #8E, #8F, #C0, #C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #CA, #CB, #CC, #CD, #CE, #CF, #0A, #0D, #0F, #0E, #0C, #0B, #09, #01, #03, #04, #06, #07

    В таблице 60 банок (64-4=60). Последние 5 банок относятся к памяти 128К.

    Подпрограмма драйвера:


        ORG #3B
    
        INC B    ;проверяем количество
        DEC B    ;требуемых блоков на 0
        RET Z    ;если надо прочитать 0
            ;секторов, то выходим
        EX AF,AF’    ;в альтернативном наборе
            ;регистров лежат номера
        EXX    ;портов расширения и т.п.
        DI    ;во время работы програм-
            ;мы прерывания выключаем
        LD A,L    ;значение номера банки
        AND %10000111    ;биты 7,2-0 из N банки
            ;переносятся в порт
            ;расширения #7FFD
        OR %00010000    ;заодно устанавливается
            ;4-й бит, который
        OUT (C),A    ;включает ROM-48
        LD B,#1F    ;теперь будем заниматься
            ;портом расширения #1FFD
        LD A,L    ;значение N банки
        ADD A,A    ;сдвигаем на 1 бит влево,
            ;при этом бит 7 теряется,
            ;но это неважно
        AND %10010000    ;оставляем 7 и 4 биты
            ;(6 и 3 биты в N банки)
        OR 1    ;бит 0 отвечает за включение
            ;ОЗУ вместо ПЗУ, поэтому 
            ;должен быть 1 для KAY
        OUT (C),A    ;заносим полученное зна-
            ;чение в порт #1FFD
        EXX    ;переключаемся на
            ;основной набор регистров
        LDIR    ;переносим нужное
            ;количество байт из банки
        EXX    ;переходим на альтернати-
            ;вный набор регистров
        LD A,%00010001    ;включаем банку 8, где
            ;расположена изменяемая
        OUT (C),A    ;часть сист. iS-DOS Chic
        LD B,#7F    ;восстанавливаем значение
        OUT (C),H    ;порта #7FFD
        EI
        EXX    ;возвращаем на место
        EX AF,AF’    ;набор регистров
        RET    ;выходим

    KAY-256:

    Таблица: #12, #15, #17, #16, #14, #13, #11, #01, #03, #04, #06, #07

    Подпрограмма драйвера:


        ORG #3B
    
        INC B    ;проверка количества
        DEC B    ;требуемых блоков на 0
        RET Z
        EX AF,AF’
        EXX
        DI
        LD A,L
        AND %00010111    ;биты 4, 2-0 банки зано-
            ;сим в те же биты порта
        OUT (C),A    ;#7FFD
        LD B,#1F
        LD A,L
        AND %00010000    ;бит 4 банки заносим в
            ;тот же бит порта #1FFD
        OR %00000001    ;бит 0 должен быть уста-
            ;новлен в 1 для iS-DOS
        OUT (C),A    ;Chic
        EXX    ;далее все так же, как и
        LDIR    ;в драйвере для KAY-1024
        EXX
        LD A,%00010001
        OUT (C),A
        LD B,#7F
        OUT (C),H
        EI
        EXX
        EX AF,AF’
        RET

    Profi-1024

    Таблица: #01, #03, #04, #06, #07, #0A, #0D, #10, #11, #12, #13, #14, #15, #16, #17, #18, #19, #1A, #1B, #1C, #1D, #1E, #1F, #20, #21, #22, #23, #24, #25, #26, #27, #28, #29, #2A, #2B, #2C, #2D ,#2E, #2F, #30, #31, #32, #33, #34, #35, #36, #37, #38, #39, #3A, #3B, #3C, #3D, #3E, #3F, #09, #0B, #0C, #0E, #0F

    Подпрограмма драйвера:


        ORG #3B
    
        INC B    ;проверка количества
        DEC B    ;требуемых блоков на 0
        RET Z
        EX AF,AF'
        EXX
        DI
        LD A,L    ;биты 2-0 N банки заносим
            ;в #7FFD
        AND %00000111
        OR %00010000    ;бит 4 - включение ПЗУ-48
        OUT (C),A
        LD B,#DF    ;порт #DFFD
        LD A,L
        RR A    ;сдвигаем на 3 бита
        RR A    ;вправо
        RR A
        AND %00000111    ;биты 2-0 (5-3 в N банки)
            ;заносим в порт #DFFD
        OR %00010000    ;бит 4 отвечает за вклю-
            ;чение в CPU0 банки 0 ОЗУ
        OUT (C),A    ;и должен быть установлен
        EXX
        LDIR    ;переносим данные
        EXX
        LD A,%00010001    ;устанавливаем банку 8
        OUT (C),A    ;ОЗУ обратно
        LD B,#7F    ;восстанавливаем исходное
            ;значение порта #7FFD
        OUT (C),H
        EI
        EXX
        EX AF,AF'
        RET

    Scorpion-256

    Таблица: #12, #15, #17, #16, #14, #13, #11, #01, #03, #04, #06, #07

    Подпрограмма драйвера:


        ORG #3B
    
        INC B    ;проверка количества
        DEC B    ;требуемых блоков на 0
        RET Z
        EX AF,AF'
        EXX
        DI
        LD A,L
        AND %00010111    ;биты 4, 2-0 N банки
        OUT (C),A    ;переносим в порт #7FFD
        LD B,#1F
        LD A,L
        AND %00010000    ;бит 4 N банки
            ;переносим в порт #1FFD
        OR %00000001    ;бит 0 должен быть в
        OUT (C),A    ;iS-DOS Chic равен 1
        EXX
        LDIR    ;переносим данные
        EXX
        LD A,%00010001    ;включаем обратно
        OUT (C),A    ;банку 8
        LD B,#7F    ;восстанавливаем исходное
        OUT (C),H    ;значение порта #7FFD
        EI
        EXX
        EX AF,AF'
        RET

    Как видно, подпрограмма драйвера и таблица банок одинаковы с KAY-256.


    Примеры:

    Определение типа системы (Classic, Chic) из программы show.com:

    Основывается на возможности изменения значения байтов нижней страницы памяти в iS-DOS Chic.


        DI
        LD HL,#0044    ;проверять будем байт по
            ;адресу #44
        LD A,(HL)    ;берем байт
        LD E,A    ;сохраняем
        DEC (HL)    ;уменьшаем на 1 значение
            ;байта в ПЗУ
        DEC A    ;уменьшаем на 1 значение
            ;прочитанного байта
        XOR (HL)    ;сравниваем, если система
            ;Chic, то байт в ПЗУ из-
            ;менится, и операция XOR
            ;даст Z. Иначе NZ - мы в
            ;Classic
        LD (HL),E    ;восстанавливаем байт в
            ;ПЗУ на тот случай, если
            ;мы в Chic
        EI

    Следующий пример показывает, как можно корректно использовать в iS-DOS Classic/Chic доступ к банкам памяти или к содержимому ПЗУ.

    Если в iS-DOS Classic доступ к ПЗУ открыт и так, то в Chic вместо ПЗУ находится 0-й банк памяти. Чтобы программа, использующая доступ к ПЗУ, работала в обеих системах, можно использовать универсальную процедуру:


        ;Для начала определяем тип системы
        DI
        LD HL,#0044    ;проверять будем байт по
            ;адресу #44
        LD A,(HL)    ;берем байт
        LD E,A    ;сохраняем
        DEC (HL)    ;уменьшаем на 1 значение
            ;байта в ПЗУ
        DEC A    ;уменьшаем на 1 значение
            ;прочитанного байта
        XOR (HL)    ;сравниваем, если система
            ;Chic, то байт в ПЗУ из-
            ;менится, и операция XOR
            ;даст Z. Иначе NZ - мы в
            ;Classic
        LD (HL),E    ;восстанавливаем байт в
            ;ПЗУ на тот случай, если
            ;мы в Chic
        EI
    
    ;Если у нас iS-DOS Chic, то переносим
    ;вектор системы в память для дальнейшего
    ;использования.
    
    ;Если же мы в Classic, то можно
    ;эмулировать вектор системы.
    
        JR NZ,$1    ;если мы в Classic, то
            ;пропускаем процедуру
            ;переноса вектора, эмули-
            ;рованный вектор для
            ;Classic изначально
            ;находится в памяти
        LD HL,#00FA    ;переносим вектор системы
            ;в память
        LD DE,VECTOR
        LD BC,5
        LDIR
    
    $1 ...    ;продолжение программы
    
    ;Допустим, нам потребовалось обратиться
    ;к ПЗУ-48
    
        DI    ;прерывания нужно
            ;выключить
        LD BC,(VECTOR+3)    ;адрес дополнительного
            ;порта расширения
        LD A,(VECTOR+1)    ;значение для выключе-
            ;ния режима подстанов-
            ;ки банки 0 ОЗУ в ниж-
            ;нюю область памяти и
            ;включения ПЗУ
        OUT (C),A
        LD BC,#7FFD
        LD A,%00010000
        OUT (C),A
    
        ...    ;тут какие-нибудь проце-
            ;дуры работы с ПЗУ-48
    
        LD BC,(VECTOR+3) ;заносим в дополните-
            ;льный порт расширения
            ;значение для включе-
            ;ния режима подстанов-
        LD A,(VECTOR+2)    ;ки банки 0 ОЗУ в ниж-
            ;нюю область памяти
        OUT (C),A
        LD BC,#7FFD    ;восстанавливаем исходное
            ;значение порта #7FFD
        LD A,(VECTOR)
        OUT (C),A
        EI    ;включаем прерывания
    
        ...    ;продолжение программы
    
    ;Если нам потребуется обратиться к
    ;какой-нибудь банке памяти:
    
        DI    ;прерывания нужно
            ;выключить
        LD BC,(VECTOR+3)    ;адрес дополнительно-
            ;го порта расширения
        LD A,(VECTOR+1)    ;значение для выключения 
            ;режима подстановки
            ;банки 0 ОЗУ в нижнюю 
            ;область памяти 
            ;и включения ПЗУ
        OUT (C),A
        LD BC,#7FFD
        LD A,%00010000    ;тут номер банки памяти
            ;для порта #7FFD
        OUT (C),A    ;можно использовать
            ;другой порт (#1FFD,
            ;#DFFD и т.п.)
    
        ...    ;тут какие-нибудь проце-
            ;дуры работы с памятью
    
        LD BC,(VECTOR+3)    ;заносим в дополните-
            ;льный порт расширения
            ;значение для включе-
            ;ния режима подстанов-
        LD A,(VECTOR+2)    ;ки банки 0 ОЗУ в ниж-
            ;нюю область памяти
        OUT (C),A
        LD BC,#7FFD    ;восстанавливаем исходное
        LD A,(VECTOR)    ;значение порта #7FFD
        OUT (C),A
        EI    ;включаем прерывания
    
    ;Вектор системы. Изначально заполнен
    ;значениями для эмуляции в iS-DOS Classic
    
    VECTOR DEFB #10    ;Изначальное значение
            ;порта #7FFD
        DEFB #10    ;значение для включения
            ;ROM-памяти в CPU0
        DEFB #10    ;значение для включения
            ;RAM-памяти в CPU0
        DEFW #7FFD     ;дополнительный порт
            ;расширения



    © 2004-2013 Perspective group