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