Код:
; #1FFD #7FFD
;Physical D7 D4 D7 D6 D5 D4 D3 D2 D1 D0
;Logical D4 D3 D5 D2 D1 D0
; 16 8 32 4 2 1
Здесь показаны логические биты, которые должны стать физическими (фактическими) по задумке авторов и спецификации на KAY1024. В IS-DOS (например) это, согласно автору, соблюдено. На картинке тоже самое, согласно спецификации. В драйвере по другому используется эта таблица (старшинство логических битов изменено, походу). С эмулятором unreal не совпадает в половине случаев и с реальностью тоже. Драйвер для KAY1024 уже переписал, осталось всё проверить.
Что за спецификация увеличения памяти для каждого клона?
Ну как я понял, это какой бит по старшинству, по задумке авторов железа, идёт по очереди в банке для расширения памяти. Можно и в другой комбинации их использовать. Про соблюдение спецификации, здесь смысл такой. ОС (любая, наверно) работает с физическими банками, делает их логическими (в примитивной теории), согласно спецификациям. И, чтобы дешифрация совпадала у драйвера и ОС, нужно одинаковый алгоритм, при котором, у всех одна и та же логическая страница, одинаково дешифруется.
Вот так совпало, с спецификацией.
Код:
rKAY1024 ; KAY 1024
ld e,a ; копия логической страницы
and %00011000 ; выделяем биты для порта #1FFD
sla a ;8 ; двигаем бит с D4 на D5, с D3 на D4
ld d,a ; копия
sla d ;8 ; двигаем бит с D5 на D6
sla d ;8 ; на D7
or d ; соединяем D7 и D4
and %10010000 ; оставляем D7 и D4, мусор убираем
ld h,a ; копия физ.адреса для порта #1FFD
ld bc,#1FFD ; порт страниц
out (c),a ; данные в порт
ld a,e ; логической страницы, оригинал
and %00100000 ; бит D5 логической страницы оставляем
ld d,a ; копия
sla d ;8 ; двигаем бит с D5
sla d ;8 ; на D7
ld a,e ; логической страницы, оригинал
and %00000111 ; оставляем D2, D1, D0
or d ; соединяем бит D7 и D2, D1, D0
or %00010000 ; + BASIC48 ;#10
ld l,a ; копия физ.адрес для порта #7FFD
ld b,#7F ; порт страниц
out (c),a ; данные в порт
;?nop
ret
lKAY1024 EQU $-rKAY1024
Поиск пары физических адресов, с вызовом вот такой:
Код:
;С - порядковый номер в массиве логических страниц (где они соответствуют физическим адресам)
;Проще, для нас страницы от 1 до 256 [0..255],
; в массиве свободные логические по спецификации клона, без исключённых
bKAY1024
;ld c,a ; можно в регистре С страницу передать
ld b,0
sla c ; умножение на два
ld hl,TBL_Physical_RAM ; находим в таблице начало
add hl,bc ; физической пары страниц
ld a,(hl) ;7
ld bc,#1FFD
out (c),a
inc hl ; inc h, если выровнено по сегментам в 256Б
ld d,(hl)
ld a,(vVideoBankD3)
or d
ld b,#7F
out (c),a
;?nop
ret
eKAY1024 EQU $-bKAY1024