
Сообщение от
ewgeny7
Вчера добавил в прошивку работу с портом F6 как портом I/O и перезаписал винт.
Сегодня был сдвиг - винт прочитался. На экране появилось что-то вроде "boot loader... тра-та-та quantum maverik 270а..." и две партиции диска. И таймер тикал

Это означает, что MBR-сектор (сектор с LBA=0) и identify с винта читаются.
В меню партиций были надписи "ALTAIR-GAMES-ZX", "ALTAIR-GAMES-OLD"?
Эти строчки - метка дисков (партиций) - volume label. Если да, то значит читаются и правильно адресуются по LBA boot-секторы партиций (это первый сектор каждой из партиций). Значит чтение с винта должно проходить нормально и далее - при чтении (загрузке) кода операционки.

Сообщение от
ewgeny7
Но далее глюк. При выборе партиции (любой) светодиод винта еще на секунду загорается, с винта что-то читается... и висим. Экран не очищается, в правом нижнем углу экрана появляется полосочка (FF в каком-то байте экрана). И всё

картина одинаковая и при M36zrkh и при M34zrk + драйвер. Что там происходит после выбора партиции и перед началом работы теста памяти не припомнишь?

А далее начинается жесткач. 
Во-первых, программный код загрузчика ОС и холодного старта ОС (включая тест памяти, до которого пока не доходит) работает из первой страницы (1-й , если считать с 0). После теста памяти вообще работаем в-основном из 2-й страницы (считая с 0).
До этого весь код, что запускается из-под Ордос у тебя работал в нулевой странице, а доступ к остальным страницам получал через п\п ПЗУ F800 (эти п\п работают только внутри кода ПЗУ и только на регистрах Z80). Поэтому, если нормально описано ПЗУ, но неточно описано "слипшееся" ОЗУ области F000...F3FF (в этом адресном пространстве процессора независимо ни от каких портов, как то F9 и FB, ВСЕГДА область ОЗУ F000...F3FF нулевой страницы), то деффект мог ранее быть незаметен.
За счет "слипшегося" ОЗУ области F000...F3FF применяется практика написания такого кода: размещаем небольшие куски "кода взаимодействия" и стек процессора в области F000...F3FF, щелкаем "банками" ОЗУ портом F9, но не теряем при этом выполняемость, т.к. выполнение кода в области F000...F3FF не прерывается, в отличие от того как если разместить код ниже F000 и вывести в порт F9 значение, отличное от текущего.
0EFFFH - МАРКЕР БАНКА. Специфическая для этой версии CPM ячейка. С записи в нее FF во все страницы ОЗУ (переключаемся по порту F9 даже в несуществующие страницы !!! - нам то пофиг, мы в области F000...F3FF, т.е. гарантированно в существующей нулевой странице, а определить сколько ОЗУ присутствует - надо) начинается инициализация ОС перед тестом ОЗУ (сидящий опять же в F000...F3FF), который потом много и часто щелкает портом F9 (до этого порт F9 ставится в "1" только один раз - перед чтением MBR, котороый кладется с адреса 0 соответственно в первую страницу считая с 0). А у тебя F9 не щелкает, видимо все заканчивается на инициализации в 0FFh ячейки 0EFFFH (МАРКЕРа БАНКА) второй страницы или первой из несуществующих (0FFh в EFFFH нулевой страницы ты на экране все же видишь).
Т.е. где-то в самом начале увисает еще до теста, иначе оно писало бы в левом верхнем углу количество найденного и проверенного ОЗУ, а по экрану промелькнула бы "сверху-вниз слева-направо" очередная тестируемая ячейка. По мере прохождения теста значение в 0EFFFH - МАРКЕР БАНКА становится равным номеру страницы ОЗУ (это нужно чтобы по прерыванию определять - в какой страница мы есть, т.к. порт F9 на чтение не доступен).
Ну, и конечно много раз при холодном старте ОС из 1-й станицы (считая с 0) вызываются команды вида (нормальные для реала):
Код:
LD A,80H
OUT (0FBh),A ; выключили диспетчер 16к
; .........................................
LD HL,0F3CFH
LD (HL),0C0H ; экран с C000
INC HL
LD (HL),30H ; ширина экрана
INC HL
LD (HL),B ; B=0. фонт на F000
INC HL
LD (HL),0F0H
inc hl
ld (hl),B ; B=0. откл. инверсию
CALL 0F82DH ; распаковать фонт
;
; вызвали п\п из ПЗУ, а сами при этом в странице 1 (не 0 !)
;
pop hl ; HL=NTAB
LD DE,BPROC
LD BC,AVECEND-AVECBEG
LDIR ; МЕЖБАНКОВЫЙ СЕРВИС
;
; куча LDIR-ов в область F000...F3FF - куда оно реально попадет?
; инициализация неких переменных Монитора, опят же в области ;F000...F3FF
;
JP MMTEST ; MEMORY TEST
;
MMTEST:
; ........................
LD BC,80FFH
LD HL,MARKER
CALL INITEST ; инициализация ячейки EFFF всех страниц в значение 0FFh
; goto F000...F3FF area !!!
; ........................
CALL 0F812H ; console status (keypressed)
; вызвали п\п из ПЗУ, а сами при этом в странице 1 (не 0 !)
;
CALL TESTMEM ; тест очередного 4к-фрагмента goto F000...F3FF area !!!
; ........................
;
; ........................
; БЕЗВРЕДНЫЙ ТЕСТ ПАМЯТИ. ВХОД: HL = 0EFFFH - МАРКЕР БАНКА.
; DE = НАЧАЛЬНЫЙ АДРЕС, BC = ДЛИНА ТЕСТИРУЕМОГО ФРАГМЕНТА
; ВЫХОД: ФЛАГ Z=TRUE ЕСЛИ НОРМАЛЬНО, Z=FALSE(NZ) ЕСЛИ BAD
;
TESTMEM:OUT (PF9),A
CP (HL)
JR Z,TESTM0
JR NC,RETT ; ПЕРЕХОД ЕСЛИ (MARKER)<AKK
LD (HL),A ; МЕНЯЕМ 0FFH НА НОМЕР СТР.
TESTM0: EX DE,HL
TESTM1: LD A,(HL)
CPL
LD (HL),A
CP (HL)
JR NZ,RETT
CPL
LD (HL),A
CP (HL)
JR NZ,RETT
INC HL
DEC BC
LD A,B
OR C
Jr NZ,TESTM1
RETT: LD A,WORKPAGE
OUT (PF9),A
RET
;
; ; инициализация ячейки EFFF всех страниц в значение 0FFh
;
INITEST:OUT (PF9),A
LD (HL),C
INC A
DJNZ INITEST
JR RETT
;
Некокторые подрограммы Монитора (типа статуса клавиатуры, рапаковки фонта) можно вызывать из любой страницы, т.к. они не лезут в ОЗУ ниже F000, другие, которые лезут в ОЗУ ниже F000 надо вызывать только из положения port_F9=0.
---------- Post added at 18:17 ---------- Previous post was at 17:52 ----------
Резюмирую предыдущий пост: считаю, надо проверить, как описано "слипшееся" ОЗУ области F000...F3FF, особенно в случае, если в порт F9 занесен номер физически несуществующей страницы ОЗУ - в этом случае ниже F000 должна быть видна одна из существующих страниц. К примеру, если у тебя 512к ОЗУ (т.е. 8 страниц по 64к) и в порт F9 выведено значение 25, то в области 0000...EFFF с учетом "игнорирования старших линий адреса" должно быть видно ОЗУ страницы (25 mod 8)=1, а в области F000...F3FF - ОЗУ страницы 0 (как и во всех случаях).
Не надо закладываться на некий фиксированный объем ОЗУ (чтобы не отрезать возможность расширения простым добавлением ОЗУ) - оно должно автоматически получиться когда "не задействованы старшие линии адреса- A19, A20,...". Просто надо это уточнить.