Спасибо!
Вид для печати
Спасибо!
А одна сторона дискет, которая в Э85 используется это нижняя поверхность дискеты или верхняя?
То есть верхняя головка дисковода? Которая в Кошке помечена как Head 0
Просто смущает, что в дисководах 6121 А1 верхняя головка была муляжом...
Ни разу не видел импортных односторонних дисководов, где головка сверху. Обычно головка снизу, а сверху прижим.
У SA-400 тоже вроде головка снизу.
По-крайней мере у SA-400L точно
https://retrocmp.de/fdd/shugart/400L/s400l_i.htm
Механически проще подвижную головку сделать снизу, расположив направляющие на неподвижном шасси.
А на подвижной верхней части оставить только прижим
- - - Добавлено - - -
Не муляж, а прижим. То что дискету к головке прижимает.
- - - Добавлено - - -
Верхняя (если есть) как раз head 1.
head 0 - нижняя.
Спасибо!
Значит рабочая поверхность дискет в Электронке 85 получается задняя
Переход между верхняя/нижняя -> задняя я не очень отследил ;-)
Ну... задняя поверхность дискеты))) та которая без накрейки ))
- - - Добавлено - - -
Интереснейшее чтиво
да, рабочая на 85 сторона head 0 - нижняя :)
Кто разбирался плотно с ошибками Э85?
Пробую оживить машинку, из плат расширения стоит только КНГМД в слот1 (крайний левый) и НВ1 в слот3.
Пробую грузить ПРОС(Д) В1.8.1 СИСТЕМА Имя тома "PKSYST D1.8.1"
Пару раз прогрузилась нормально, до "засуньте ещё диск и нажмите ПРОДОЛЖИТЬ".
Но потом картина всегда такая: читает систему, на экране с надписью Электроника в левом верхнем углу появляется курсор, но вместо текста "тест оборудования прошёл, вставьте еще диск и нажмите ПРОДОЛЖИТЬ" поелозит несколько раз дисководом (дорожка 00, дорожка 79, несколько раз туда-сюда) и рисует машинку (ни один элемент не подсвечен) и пишет справа:
000400
000007
Описание конкретно этого кода не нашел ни в родной документации, ни в дековской.
Что это может быть?
Дискету менял, записывал повторно - дело не в ней.
UPD: не понравилось мне как он елозит, заменил дисковод. Проблема сразу ушла.
Но вопрос про странный код ошибки остается ...
Программная ошибка. Выскакивала периодически на стадии загрузки при проблемной дискете, контроллере НГМД, контроллере НМД, бедах винчестера в системной области либо проблемах со шлейфами.
А вообще, когда я дисководы на TEAC заменил- жизнь стала проще!
С ужасом вспоминаю советские дисководы. То сами барахлят, то дискеты портят
Про описания не скажу, а возникает при ошибке считывания одного из системных файлов
А где выложены в сети дистрибутивы дискет из комлекта поставки??? ;-) ;-) ;)
Чисто как предположение, может дисковод по 0-й дороге промахивался и попадал не в 0, такое у 5305 я ловил, когда датчик 0-й дороги был выставлен не точно.
А как снести систему с HDD ?
Или как загрузиться с дискеты?
У меня при закрытов дисководе выдает ошибку при включении. При открытом - сразу грузится система с HDD.
Мне надо снести систему с HDD и заново поставить систему.
А не существует ли тестов для НВ1 и НВ2, которые позволяют определить битые РУшки?
Может не воронежские, а дековские хотя бы?
Пока в далеко не полном объёме, но - Микроскоп для P/OS :)
Я для тестирования модулей памяти слепил небольшую платку на основе pi pico и двух левел-шифтеров SN74LVC4245APWR на каждую линию ШД разъема модуля памяти. Позволяет за раз оттестировать 4 банка (32 микросхемы). Насчёт полной адекватности теста сказать не могу, но битые мс находит и при их замене ошибки пропадают.
https://pic.maxiol.com/thumbs2/17378...0.img3186j.jpg
Алгоритм сначала прогоняет тест записи-чтения 0x55 0xAA, затем проводит бесконечный тест случайными значениями. Прикладываю код, может пригодится кому:
Скрытый текст
Код:#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/uart.h"
#include "pico/rand.h"
#define UART_ID uart0
#define BAUD_RATE 115200
// We are using pins 0 and 1, but see the GPIO function select table in the
// datasheet for information on which other pins can be used.
#define UART_TX_PIN 0
#define UART_RX_PIN 1
#define A01 2
#define A02 3
#define A03 4
#define A04 5
#define A05 6
#define A06 7
#define A07 8
#define A08 9
// reserved for RU7
#define A09 10
#define ADDRESS_SHIFT 2
#define D00 11
#define D01 12
#define D02 13
#define D03 14
#define D04 15
#define D05 16
#define D06 17
#define D07 18
#define DATA_SHIFT 11
#define RAS1 20
#define RAS2 19
#define WE_L 21
#define WE_M 22
#define CAS 26
#define DATA_DIR 27
#define SHIFT_EN 28
uint32_t gpio_address_mask;
uint32_t gpio_data_mask, gpio_controls_mask;
void write_address(uint8_t wr_bank, uint8_t ras_bank, uint16_t high_address, uint16_t low_address, uint8_t write_data) {
gpio_set_dir_out_masked (gpio_data_mask);
gpio_put (DATA_DIR, 0);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
gpio_put_masked (gpio_data_mask, write_data << DATA_SHIFT);
gpio_put (wr_bank, 0);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
gpio_put_masked (gpio_address_mask, low_address << ADDRESS_SHIFT);
__asm volatile ("nop\nnop\n");
gpio_put (ras_bank, 0);
__asm volatile ("nop\nnop\n");
gpio_put_masked (gpio_address_mask, high_address << ADDRESS_SHIFT);
//__asm volatile ("nop\nnop\n");
gpio_put (CAS, 0);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
gpio_put (CAS, 1);
gpio_put (ras_bank, 1);
gpio_put (wr_bank, 1);
}
uint8_t read_address(uint8_t wr_bank, uint8_t ras_bank, uint16_t high_address, uint16_t low_address) {
gpio_set_dir_in_masked (gpio_data_mask);
gpio_put (DATA_DIR, 1);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
gpio_put_masked (gpio_address_mask, low_address << ADDRESS_SHIFT);
__asm volatile ("nop\nnop\n");
gpio_put (ras_bank, 0);
__asm volatile ("nop\nnop\n");
gpio_put_masked (gpio_address_mask, high_address << ADDRESS_SHIFT);
//__asm volatile ("nop\nnop\n");
gpio_put (CAS, 0);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
volatile uint32_t gpio_value = gpio_get_all();
volatile uint8_t gpio_value1 = gpio_value >> DATA_SHIFT;
//читаем
gpio_put (CAS, 1);
gpio_put (ras_bank, 1);
return gpio_value1;
}
void ram_refresh(uint8_t wr_bank, uint8_t ras_bank, uint16_t low_address) {
gpio_set_dir_in_masked (gpio_data_mask);
gpio_put (DATA_DIR, 1);
__asm volatile ("nop\nnop\n");
gpio_put_masked (gpio_address_mask, low_address << ADDRESS_SHIFT);
__asm volatile ("nop\nnop\n");
gpio_put (ras_bank, 0);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
gpio_put (ras_bank, 1);
__asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
}
bool check_bytes(uint8_t wr_bank, uint8_t ras_bank, uint16_t high_address, uint16_t low_address, uint8_t data_check, bool stop_on_error) {
uint8_t data = read_address (wr_bank, ras_bank, high_address, low_address);
if (data != data_check) {
for (uint8_t k = 0; k <= 0x7F; k++) {
ram_refresh (wr_bank, ras_bank, k);
}
printf("0x%02x 0x%02x: 0x%02x (0x%02x)\n", high_address, low_address, data, data_check);
if (stop_on_error == true) uart_getc(UART_ID);
return (1);
}
return (0);
}
void check_bank(uint8_t WE_line, uint8_t RAS_line) {
uint16_t i, j, k;
uint32_t count = 0;
printf("PRESS ANY KEY TO START\n");
uart_getc(UART_ID);
if (WE_line == WE_L)
gpio_put (SHIFT_EN, 0);
else
gpio_put (SHIFT_EN, 1);
for (k = 0; k <= 0x7F; k++) {
ram_refresh (WE_line, RAS_line, k);
}
for (i = 0; i <= 0xFF; i++) {
for (j = 0; j <= 0xFF; j++) {
write_address (WE_line, RAS_line, i, j, 0xAA);
}
}
for (i = 0; i <= 0xFF; i++) {
for (j = 0; j <= 0xFF; j++) {
count = count + check_bytes (WE_line, RAS_line, i, j, 0xAA, false);
}
}
for (i = 0; i <= 0xFF; i++) {
for (j = 0; j <= 0xFF; j++) {
write_address (WE_line, RAS_line, i, j, 0x55);
}
}
for (i = 0; i <= 0xFF; i++) {
for (j = 0; j <= 0xFF; j++) {
count = count + check_bytes (WE_line, RAS_line, i, j, 0x55, false);
}
}
printf ("FOUND %d ERRORS\n", count);
}
void check_bank_random(uint8_t WE_line, uint8_t RAS_line) {
uint16_t i, j, k;
uint32_t count = 0;
uint32_t Rn0 = get_rand_32();
uint32_t Rn = Rn0;
if (WE_line == WE_L)
gpio_put (SHIFT_EN, 0);
else
gpio_put (SHIFT_EN, 1);
for (k = 0; k <= 0x7F; k++) {
ram_refresh (WE_line, RAS_line, k);
}
for (i = 0; i <= 0xFF; i++) {
for (j = 0; j <= 0xFF; j++) {
write_address (WE_line, RAS_line, i, j, (uint8_t)Rn);
Rn = Rn * 1664525 + 1013904223;
}
}
Rn = Rn0;
for (i = 0; i <= 0xFF; i++) {
for (j = 0; j <= 0xFF; j++) {
count = count + check_bytes (WE_line, RAS_line, i, j, (uint8_t)Rn, true);
Rn = Rn * 1664525 + 1013904223;
}
}
printf ("%d ERR\n", count);
}
int main()
{
stdio_init_all();
// Set up our UART with the required speed.
uart_init(UART_ID, BAUD_RATE);
// Set the TX and RX pins by using the function select on the GPIO
// Set datasheet for more information on function select
gpio_set_function(UART_TX_PIN, UART_FUNCSEL_NUM(UART_ID, UART_TX_PIN));
gpio_set_function(UART_RX_PIN, UART_FUNCSEL_NUM(UART_ID, UART_RX_PIN));
gpio_address_mask = (1 << A01) | (1 << A02) | (1 << A03) | (1 << A04) | (1 << A05) | (1 << A06) | (1 << A07) | (1 << A08);
gpio_data_mask = (1 << D00) | (1 << D01) | (1 << D02) | (1 << D03) | (1 << D04) | (1 << D05) | (1 << D06) | (1 << D07);
gpio_controls_mask = (1 << RAS1) | (1 << RAS2) | (1 << WE_L) | (1 << WE_M) | (1 << CAS)| (1 << DATA_DIR) | (1 << SHIFT_EN);
gpio_init_mask (gpio_address_mask | gpio_data_mask | gpio_controls_mask);
gpio_set_dir_out_masked (gpio_address_mask | gpio_controls_mask);
gpio_set_dir_out_masked (gpio_data_mask);
gpio_set_outover (WE_L, GPIO_OVERRIDE_INVERT);
gpio_set_outover (WE_M, GPIO_OVERRIDE_INVERT);
gpio_set_outover (CAS, GPIO_OVERRIDE_INVERT);
gpio_set_outover (RAS1, GPIO_OVERRIDE_INVERT);
gpio_set_outover (RAS2, GPIO_OVERRIDE_INVERT);
gpio_put (RAS1, 1);
gpio_put (RAS2, 1);
gpio_put (WE_L, 1);
gpio_put (WE_M, 1);
gpio_put (CAS, 1);
gpio_put (DATA_DIR, 1);
gpio_put (SHIFT_EN, 1);
uint32_t pass = 0;
printf("BANKS 1-4: CONN -> XS1, pin 2 -> XS2:A3\n");
printf("BANKS 5-8: CONN -> XS2, pin 1 -> XS1:B16\n\n");
printf("TEST START\n");
printf("\nROW 1 (WE_L, RAS1)\n");
check_bank (WE_L, RAS1);
printf("\nROW 2 (WE_L, RAS2)\n");
check_bank (WE_L, RAS2);
printf("\nROW 3 (WE_M, RAS2)\n");
check_bank (WE_M, RAS2);
printf("\nROW 4 (WE_M, RAS1)\n");
check_bank (WE_M, RAS1);
printf("RANDOM VALUES TEST (INFINITE)\n\n");
while (true) {
pass++;
printf ("PASS %d\n", pass);
printf("ROW 1 (WE_L, RAS1): ");
check_bank_random (WE_L, RAS1);
printf("ROW 2 (WE_L, RAS2): ");
check_bank_random (WE_L, RAS2);
printf("ROW 3 (WE_M, RAS2): ");
check_bank_random (WE_M, RAS2);
printf("ROW 4 (WE_M, RAS1): ");
check_bank_random (WE_M, RAS1);
}
}
[свернуть]
slammy, Это-то понятно. Вопрос с тестированием памяти НВ1 и НВ2. Особенно с битыми единичными битами, когда по картинке не видно
Оо, коллега!
Прототип проходит испытания)
https://pic.maxiol.com/thumbs2/17379...116184421j.jpg
https://pic.maxiol.com/thumbs2/17379...ex6797aa65.png
Ох, коллеги, тут, похоже, одни железнячики, программистов нет :-(
Такие платки тестирования НП2 уже кто только не делал. Я еще лет 10 назад к sfrolov носил свои НП2 на тест.
А вот выдернуть из откомментированного листинга ПЗУ тест видео ОЗУ и сделать из него простую программку (хотя бы под RT11) никто так и не удосужился. Ждём программистов.....
- - - Добавлено - - -
Я бы, кстати, простимулировал какого-нибудь отважного программиста, который сделает тест ОЗУ НВ1 и НВ2 с каким-то минимально разумным выводом чего чинить.
Например, какой-нибудь платкой от Э85..... ;-)
Гляну в выходные (может и на неделе получится, но не обещаю) - сколько крови там может понадобиться :)
Подвыпал из жизни.
Разбирайте горячие дискеты с завода "Процессор". Даже не знаю что там, не до этого было.
Всех с праздниками!!
Для информации - начал копаться в тестовом ПЗУ
Есть что нужное на дискетах или шлак?
На очень беглый взгляд (не все флопы прошерстил) - есть немного софта, в том числе - MIM.TSK (редактор Микромир под P/Os ?) - запускать не пробовал
- - - Добавлено - - -
Вдогонку. Некий ПЕРВОНАЧАЛЬНЫЙ вариант тестирования видеоОЗУ набросал, немного подшлифую - выложу для проб и критики :)
Пока еще не выложил - можно предложить схему тестирования - у меня сейчас тупо записывает по всем (?) адресам 177777, потом 177776 и так пока не дойдёт до 0 :) Если есть идеи получше - you are welcome :)
Жжжж какая-то..
С одной стороны - что-то работает - если я пишу в отображённое видеоОЗУ - я вижу адекватный результат в эмуляторе.
Но как только я попробовал выбрать другие планы - первое, на что я обратил внимаение - всё рисуется зелёным цветом (а он вроде как на НВ2) и попытка выбрать другой цвет (план).. как-то не работает - всё равно зелёным...
Курю доку..
Можно то можно - но я не понимаю - ЧТО он тестирует :D
- - - Добавлено - - -
Так.. Перекур примерно на час :) Может голова придёт в себя :)
В общем, пока с красным и зелёным на НВ2 глухо.
Постараюсь за сегодня сделать вариант, который тестирует и сохраняет результаты для НВ1 и отдать в натурные испытания.
А дальше разбираться с ошибками на испытаниях и с НВ2
АААААА!!! Я НАШЁЛ!
У меня ошибка была в коде - пока не начал причёсывать код - в упор не видел!!
Когда поправил - сразу стала показывать и синий и красный и зеленый!!!
Не всё ещё нормально работает, но самое главное - основа работы в НВ1 и НВ2 была ПРАВИЛЬНАЯ!
Первый вариант. К сожалению, дорисовать сегодня логгирование не успел, зато вроде умеет определять наличие НВ2 и если его нет - тестирует только один план, а вот если есть... В общем - больше проверка концепции на реальном железе
http://www.KpXX.Ru/FTP/DFsdfA
Загружаемый образ дискеты в формате DZ, то есть пишем один в один на дискету или сбрасываем на Готек и вперёд.
Программа называется HBTEST :)
Логгирование уже завтра..... Постараюсь :)
Ну? Хто-нибудь на реальной Э85 уже попробовал?? :)