IPB

Здравствуйте, гость ( Вход | Регистрация )

2 Страницы V < 1 2  
Ответить в эту темуОткрыть новую тему
> Контроллер псевдодиска на MicroSD на шину МПИ, ДВК-1; ДВК-2; ДВК-3; ДВК-4; Электроника-60; Электроника 60М; Славутич ПК-1; УКНЦ
SuperMax
сообщение 26.4.2021, 7:36
Сообщение #21


Администратор
*****

Группа: Root Admin
Сообщений: 6 248
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Обновление драйверов AZ.

V05.00
  • командный файл генерации теперь выводит версию драйвера которую берет из AZ.MAC
  • при генерации задается вопрос использовать ли EIS инструкции (всегда используются для XM/XB/ZM/ZB/TSX-Plus драйвера)
  • драйверы для unmapped систем, идущие в комплекте собраны без EIS
  • добавлена команда SET AZ IDENT, показывающая версию и параметры драйвера
V05.01
  • функционально ничего не изменилось, появился выбор имени драйвера AZ/DA (прилагаются оба варианта)
v06.00
  • исправлена подпрограмма прерывания операции (она должна завершаться .DRFIN, а не RETURN)
v06.01
  • очистка адреса FORK-подпрограммы в блоке .FORK перед выходом для предотвращения возможного выполнения подпрограммы после прерывания операции
  • в командном файле генерации добавилась возможность сразу сгенерить оба варианта драйверов (AZ и DA)

Код
.IND AZGEN
;
;AZ/RT-11 HANDLER GENERATION PROGRAM.
;
;AZ V05.01
;
* USE EIS INSTRUCTIONS? [Y/N D:N]:
* ENTER HANDLER NAME (AZ/DA) [S R:0-204 D:"DA"]:
;
;BUILDING DA.SYS (RT-11SJ/SB/FB):
;  NO ERROR LOGGING SUPPORT
;  NO MEMORY MANAGEMENT SUPPORT
;  NO DEVICE TIMEOUT SUPPORT
;  USING BASE INSTRUCTION SET
;
.MAC/OB:DA AZPRE+AZ
.LIN/NOBI/EXE:DA.SYS DA
;
;BUILDING DAE.SYS (RT-11SJ/SB/FB):
;  ERROR LOGGING SUPPORT
;  NO MEMORY MANAGEMENT SUPPORT
;  NO DEVICE TIMEOUT SUPPORT
;  USING BASE INSTRUCTION SET
;
.MAC/OB:DAE AZPRE+AZ
.LIN/NOBI/EXE:DAE.SYS DAE
;
;BUILDING DAT.SYS (RT-11SJ/SB/FB):
;  NO ERROR LOGGING SUPPORT
;  NO MEMORY MANAGEMENT SUPPORT
;  DEVICE TIMEOUT SUPPORT
;  USING BASE INSTRUCTION SET
;
.MAC/OB:DAT AZPRE+AZ
.LIN/NOBI/EXE:DAT.SYS DAT
;
;BUILDING DAET.SYS (RT-11SJ/SB/FB):
;  ERROR LOGGING SUPPORT
;  NO MEMORY MANAGEMENT SUPPORT
;  DEVICE TIMEOUT SUPPORT
;  USING BASE INSTRUCTION SET
;
.MAC/OB:DAET AZPRE+AZ
.LIN/NOBI/EXE:DAET.SYS DAET
;
;BUILDING DAX.SYS (RT-11XM/XB/ZM/ZB/TSX-PLUS):
;  NO ERROR LOGGING SUPPORT
;  MEMORY MANAGEMENT SUPPORT
;  DEVICE TIMEOUT SUPPORT
;  USING EXTENDED INSTRUCTION SET
;
.MAC/OB:DAX AZPRE+AZ
.LIN/NOBI/EXE:DAX.SYS DAX
;
;BUILDING DAXE.SYS (RT-11XM/XB/ZM/ZB):
;  ERROR LOGGING SUPPORT
;  MEMORY MANAGEMENT SUPPORT
;  DEVICE TIMEOUT SUPPORT
;  USING EXTENDED INSTRUCTION SET
;
.MAC/OB:DAXE AZPRE+AZ
.LIN/NOBI/EXE:DAXE.SYS DAXE
;
.DEL/NOQ AZPRE.MAC
.DEL/NOQ DA(,E,T,ET,X,XE).OBJ
;
15-Apr-2021
DA    .SYS     3  15-Apr-2021    DAT   .SYS     3  15-Apr-2021
DAE   .SYS     3  15-Apr-2021    DAX   .SYS     3  15-Apr-2021
DAET  .SYS     3  15-Apr-2021    DAXE  .SYS     3  15-Apr-2021
6 Files, 18 Blocks
19561 Free blocks
;
@ <EOF>

.


Прикрепленный файл  azck41.dsk ( 24.5 килобайт ) Кол-во скачиваний: 713

Прикрепленный файл  azv40.dsk ( 25.5 килобайт ) Кол-во скачиваний: 685

Прикрепленный файл  azv41.dsk ( 25.5 килобайт ) Кол-во скачиваний: 711

Прикрепленный файл  azv50.dsk ( 28 килобайт ) Кол-во скачиваний: 585

Прикрепленный файл  azv51.dsk ( 37 килобайт ) Кол-во скачиваний: 698

Прикрепленный файл  azv60.dsk ( 37 килобайт ) Кол-во скачиваний: 609

Прикрепленный файл  azv61.dsk ( 37.5 килобайт ) Кол-во скачиваний: 682



--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SuperMax
сообщение 4.5.2021, 11:47
Сообщение #22


Администратор
*****

Группа: Root Admin
Сообщений: 6 248
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Выложил образ диска AZ с дистрибутивом RSX-11M-PLUS V4.6.
см https://zx-pk.ru/threads/28134-kontroller-p...l=1#post1113574

Изменения в дистрибутиве по сравнению с оригиналом:
  • добавлен векторизованный драйвер ввода/вывода DA: для устройства AZ
  • добавлен загружаемый/резидентный CRASH драйвер DA: для устройства AZ
  • исправлены выявленные ошибки в HELP файлах
  • в программе ACF добавлена поддержка автоконфигурации AZ
  • в программе ACF добавлена поддержка процессора ВМ3 (определяется как 11/23-PLUS)
  • в программе ACO добавлена поддержка AZ
  • в программе BOO добавлена поддержка устройства DA
  • в программе BOO при выполнении аппаратной загрузки (опция /HW) выполняется сброс перед передачей управления аппаратному загрузчику (это позволяет грузить любые системы таким способом, а не только RSX старых версий ради которых опция добавлялась)
  • в программе BRU добавлена проверка прав при восстановлении на смонтированный диск, чтобы простой пользователь не мог восстановить файлы туда куда он не должен иметь доступа
  • в программе FLX устройство DA отмечено как допустимое для файловой системы RT-11
  • в программе HRC добавлено выставление типа устройства AZ11 для устройства DA
  • в программе IOX устройство DA автоматически конфигурируется как диск
  • в программе MCR для команды DEV /LOG сделано выравнивание даты для более приятного отображения
  • в программе MCR для команды CLI опция /LGO переименована в /LOG (как написано в документации и HELP файле)
  • в программе MCR команда SET /NOPAR сделана привилегированной
  • в программе RMD поправлено отображение свободного места для больших дисков на терминале VT52
  • в программе SAV добавлена поддержка устройства DA
  • в программе SAV при обнаружении процессора ВМ3 выставляется Q-Bus в параметрах системы, а тип процессора выставляется как 23
  • в программе VMR добавлена проверка прав для открываемого файла образа
  • исправлена ошибка в SYSGEN, приводящая к сбою если система не поддерживает разделение пространства инструкций и данных
  • в SYSGEN добавлена поддержка устройства DA:
ВАЖНО: для нормальной работы RSX-11M-PLUS требуется Firmware v1.7 или новее.
Для поддержки более 8 устройств требуется Firmware v2.0 или новее.

Для контроллера AZ поддерживается автоконфигурация. При этом количество устройств будет посчитано по максимальному используемому номеру. Если такой вариант не подходит - можно подправить результат автоконфигурации.

Если при генерации не была выбрана автоконфигурация или было выбрано изменение результатов автоконфигурации - будут заданы вопросы про количество AZ11 контроллеров (пока поддерживается не более одного), про количестве устройств, про соответствие номеров устройств драйвера физическим номерам устройств, а также про адрес регистра контроллера и его вектор.
В большинстве случаев можно использовать ответы по умолчанию.
Следует обратить внимание, что в вопросах про номер устройства используется восьмеричная система счисления, тогда как в файле AZ.INI - десятичная.
Код
>;
>;   DA:    controller: AZ11
>;
>; The AZ11 disk controller supports up to 32 disk drives mapped to
>; disk image files stored on FAT32-formatted microSD memory stick.
>;
>* CP3604  How many AZ11 disk image controllers do you have? [O R:0-1 D:0]: 1
>;
>; Enter the total number of AZ11 disk drives in your system.
>;
>* CP3608  How many AZ11 disk drives do you have? [D R:1.-32. D:32.]:
>;
>;
>; The physical unit number of a drive is the number specified
>; in AZ.INI file in the root of microSDHC card filesystem.
>;
>* CP3636  What is the physical unit number of DA0:? [O R:0-37 D:0]:
>;
>;
>* CP3636  What is the physical unit number of DA1:? [O R:0-37 D:1]:
...
>;
>* CP3636  What is the physical unit number of DA37:? [O R:0-37 D:37]:
>;
>;
>; Enter the vector address for this controller.  This vector address
>; can be changed after the SYSGEN by using the VMR CON SET command.
>;
>* CP3668  Enter the vector address of DAA [O R:60-774 D:174]:
>;
>; Enter the CSR address for this controller.  This CSR address can
>; be changed after the SYSGEN by using the VMR CON SET command.
>;
>* CP3672  What is its CSR address? [O R:160000-177700 D:177220]:


Особенности генерации системы на ДВК:

Прежде всего стоит отметить, что для нормальной работы системы требуется хотя бы 512Кб памяти.
В принципе загрузить RSX-11M-PLUS можно и в 256Кб (минимальная 22-битная конфигурация), но процесс подготовки системы к этому весьма трудоемкий, а результат не будет стоить затраченных усилий.

В базовой системе используется частота таймера 60Hz.
Если хочется более точно наблюдать за временем в процессе генерации системы - стоит установить правильную частоту и время перед запуском SYSGEN.
Код
>CON SET SYS $TKPS=50.
>TIM 28-APR-2021 22:54:30

В данном дистрибутиве ACF определяет процессор ВМ3 как 11/23-PLUS - это позволяет использовать автоконфигурацию оборудования.
Код
>* SU100   Do you want to run Autoconfigure on the host system
>*         hardware? [Y/N D:N]: [B]Y[/B]

Если автоконфигурация не была выбрана - на вопрос о типе процессора стоит ввести 11/23-PLUS.
Код
>* CE010   What is your target processor type? [S R:3.-12. D:"11/70"]: [B]11/23-PLUS[/B]

Процессор ВМ3 не поддерживает разделения пространств инструкций и данных. Для таких систем лучше не включать XDT при генерации (это уменьшает количество свободной динамической памяти), а использовать загружаемый XDT.
Код
* CE270   Do you want to include XDT? [Y/N D:N]: [B]N[/B]

В качестве устройства крэш-дампа стоит выбрать XX: (загружаемый драйвер).
Код
>* CE290   On what device and unit do you want crash dumps
>*         to be written? [S R:2-6]: [B]XX:[/B]

После завершения процесса генерации, грузим новую систему командой BOO [1,54] и сохраняем с записью апраратного загрузчика командой SAV /WB. Так же для улучшения производительности стоит добавить опцию /MOU="/ACP=UNIQUE".
Код
>SAV /WB/MOU="/ACP=UNIQUE"


В рабочей системе есть смысл включить кэширование дисков (если память позволяет). Это значительно ускоряет работу (хотя и не всегда).
Код
>SET /CACHE=LB:(CRE=::1200:TOP,LOG=10,VIR=10,DIR=10,OVE=  10,REA=10,DEF)


Можно загрузить системный отладчик XDT.
Код
>LOA /EXP=XDT/VEC/FLAGS=2/HIGH


На случай сбоев можно загрузить CRASH драйвер DA: для сохранения аварийного дампа с целью его анализа программой CDA.
Код
>SET /CRASHDEV=DA37:


https://youtu.be/0TiHkDidjtE

Прикрепленный файл  rsxmp46.rar ( 6.95 мегабайт ) Кол-во скачиваний: 666




--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SuperMax
сообщение 10.11.2022, 13:33
Сообщение #23


Администратор
*****

Группа: Root Admin
Сообщений: 6 248
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Новые команды контроллеров AZ*
Старые команды тут

Работа с энергонезависимой памятью

интерфейс предоставляет любому AZ-контроллеру доступ к 255 словам энергонезависимой памяти:
для работы есть команды
021: //считать блок 1 энергонезависимой памяти в буфер
022: // отдать на шину считанный блок энергонезависимой памяти из буфера
023: // принять с шины в буфер данные для последующей записи в буфер
024: // записать из буфера в блок 1 энергонезависимой памяти
все команды по выполнению, просто устанавливает бит готовности по завершению

примеры работы

Код

AZ$CSR      = 177220; регистр команд и состояния (CSR)
AZ$DR       = 177222; регистр данных (DR)


; trap 50 - cброс AZ
; результат в R1  =0 ok
AZreset:        MOV     #AZ$CSR,R1
1$:             CLR     (R1); Пошлем команду "Сброс"
                TSTB    (R1); Проверим готовность контроллера
                BPL     1$; Если не готов, сбрасываем еще
            ; раз и проверяем снова
                TST     (R1); Проверим на ошибку,
                BMI     0ERR$
                CLR     R1
                return
0ERR$:          CLR     R1
                COM     R1
                return


; trap 54 - чтение энергонезависимой памяти блока 1 EEPROM в буфер с адреса ADREEPROMMEM
; результат R3 - адрес, если R3=0 ошибка
; статус чтения в R1 0 - ok
; 1 - размер не соответствует сохраненному
; 2 - oшибка версии
; 3 - oшибка контрольной суммы
ReadEEPROM:     push    R2
                call    AZreset; сбросим
                tst     R1
                bne     0ERR$
; теперь читаем
                MOV     #AZ$CSR,R1
                mov     #21,(R1); считать блок 1 энергонезависимой памяти в буфер
0$:             TSTB    (R1); проверяем результат выполнения
                BPL     0$; ждем
                mov     #22,(R1); отдать на шину считанный блок  энергонезависимой памяти из буфера
1$:             TSTB    (R1); проверяем результат выполнения
                BPL     1$; ждем
                TST     (R1)+; инкрементируем
                mov     #ADREEPROMMEM,R3
                mov     #256.,R2; читаем 256. слов; первое слово - результат чтения
2$:             mov     (R1),(R3)+; читаем блок слов в память
                sob     R2,2$
                mov     #ADREEPROMMEM,R3; успешно
                mov     (R3),R1
                br      0END$
0ERR$:          CLR     R3
0END$:          pop     R2
                return


; trap 55 - запись энергонезависимой памяти из буфера с адреса ADREEPROMMEM в блок 1 EEPROM
WriteEEPROM:    push    R1
                push    R2
                push    R3
                call    AZreset; сбросим
                tst     R1
                bne     0ERR$

                MOV     #AZ$CSR,R1
                mov     #23,(R1); командуем что будем писать данные в буфер
0$:             TSTB    (R1); проверяем результат выполнения
                BPL     0$; ждем
                TST     (R1)+; инкрементируем
                mov     #ADREEPROMMEM+2,R3
                mov     #255.,R2; пишем 255. слов; первое слово пропускаем - результат чтения
1$:             mov     (R3)+,(R1); отдаем в контроллер
                sob     R2,1$
                tst     -(R1); декрементируем
                mov     #24,(R1); записать из буфера в блок 1 энергонезависимой памяти
2$:             TSTB    (R1); проверяем результат выполнения
                BPL     2$; ждем
                br      0END$
0ERR$:          CLR     R3
0END$:          pop     R3
                pop     R2
                pop     R1
                return


очевидно, после считывания памяти необходимо проверить код результата в первом слове - см расшифровку кодов ошибок

Примеры возвращаемых данных по командам

последовательная подача команды 021 и затем 022 позволит считать 256. слов
из энергонезависимой памяти
первое слово это будет статус успешности чтения
коды ошибок
; 0 - ok
; 1 - размер не соответствует сохраненному
; 2 - oшибка версии
; 3 - oшибка контрольной суммы

технически для эмуляции данного фунционала, нужен файл 255. слов.
Обращаю внимание, при записи, буфер идет сразу с данными, те нет первого слова со статусом.



Считывание версии
027: // отдаем версию firmware AZ STM32
типовое возвращаемое значение на шину
первое слово - 06404 = старший байт 13. это версия прошивки, младший байт 4. это версия железа - те AZБК в данном случае
второе слово - 037 = это максимальный монтируемый диск - 31.



RTC Часы

031: // получить время из часов МК в буфер timestamp
032: // получить время из буфера timestamp в МПИ
033: // запись времени-даты в буфер (ручная установка часов) формат SimpleIN ( 7 слов)
034: // установка автономных часов на основании данных из буфера
035: // стимуляция запроса времени с NTP сервера, установка на основании ответа
036: // установка автономных часов STM32 на основании часов в TCP/IP стеке
042: // получить время из часов TCP/IP стека в буфер timestamp
все команды по выполнению, просто устанавливает бит готовности по завершению

формат timestamp на чтение
Код

; формат буфера даты-времени
; offset в восьмеричной системе - те слова
; формат буфера даты-времени
; offset
;    [0]=rtc_rt11date();
;    [2]=rt11 time 50Hz big word;
;    [4]=rt11 time 50Hz little word;
;    [6]=rt11 time 60Hz big word;
;    [10]=rt11 time 60Hz little word;
;    [12]=rtc_fat_date();
;    [14]=rtc_fat_time();
;    [16]=year+2000;
;    [20]=month;
;    [22]=day;
;    [24]=wday;
;    [26]=hour;
;    [30]=min;
;    [32]=sec;


формат буфера SimpleIN - 7 слов
Код

;    [0]=year       год, младшие две цифры - те 22 а не 2022(!)
;    [2]=month;     месяц
;    [4]=day;       день
;    [6]=wday;      день недели =0 не установлен, 1- понедельник 2 - вторник итд
;    [10]=hour;     час
;    [12]=min;      минута
;    [14]=sec;      секунда


Примеры работы с часами

Получение времени
Код

; работа с часами
; trap 60 - чтение данных часов из TCP/IP стека
; R3 - адрес буфера куда надо считать
; результат в R3 адрес, если успешно. R3=0  если ошибка
GetDateFromLAN: push    R0
                push    R1
                push    R2
                call    AZreset; сбросим
                tst     R1
                bne     G60ERR
                MOV     #AZ$CSR,R1
                mov     #42,(R1)
G60:            TSTB    (R1); проверяем результат выполнения
                BPL     G60; ждем
                mov     #32,(R1)
1$:             TSTB    (R1); проверяем результат выполнения
                BPL     1$; ждем
                TST     (R1)+; инкрементируем
                mov     R3,R0; запомним R3 - адрес
                mov     #10.,R2; читаем 10 слов
2$:             mov     (R1),(R3)+; читаем блок слов в память
                sob     R2,2$
                mov     R0,R3; успешно, вернем адрес в R3
                br      0END$
G60ERR:         CLR     R3
0END$:          pop     R2
                pop     R1
                pop     R0
                return


; trap 61 - чтение данных часов из автономных часов RTC
; R3 - адрес буфера куда надо считать
; результат в R3 адрес, если успешно. R3=0  если ошибка
GetDateFromRTC: push    R0
                push    R1
                push    R2
                call    AZreset; сбросим
                tst     R1
                bne     G60ERR
                MOV     #AZ$CSR,R1
                mov     #31,(R1)
                br      G60; идем туда тк дальше код одинаковый


отсылка запроса на установку времени с NTP сервера
Код
; trap 62 - отсылка запроса на установку времени с NTP сервера
GetDateNTPtoNET:push    R1
                call    AZreset; сбросим
                tst     R1
                bne     0ERR$
                MOV     #AZ$CSR,R1
                mov     #35,(R1)
0$:             TSTB    (R1); проверяем результат выполнения
                BPL     0$; ждем
0ERR$:          pop     R1
                return

технически на это надо 1-2 секунды

проверка
Код

; trap 63 - проверка корректности времени
; R3 - адрес буфера, результат в R3, если адрес буфера то OK, =0 ошибка
CheckDateTime:  Cmp     6(r3),#2021.
                Blos    1err
                Cmp     6(r3),#2100.
                Bhi     1err
0ok$:           return
1err$:          clr     R3
                return


пример цикла опроса с целью получить время с сети
Код

; дата-время
                mov     #S_DateTime_0,R3; "Lan Date:"
                trap    10
                mov     #20,R4; количество циклов ожидания
$datry:         trap    62; отослали запрос к NTP серверу
                mov     #110,@#AZ$CSR; включим сеть
                trap    47; ожидание
                trap    47; ожидание
                mov     #ADRTMPSTR,R3
                trap    60; считали в буфер дату-время
                trap    63; проверили дату-время
                tst     R3
                bne     $ok
$sob:           sob     R4,$datry
                mov     #S_DateTime_2,R3; печать ошибки
                trap    7
                br      $go

$ok:            mov     #ADRTMPSTR,R3
                trap    24; печать даты
                trap    25; времени
$go:            mov     #110,@#AZ$CSR; включим сеть



установка времени RTC на основании времени стека
Код

; trap 64 - установка времени RTC на основании времени стека
; R1 - результат  R1=0 - OK
SetDateNETtoRTC:call    AZreset; сбросим
                tst     R1
                bne     0ERR$
                MOV     #AZ$CSR,R1
                mov     #36,(R1)
0$:             TSTB    (R1); проверяем результат выполнения
                BPL     0$; ждем                
                clr     R1
0ERR$:          return


те изначально надо получить в стеке нормальное время, затем установить время в RTC на основании времени стека

Примеры возвращаемых данных, восьмеричные значения

067362 ; [0]=rtc_rt11date();
000062 ; [2]=rt11 time 50Hz big word;
024240; [4]=rt11 time 50Hz little word;
000074; [6]=rt11 time 60Hz big word;
030300; [10]=rt11 time 60Hz little word;
055567; [12]=rtc_fat_date();
044766; [14]=rtc_fat_time();
003746; [16]=year+2000;
000013; [20]=month;
000027; [22]=day;
000003; [24]=wday;
000022; [26]=hour;
000017; [30]=min;
000054; [32]=sec;


Пример исходного кода который формирует данные форматы даты-времени

Код

// функция форматирования даты в формат FAT
// Двухбайтовая отметка даты имеет следующий формат:
//    биты 0–4 — день месяца, допускаются значения 1–31;
//    биты 5–8 — месяц года, допускаются значения 1–12;
//    биты 9–15 — год, считая от 1980 года («эпоха MS-DOS»), возможны значения от 0 до 127 включительно, то есть 1980–2107 годы.
unsigned short int rtc_fat_date(void)
{
  unsigned char day    , month , year;  
  rtc_get_date(&day,&month,&year);    
  return(day+month*32+(year-1980)*256);
}
//

// функция форматирования времени в формат FAT
//Двухбайтовая отметка времени имеет следующий формат:
//    биты 0–4 — счётчик секунд (по две), допустимы значения 0–29, то есть 0–58 секунд;
//    биты 5–10 — минуты, допустимы значения 0–59;
//    биты 11–15 — часы, допустимы значения 0–23.
unsigned short int rtc_fat_time(void)
{    
    unsigned char hour,min,sec;
    rtc_get_time(&hour,&min,&sec);
    return(sec/2+min*32+hour*1024);
}
//

// функция форматирования даты в формат RT11
unsigned short int rtc_rt11date(void)
{
    unsigned char mday    , mmonth , myear;    
    rtc_get_date(&mday,&mmonth,&myear);    
    unsigned short int rt11date;
        
    myear = myear + 2000 - 1972;
    rt11date= (myear / 32) <<14 | mmonth<<10 | mday <<5 | (myear % 32);
    
    //printf("rtc_rt11date: a.m.d.y=%d.%d.%d.%d > 0%06o  ", (myear / 32), mmonth, mday, (myear % 32), rt11date);
    return rt11date;
}
//



// функция форматирования времени в формат RT11 для таймера 50Гц
unsigned int rtc_rt11time50(void)
{
    unsigned char hour,min,sec;  
    rtc_get_time(&hour,&min,&sec);    
    
    unsigned int rt11time;
    
    rt11time = hour * 3600 * 50 + min * 60 * 50 + sec * 50;

    //printf("rtc_rt11time50: %d  -> %06o . %06o    ",rt11time , (unsigned short int) (rt11time>>16) , (unsigned short int) (rt11time & 0xFFFF) );
    return (rt11time);
}
//

// функция форматирования времени в формат RT11 для таймера 60Гц
unsigned int rtc_rt11time60(void)
{
    unsigned char hour,min,sec;
    rtc_get_time(&hour,&min,&sec);    
    
    unsigned int rt11time;
    
    rt11time = hour * 3600 * 60 + min * 60 * 60 + sec * 60;
    
    //printf("rtc_rt11time60: %d  -> %06o . %06o    ",rt11time , (unsigned short int) (rt11time>>16) , (unsigned short int) (rt11time & 0xFFFF) );
    return (rt11time);
}
//






Перезапуск БК аппаратный, команда актуальна только для AZБК
остальные AZ ее игнорируют

037: // перезапуск AZБК и всей БК

пример применения
Код

AZ$CSR      = 177220; регистр команд и состояния (CSR)
AZ$DR       = 177222; регистр данных (DR)


; trap 57 - перезапуск БК полный
AZcouldReboot:  call    AZreset; сбросим AZ дабы он был готов принимать команды
                mov     #37,@#AZ$CSR
                return






Работа со стеком TCP/IP

040: // получить ip адреса в буфер
041: // чтение буфера ip адреса - 8 слов 16bit

эта пара команд позволяет получить текущую информацию со стека
- IP адрес
- MASK маску
- GW гейтвей
- NTP адрес NTP-сервера
- DNS1 адрес основного DNS
- DNS2 адрес резервного DNS
соответственно это 12 слов (16bit)

примеры работы
Код

; trap 52 - чтение блока IP адресов в блок памяти IPADDDBLOCK (8. ячеек)
; результат в R3 =0 error, иначе адрес куда считано (IPADDDBLOCK)
GetIPaddrs:     push    R1
                push    R2
                call    AZreset; сбросим
                tst     R1
                bne     0ERR$
                MOV     #AZ$CSR,R1
                mov     #40,(R1)
0$:             TSTB    (R1); прочитать адреса в свою память
                BPL     0$; ждем
                mov     #41,(R1)
1$:             TSTB    (R1); подготовить буфер
                BPL     1$; ждем
                TST     (R1)+; инкрементируем
                mov     #IPADDDBLOCK,R3
                mov     #12.,R2
2$:             mov     (R1),(R3)+; читаем блок слов в память
                sob     R2,2$
                mov     #IPADDDBLOCK,R3; успешно
                br      0END$
0ERR$:          CLR     R3
0END$:          pop     R2
                pop     R1
                return


Примеры данных - возвращаемые слова в восьмеричном формате
124300 116400 - IP адрес 192.168.0.157
177777 000377 - MASK маску 255.255.255.0
124300 000400 - GW гейтвей 192.168.0.1
124300 000400 - NTP адрес NTP-сервера 192.168.0.1
124300 050000 - DNS1 адрес основного DNS 192.168.0.90
124300 055000 - DNS2 адрес резервного DNS 192.168.0.80



Работа с SD картой, дополнительные функции

данный комплект команд позволяет читать/писать файлы на карточку
те можно сделать процедуры копирования файлов с карточки и на карточку

050: установить имя файла который будем читать
051: получить размер файла на чтение (или его статус) на МПИ
052: читать блок установленного файла в буфер

эти команды используют буфер 256. слов который задействован в интерфейсе работы с энергонезависимой памятью (см выше команды 022 023)

буфер длины имени файла 128. слов = 256 байт

Соответственно схема чтения файла выглядит вот так
023 - заливаем имя файла в буфер
050 - устанавливаем файл на чтение
051 - читаем длину файла или ошибку открытия файла
если ошибка - повторяем сначала 023 050 051
если все ok - приступаем к чтению файла
052 - читает блок файла в буфер
022 - забираем данные из буфера
пары 052 022 повторяем нужное количество раз дабы считать весь файл
как файл будет считан - последняя 052 команда закроет его автоматически

формирование ошибки выглядит так:
sizeanyfile=1<<31 + FFres; // если установлен старший бит 32х битного слова - то в младшей части код ошибки

FFres = ошибка FatFS
см
http://elm-chan.org/fsw/ff/doc/open.html
Прикрепленное изображение

Код

typedef enum {
    FR_OK = 0,                /* (0) Succeeded */
    FR_DISK_ERR,            /* (1) A hard error occurred in the low level disk I/O layer */
    FR_INT_ERR,                /* (2) Assertion failed */
    FR_NOT_READY,            /* (3) The physical drive cannot work */
    FR_NO_FILE,                /* (4) Could not find the file */
    FR_NO_PATH,                /* (5) Could not find the path */
    FR_INVALID_NAME,        /* (6) The path name format is invalid */
    FR_DENIED,                /* (7) Access denied due to prohibited access or directory full */
    FR_EXIST,                /* (8) Access denied due to prohibited access */
    FR_INVALID_OBJECT,        /* (9) The file/directory object is invalid */
    FR_WRITE_PROTECTED,        /* (10) The physical drive is write protected */
    FR_INVALID_DRIVE,        /* (11) The logical drive number is invalid */
    FR_NOT_ENABLED,            /* (12) The volume has no work area */
    FR_NO_FILESYSTEM,        /* (13) There is no valid FAT volume */
    FR_MKFS_ABORTED,        /* (14) The f_mkfs() aborted due to any problem */
    FR_TIMEOUT,                /* (15) Could not get a grant to access the volume within defined period */
    FR_LOCKED,                /* (16) The operation is rejected according to the file sharing policy */
    FR_NOT_ENOUGH_CORE,        /* (17) LFN working buffer could not be allocated */
    FR_TOO_MANY_OPEN_FILES,    /* (18) Number of open files > _FS_LOCK */
    FR_INVALID_PARAMETER    /* (19) Given parameter is invalid */
} FRESULT;



пример кода для чтения файла и вывода его на экран
Код

                call    AZRST; сбросим

; заливаем в буфер имя файла
7$:             mov     #23,(R1); командуем что будем писать данные в буфер
5$:             TSTB    (R1); проверяем результат выполнения
                BPL     5$  ; ждем
                TST     (R1)+; инкрементируем
                mov     #FILNM,R3
1$:             mov     (R3),(R1); отдаем в контроллер
                tst     (R3)+
                bne     1$
                tst     -(R1); декрементируем


    ; устанавливаем файл на чтение
                mov     #50,(R1); устанавливаем файл на чтение
2$:             TSTB    (R1); проверяем результат выполнения
                BPL     2$  ; ждем


    ; читаем длину файда
                mov     #51,(R1); устанавливаем файл на чтение
3$:             TSTB    (R1); проверяем результат выполнения
                BPL     3$  ; ждем
                TST     (R1)+; инкрементируем
                mov     #FILSZ,R3
                mov     (R1),(R3)+; читаем с контроллера
                mov     (R1),(R3); читаем с контроллера

    ; выведем длину файла на экран
                clr     R0
                mov     #FILSZ+2,R3
                mov     (R3),R1
                call    DNOZ
                mov     -(R3),R1
                call    DNOZ
                .print   #STMS2

    ; читаем файл
                mov     R1,R4; в R1 осталась длина файла
                MOV     #AZ$CSR,R1
                mov     #BUFFL,R5

                bit     #1,R4; если нечетное число байт
                beq     47$
                inc      R4; добавим еще 1 байт тк читаем словами

47$:            tst     R4
                beq     45$ ; уже нечего читать - выходим


                mov     #52,(R1); читаем блок в буфер
4$:             TSTB    (R1); проверяем результат выполнения
                BPL     4$  ; ждем
                mov     #22,(R1); будем читать буфер
51$:            TSTB    (R1); проверяем результат выполнения
                BPL     51$ ; ждем

                cmp     R4,#512.; сравниваем c размером буфера в байтах
                Blos    44$ ; осталось меньше чем буфер


                .print  #STMS1
                mov     #256.,R2
                TST     (R1)+; переходим на регистр данных
46$:            mov     (R1),(R5)+; читаем в буфер
                sob     R2,46$
                sub     #512.,R4; вычитаем
                TST     -(R1); переходим на регистр команд
                br      47$

44$:            .print  #STMS3
                mov     R4,R2
                asr     R2  ; /2 тк читаем словами
                TST     (R1)+; переходим на регистр данных
43$:            mov     (R1),(R5)+; читаем в буфер
                sob     R2,43$


45$:            clr     (R5); проставим конец файла
    ; файл считан - выводим на экран
                .print   #STMS4
                .print  #BUFFL
                .print   #STMS5


                mov     #110,@#AZ$CSR; включаем сеть
                .Exit

пример полностью в виде утилиты RT11 выложен вот тут


Для записи файла добавлены команды
053: установить имя файла который будем писать
054: установка длины файла
055: записать в файл данные из буфера

Схема подачи команд при записи вот такая
023 - заливаем имя файла в буфер
053 - устанавливаем файл на чтение
051 - статус открытия/создания файла
если ошибка - повторяем сначала 023 053 051
если все ok - идем дальше
054 - установка длины файла, те надо сразу объявить какая у нас будет длина файла
023 - заливаем блок данных в буфер
055 - пишем из буфера в файл
пары 023 055 повторяем нужное количество раз дабы записать весь файл
как файл будет записан - последняя 055 команда закроет его автоматически


пример кода записи файла
Код

; заливаем в буфер имя файла
                MOV     #AZ$CSR,R1
17$:            mov     #23,(R1); командуем что будем писать данные в буфер
15$:            TSTB    (R1)    ; проверяем результат выполнения
                BPL     15$     ; ждем
                TST     (R1)+   ; переходим на регистр данных
                mov     #FILNM2,R3
11$:             mov    (R3),(R1); отдаем в контроллер
                tst     (R3)+
                bne     11$
                tst     -(R1)   ; переходим на регистр команд

        ; устанавливаем файл на запись
                mov     #53,(R1); устанавливаем файл на запись
12$:            TSTB    (R1)    ; проверяем результат выполнения
                BPL     12$     ; ждем


        ; читаем статус создания файла
                mov     #51,(R1)
13$:            TSTB    (R1)    ; проверяем результат выполнения
                BPL     13$     ; ждем
                TST     (R1)+   ; переходим на регистр данных
                mov     #STATS,R3
                mov     (R1),(R3)+; читаем с контроллера
                mov     (R1),(R3); читаем с контроллера

        ; тут надо проверить - если файл создан то оба слова нулевые
                mov     #STATS,R3
                TST     (R3)+
                BNE     66$
                TST     (R3)
                BEQ     60$
66$:            .print  #ERRMS1 ; печать ошибки
                .exit

60$:            MOV     #AZ$CSR,R1
                mov     #54,(R1); установим длину файла который будем писать
23$:            TSTB    (R1)    ; проверяем результат выполнения
                BPL     23$     ; ждем
                TST     (R1)+   ; переходим на регистр данных
                mov     #FILSZ,R3
                mov     (R3)+,(R1); пишем в контроллер
                mov     (R3),(R1); пишем в контроллер

                tst     -(R1)   ; переходим на регистр команд



        ; пишем файл
                mov     @#FILSZ,R4; длина файла
                MOV     #AZ$CSR,R1
                mov     #BUFFL,R5; буфер файла

                bit     #1,R4   ; если нечетное число байт
                beq     147$
                inc      R4   ; добавим еще 1 байт тк читаем словами

147$:           tst     R4      ; проверим длину
                beq     145$    ; уже нечего писать - выходим

                mov     #23,(R1); будем писать в буфер
151$:           TSTB    (R1)    ; проверяем результат выполнения
                BPL     151$    ; ждем

                cmp     R4,#512.; сравниваем c размером буфера в байтах
                Blos    144$    ; осталось меньше чем буфер

                .print  #STMS6  ; заливка полного блока
                mov     #256.,R2
                TST     (R1)+   ; переходим на регистр данных
146$:           mov     (R5)+,(R1); пишем в буфер контроллера
                sob     R2,146$
                sub     #512.,R4; вычитаем
                TST     -(R1)   ; переходим на регистр команд

                mov     #55,(R1); запись буфера в файл
104$:           TSTB    (R1)    ; проверяем результат выполнения
                BPL     104$    ; ждем
                br      147$    ; в начало

144$:            .print  #STMS7 ; заливка последнего блока
                TST     (R1)+   ; переходим на регистр данных
                mov     R4,R2
                asr     R2      ; /2 тк пишем словами
143$:           mov     (R5)+,(R1); пишем в буфер контроллера
                sob     R2,143$

                TST     -(R1)   ; переходим на регистр команд
                mov     #55,(R1); запись пследнего буфера в файл
105$:           TSTB    (R1)    ; проверяем результат выполнения
                BPL     105$    ; ждем

145$:           .print #STMSE   ; конец
                mov     #110,@#AZ$CSR; включаем сеть
                .Exit           ; выходим


пример полностью в виде утилиты RT11 выложен вот тут


получение объема SD карты всего/свободно в мегабайтах

056: // получить данные по размеру карты в буфер sizecard

057: // чтение буфера sizecard - 2 cлова 16bit
первое слово - общий объем карты доступный для FAT в МБ
второе слово - свободный объем на карте в МБ

Код

; trap 51 - получение объема SD карты всего/свободно в мегабайтах
; результат в R1 - всего; R2 - свободно
GetSizeSD:      call    AZreset; сбросим
                tst     R1
                bne     0ERR$
                MOV     #AZ$CSR,R1
                mov     #56,(R1)
1$:             TSTB    (R1); подготовить буфер
                BPL     1$; ждем
                mov     #57,(R1)
2$:             TSTB    (R1); подготовить буфер
                BPL     2$; ждем
                mov     @#AZ$DR ,R1; всего мегабайт
                mov     @#AZ$DR ,R2; свободно мегабайт
                return
                clr     R1
                clr     R2
                return


Примеры данных
035521 - всего на карточке мегабайт - 15185.
035417 - свободно мегабайт - 15119.



Старые команды тут


--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SuperMax
сообщение 26.11.2022, 15:49
Сообщение #24


Администратор
*****

Группа: Root Admin
Сообщений: 6 248
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Прошивка V13 от 2022-11-26
(единая нумерация с AZБК - дабы уменьшить отличия прошивок)

добавлен блок команд - см выше
работают часы и прочие навороты

Утилита установки времени AZSDT выложена тут


cама прошивка STM32
Прикрепленный файл  AZ_v2.13.rar ( 70.9 килобайт ) Кол-во скачиваний: 234

данная прошивка для AZ-МПИ AZ-УКНЦ AZ-QBUS v1.xx и 2.xx
прошивка для GAL-ок или EPM240 прежняя, менять не надо


Важный момент, не забудьте явно проставить в блоке NETWORK свой часовой пояс
иначе время будет GMT

Рабочий образ
Прикрепленный файл  PDP_11_2022_11_26_for_v13.rar ( 14.85 мегабайт ) Кол-во скачиваний: 234


Типовая работа AZSDT при наличии сети
Прикрепленное изображение

Типовая работа AZSDT при отключенной сети, но выставленном времени-дате в RTC
Прикрепленное изображение



--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
SuperMax
сообщение 20.3.2023, 13:59
Сообщение #25


Администратор
*****

Группа: Root Admin
Сообщений: 6 248
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Новые команды контроллеров AZ*
Старые команды тут и тут

данные команды действительны для контроллеров начиная с V14 прошивки


Работа со стеком TCP/IP
043 чтение MAC-адреса в ip буфер

данная команда читает текущий фактический MAC адрес в буфер IP адресов
те сначала 043 а затем 041 команды

пример применения
Код

; trap 72 - чтение MAC адреса в блок памяти IPADDDBLOCK (12. ячеек)
; результат в R3 =0 error, иначе адрес куда считано (IPADDDBLOCK)
GetMACaddrs:    push    R1
                push    R2
                call    AZreset      ; сбросим
                tst     R1
                bne     0ERR$
                MOV     #AZ$CSR,R1
                mov     #43,(R1)
0$:             TSTB    (R1)         ; прочитать адреса в свою память
                BPL     0$           ; ждем
                mov     #41,(R1)
1$:             TSTB    (R1)         ; подготовить буфер
                BPL     1$           ; ждем
                TST     (R1)+        ; инкрементируем
                mov     #IPADDDBLOCK,R3
                mov     #12.,R2
2$:             mov     (R1),(R3)+   ; читаем блок слов в память
                sob     R2,2$
                mov     #IPADDDBLOCK,R3; успешно
                br      0END$
0ERR$:          CLR     R3
0END$:          pop     R2
                pop     R1
                return



--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 Страницы V < 1 2
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 4.12.2023, 17:06