Отключение 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[свернуть]Архив с откомпилированными тестами: MyTestKD_new.7zTestKDo2
Аналогичен предыдущему тесту, только тут тестирование выполняются в два этапа -- сначала цикл записи, а потом цикл проверки. В конце также показывается количество ошибок.Код:.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[свернуть]
Что получается:
1. Тест в режиме "стек" ни разу не показал ни одной ошибки.
2. Тест в режиме "ОЗУ" в один этап показывает от 0 до 10 случайных ошибок, в два этапа до 30. Это плохо... Есть подозрение на большие задержки в Д5 и Д6, но, с другой стороны, данные на ШАВВ должны появляться раньше, чем на ШАП будет сформирован полный адрес. Надо ещё подумать...
И ещё остаётся питание. Проблемы в нём точно есть, но пока у меня не готов БП на замену.





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
