:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №20 (27.06.2004) Просмотров: 5795
Автор: Сергей Баган. Рубрика: В помощь разработчику. Номер: №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 ;дополнительный порт ;расширения |