Отключение BLK_INT от Д2 дало определённо положительный эффект: теперь тест "Дождь" даже при продолжительном тестировании не показывает ошибок, "Тест квазидиска" тоже, но "жёлтый" тест КД бракует все микросхемы, да и ещё стандартный "Тест устройств" случайным образом бракует чипы. Также MDOS 2.0 грузится и по "8" не показывает ошибок... но глючит на записи в КД.

Значит, исправляем схему в соответствии с последней доработкой:


Новая схема и разводка в архиве (гербер не делал): kd_sram11_1.7z

И продолжаем тестировать:

TestKDst

Очистка всего КД и заполнение значением 0AA55h в режиме "стек" с последующим контролем и подсчётом ошибок
Код:
        .ORG    00100h
L_0100: LXI  D, L_DATA
        PUSH D          ; сохраняем в стеке ссылку
L_MAIN: POP  D          ; считываем ссылку
        LDAX D          ; загружаем A по ссылке
        ORA  A
        JZ   L_DONE     ; переход, если там ноль ---->>>>
        INX  D          ; DE=DE+1
        PUSH D          ; сохраняем в стеке новую ссылку
        DI              ; запрещаем прерывания
        OUT     010h    ; отправляем в порт
        LXI  H, 0000h   ; заполнение памяти
        DAD  SP         ; SP+0 в HL
        SHLD    L_SAVE  ; сохранить указатель на стек
        LXI  D, 0FFFFh  ; чем заполнять -- предварительная очистка памяти
        LXI  H, 8000h   ; сколько/2
        LXI  SP,0000h   ; свой указатель на стек
L_LP0:  PUSH D          ; заполняем через стек...
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP0   ; зациклено
        LXI  D, 0AA55h  ; чем заполнять
        LXI  H, 8000h   ; сколько/2
        LXI  SP,0000h   ; свой указатель на стек
L_LP1:  PUSH D          ; заполняем через стек...
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP1   ; зациклено
        LXI  H, 8000h   ; сколько/2
L_LP2:  POP  B          ; вычитываем и проверяем записанное
        MOV  A, B
        CMP  D          ; если старший байт прочитанного не равен записанному
        JNZ     L_ERROR ; обработка ошибки
        MOV  A, C
        CMP  E          ; если младший байт прочитанного не равен записанному
        JNZ     L_ERROR ; обработка ошибки
L_RET:  DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP2   ; зациклено
        XRA  A          ; обнуляем аккумулятор
        OUT     010h    ; отправляем в порт -- отключаем КД
        LHLD    L_SAVE  ; считать сохранённый указатель на стек в HL
        SPHL            ; восстанавливаем SP
        EI              ; разрешаем прерывания
        LXI  D, L_TEXT2 ; вывод количества найденных ошибок
        MVI  C, 009h
        CALL 5          ; вывод сообщения
        LHLD    L_ERRS  ; считываем количество
        CALL    L_BHEX  ; выводим H в шестнадцатиричном виде
        MOV  H, L
        CALL    L_BHEX  ; выводим L в шестнадцатиричном виде
        LXI  H, 00000h
        SHLD    L_ERRS  ; обнуляем счётчик ошибок
        JMP     L_MAIN
;
L_ERROR:SHLD    L_SAVE2 ; сохранить счётчик
        LHLD    L_ERRS  ; считываем количество ошибок
        INX  H
        SHLD    L_ERRS  ; количество ошибок +1
        LHLD    L_SAVE2 ; восстановить счётчик
        JMP L_RET       ; возврат в цикл
;
L_DONE: LXI  D, L_TEXT
        MVI  C, 009h
        CALL 5          ; вывод сообщения
        RET             ; выход из программы
;
L_BHEX: MOV  A, H       ; H-входное значение для вывода
        RRC
        RRC
        RRC
        RRC             ; сдвиг вправо на 4 бита
        CALL    L_BIT   ; выводим старшие 4 бита
        MOV  A, H       ; восстанавливаем значение
L_BIT:  ANI     00Fh    ; оставляем младшие 4 бита
        CPI     00Ah
        JM      L_B10   ; если меньше 10
        ADI     007h    ; +7
L_B10:  ADI     030h    ; +30h
        MVI  D, 000h
        MOV  E, A
        MVI  C, 002h    ; вывод символа
        PUSH H          ; сохраняем HL
        CALL 5
        POP  H          ; восстанавливаем HL
        RET
;
L_SAVE: .dw 0000h
L_SAVE2:.dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibok = $"
L_DATA: .db 1Ch         ; 00011100b -- вкл. 3 банк как стек на КД
        .db 18h         ; 00011000b -- вкл. 2 банк как стек на КД
        .db 14h         ; 00010100b -- вкл. 1 банк как стек на КД
        .db 10h         ; 00010000b -- вкл. 0 банк как стек на КД
        .db 00h         ; конец
L_ERRS: .dw 0000h       ; количество ошибок
        .END
[свернуть]

TestKDoz

Тест КД в режиме "ОЗУ" с предварительной полной очисткой, в т.ч. областей по доработке Баркаря, с подсчётом ошибок записи.
Код:
        .ORG    00100h
L_0100: LXI  D, L_DATA  ; для начала очистка КД
        PUSH D          ; сохраняем в стеке ссылку
L_CLEAR:POP  D          ; считываем ссылку
        LDAX D          ; загружаем A по ссылке
        ORA  A
        INX  D          ; DE=DE+1
        PUSH D          ; сохраняем в стеке новую ссылку
        JZ   L_NEXT     ; переход, если там ноль ---->>>>
        DI              ; запрещаем прерывания
        OUT     010h    ; отправляем в порт
        LXI  H, 0000h
        DAD  SP         ; SP+0 в HL
        SHLD    L_SAVE  ; сохранить указатель на стек
        LXI  D, 0FFFFh  ; чем заполнять -- предварительная очистка памяти
        LXI  H, 8000h   ; сколько/2
        LXI  SP,0000h   ; свой указатель на стек
L_LP0:  PUSH D          ; заполняем КД через стек...
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP0   ; зациклено
        XRA  A          ; обнуляем аккумулятор
        OUT     010h    ; отправляем в порт -- отключаем КД
        LHLD    L_SAVE  ; считать сохранённый указатель на стек в HL
        SPHL            ; восстанавливаем SP
        EI              ; разрешаем прерывания
        JMP     L_CLEAR ; цикл очистки
;
L_NEXT: LXI  D, L_TEXT1
        MVI  C, 009h
        CALL 5          ; вывод сообщения об окончании очистки КД
L_CHK:  POP  D          ; считываем ссылку
        LDAX D          ; загружаем A по ссылке
        ORA  A
        JZ   L_DONE     ; переход, если там ноль ---->>>>
        INX  D          ; DE=DE+1
        PUSH D          ; сохраняем в стеке новую ссылку
        DI              ; запрещаем прерывания
        OUT     010h    ; отправляем в порт
        LXI  H, 08000h  ; заполнение памяти -- сколько
        LXI  B, 08000h  ; с какого адреса
L_LP1:  MVI  A, 055h    ; чем заполнять
        STAX B          ; пишем
        LDAX B          ; читаем в A
        CPI     055h    ; сравниваем
        JZ      L_GOOD  ; значения равны
        PUSH H          ; сохранить счётчик
        LHLD    L_ERRS  ; считываем количество ошибок
        INX  H
        SHLD    L_ERRS  ; количество ошибок +1
        POP  H          ; восстановить счётчик
L_GOOD: INX  B
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP1   ; пока HL не обнулится
        XRA  A          ; обнуляем аккумулятор
        OUT     010h    ; отправляем в порт -- отключаем КД
        EI              ; разрешаем прерывания
        LXI  D, L_TEXT2 ; вывод количества найденных ошибок
        MVI  C, 009h
        CALL 5          ; вывод сообщения
        LHLD    L_ERRS  ; считываем количество
        CALL    L_BHEX  ; выводим H в шестнадцатиричном виде
        MOV  H, L
        CALL    L_BHEX  ; выводим L в шестнадцатиричном виде
        LXI  H, 00000h
        SHLD    L_ERRS  ; обнуляем счётчик ошибок
        JMP     L_CHK   ; цикл проверки
;
L_DONE: LXI  D, L_TEXT
        MVI  C, 009h
        CALL 5          ; вывод сообщения об окончании проверки КД
        RET             ; выход из программы
;
L_BHEX: MOV  A, H       ; H-входное значение для вывода
        RRC
        RRC
        RRC
        RRC             ; сдвиг вправо на 4 бита
        CALL    L_BIT   ; выводим старшие 4 бита
        MOV  A, H       ; восстанавливаем значение
L_BIT:  ANI     00Fh    ; оставляем младшие 4 бита
        CPI     00Ah
        JM      L_B10   ; если меньше 10
        ADI     007h    ; +7
L_B10:  ADI     030h    ; +30h
        MVI  D, 000h
        MOV  E, A
        MVI  C, 002h    ; вывод символа
        PUSH H          ; сохраняем HL
        CALL 5
        POP  H          ; восстанавливаем HL
        RET
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT1:.db 0Dh, 0Ah, "-- o~istka kd wypolnena --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibok = $"
L_DATA: .db 01Ch        ; 00011100b -- вкл. 3 банк как стек на КД
        .db 018h        ; 00011000b -- вкл. 2 банк как стек на КД
        .db 014h        ; 00010100b -- вкл. 1 банк как стек на КД
        .db 010h        ; 00010000b -- вкл. 0 банк как стек на КД
        .db 000h        ; на второй этап
        .db 0E3h        ; 11100011b -- вкл. 3 банк как ОЗУ 8000h-FFFFh
        .db 0E2h        ; 11100010b -- вкл. 2 банк как ОЗУ 8000h-FFFFh
        .db 0E1h        ; 11100001b -- вкл. 1 банк как ОЗУ 8000h-FFFFh
        .db 0E0h        ; 11100000b -- вкл. 0 банк как ОЗУ 8000h-FFFFh
        .db 000h        ; конец
L_ERRS: .dw 0000h       ; количество ошибок
        .END
[свернуть]

TestKDo2

Аналогичен предыдущему тесту, только тут тестирование выполняются в два этапа -- сначала цикл записи, а потом цикл проверки. В конце также показывается количество ошибок.
Код:
        .ORG    00100h
L_0100: LXI  D, L_DATA  ; для начала очистка КД
        PUSH D          ; сохраняем в стеке ссылку
L_CLEAR:POP  D          ; считываем ссылку
        LDAX D          ; загружаем A по ссылке
        ORA  A
        INX  D          ; DE=DE+1
        PUSH D          ; сохраняем в стеке новую ссылку
        JZ   L_NEXT     ; переход, если там ноль ---->>>>
        DI              ; запрещаем прерывания
        OUT     010h    ; отправляем в порт
        LXI  H, 0000h
        DAD  SP         ; SP+0 в HL
        SHLD    L_SAVE  ; сохранить указатель на стек
        LXI  D, 0FFFFh  ; чем заполнять -- предварительная очистка памяти
        LXI  H, 8000h   ; сколько/2
        LXI  SP,0000h   ; свой указатель на стек
L_LP0:  PUSH D          ; заполняем КД через стек...
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP0   ; зациклено
        XRA  A          ; обнуляем аккумулятор
        OUT     010h    ; отправляем в порт -- отключаем КД
        LHLD    L_SAVE  ; считать сохранённый указатель на стек в HL
        SPHL            ; восстанавливаем SP
        EI              ; разрешаем прерывания
        JMP     L_CLEAR ; цикл очистки
;
L_NEXT: LXI  D, L_TEXT1
        MVI  C, 009h
        CALL 5          ; вывод сообщения об окончании очистки КД
L_CHK:  POP  D          ; считываем ссылку
        LDAX D          ; загружаем A по ссылке
        ORA  A
        JZ   L_DONE     ; переход, если там ноль ---->>>>
        INX  D          ; DE=DE+1
        PUSH D          ; сохраняем в стеке новую ссылку
        DI              ; запрещаем прерывания
        OUT     010h    ; отправляем в порт
        LXI  H, 08000h  ; заполнение памяти -- сколько
        LXI  B, 08000h  ; с какого адреса
L_LP1:  MVI  A, 055h    ; чем заполнять
        STAX B          ; пишем
        INX  B
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP1   ; пока HL не обнулится
        LXI  H, 08000h  ; считываем -- сколько
        LXI  B, 08000h  ; с какого адреса
L_LP2:  LDAX B          ; читаем в A
        CPI     055h    ; сравниваем
        JZ      L_GOOD  ; значения равны
        PUSH H          ; сохранить счётчик
        LHLD    L_ERRS  ; считываем количество ошибок
        INX  H
        SHLD    L_ERRS  ; количество ошибок +1
        POP  H          ; восстановить счётчик
L_GOOD: INX  B
        DCX  H
        MOV  A, L
        ORA  H
        JNZ     L_LP2   ; пока HL не обнулится
        XRA  A          ; обнуляем аккумулятор
        OUT     010h    ; отправляем в порт -- отключаем КД
        EI              ; разрешаем прерывания
        LXI  D, L_TEXT2 ; вывод количества найденных ошибок
        MVI  C, 009h
        CALL 5          ; вывод сообщения
        LHLD    L_ERRS  ; считываем количество
        CALL    L_BHEX  ; выводим H в шестнадцатиричном виде
        MOV  H, L
        CALL    L_BHEX  ; выводим L в шестнадцатиричном виде
        LXI  H, 00000h
        SHLD    L_ERRS  ; обнуляем счётчик ошибок
        JMP     L_CHK   ; цикл проверки
;
L_DONE: LXI  D, L_TEXT
        MVI  C, 009h
        CALL 5          ; вывод сообщения об окончании проверки КД
        RET             ; выход из программы
;
L_BHEX: MOV  A, H       ; H-входное значение для вывода
        RRC
        RRC
        RRC
        RRC             ; сдвиг вправо на 4 бита
        CALL    L_BIT   ; выводим старшие 4 бита
        MOV  A, H       ; восстанавливаем значение
L_BIT:  ANI     00Fh    ; оставляем младшие 4 бита
        CPI     00Ah
        JM      L_B10   ; если меньше 10
        ADI     007h    ; +7
L_B10:  ADI     030h    ; +30h
        MVI  D, 000h
        MOV  E, A
        MVI  C, 002h    ; вывод символа
        PUSH H          ; сохраняем HL
        CALL 5
        POP  H          ; восстанавливаем HL
        RET
;
L_SAVE: .dw 0000h
L_TEXT: .db 0Dh, 0Ah, "-- konec testa --$"
L_TEXT1:.db 0Dh, 0Ah, "-- o~istka kd wypolnena --$"
L_TEXT2:.db 0Dh, 0Ah, "o{ibok = $"
L_DATA: .db 01Ch        ; 00011100b -- вкл. 3 банк как стек на КД
        .db 018h        ; 00011000b -- вкл. 2 банк как стек на КД
        .db 014h        ; 00010100b -- вкл. 1 банк как стек на КД
        .db 010h        ; 00010000b -- вкл. 0 банк как стек на КД
        .db 000h        ; на второй этап
        .db 0E3h        ; 11100011b -- вкл. 3 банк как ОЗУ 8000h-FFFFh
        .db 0E2h        ; 11100010b -- вкл. 2 банк как ОЗУ 8000h-FFFFh
        .db 0E1h        ; 11100001b -- вкл. 1 банк как ОЗУ 8000h-FFFFh
        .db 0E0h        ; 11100000b -- вкл. 0 банк как ОЗУ 8000h-FFFFh
        .db 000h        ; конец
L_ERRS: .dw 0000h       ; количество ошибок
        .END
[свернуть]
Архив с откомпилированными тестами: MyTestKD_new.7z

Что получается:
1. Тест в режиме "стек" ни разу не показал ни одной ошибки.
2. Тест в режиме "ОЗУ" в один этап показывает от 0 до 10 случайных ошибок, в два этапа до 30. Это плохо... Есть подозрение на большие задержки в Д5 и Д6, но, с другой стороны, данные на ШАВВ должны появляться раньше, чем на ШАП будет сформирован полный адрес. Надо ещё подумать...

И ещё остаётся питание. Проблемы в нём точно есть, но пока у меня не готов БП на замену.