Changes for page API контроллеров AZ®
Last modified by Max on 2025/03/02 15:18
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -480,49 +480,49 @@ 480 480 {{code language="assembler"}} 481 481 ;.................................. 482 482 483 -WrBuf=016; Symbolicnameof the command483 +WrBuf=016; Символическое наименование команды 484 484 485 -; Beforewriting,youneedtoperformthesameactionsas in486 -; pp. 3.1.-3.3.Usually,thisisthesameprogram,487 -; justafterpoint3.3.acheckis performed"What488 -; is required:readingorwriting?"andabranch is made to the489 -; readingorwritingprogram.485 +; Перед записью нужно выполнить те же действия, что и в 486 +; пп. 3.1.-3.3. Обычно, это одна и та же программа, 487 +; просто после пункта 3.3. выполняется проверка "Что 488 +; требуется: чтение или запись?" и разветвление на 489 +; программу чтения или записи. 490 490 491 -; Afterthefragmentinpoint3.3.,theCSRaddress492 -; (177220) remains in R3.WewillassumethatR2containstheaddress in the CPU493 -; memorywheretheblocktobewritten is located.494 -; Theprogramforobtainingthisaddress is not shown.491 +; После фрагмента в п. 3.3. в R3 остался адрес CSR 492 +; (177220). Будем считать, что в R2 находится адрес в 493 +; памяти ЦП, где находится блок, подлежащий записи. 494 +; Программа получения этого адреса не показана. 495 495 496 - MOV #400,R1; Preparing the counter496 + MOV #400,R1; Готовим счетчик 497 497 498 - MOV #WrBuf,(R3)+; Let'sforwardthe command to theCSRand499 - ;switchtheaddressinR3to500 -; DR 498 + MOV #WrBuf,(R3)+; Перешлем команду в CSR и 499 + ; переключим адрес в R3 на 500 + ; DR 501 501 502 -4$: MOV (R2)+,@R3; Let'sforward the next word503 -; data504 - SOB R1,4$; andrepeatthis256times502 +4$: MOV (R2)+,@R3; Перешлем очередное слово 503 + ; данных 504 + SOB R1,4$; и повторим это 256 раз 505 505 ;.................................. 506 506 {{/code}} 507 507 508 -== 017: Getramdisk size,large==508 +== **017: Получить размер псевдодиска, большой** == 509 509 510 - Therearetwocommandstoget the size of a pseudo-disk,i.e.theAZnfile-imagemountedonthe selected pseudo-drive.511 -\\ IftheOSbeing used(oraprogramworkingwithdiskswithout an OS)canworkwithlarge(morethan32M)disks,youshouldusethecommandwith the code017.Thesequence of actions:resetthecontroller(p. 3.1),selectthedrive(p. 3.2)andsendthecode017to the CSR,andthen,withoutanywaiting,readfromDRfirstthe lower word,andthenthehigherwordofthesizeofthe selected drive(image file).512 -\\ IftheOSyouareusingcannotworkwithdiskslarger than32M(RT-11),youshouldusethe007command-getthepseudo-disksizewithalimit of up to32M.Thesteps are similar:resetthe controller,selectthe disk,sendthe007 code to theCSRandreade wordofthepseudo-disksize fromDR.Ifthesizeoftheimagefilemountedontheselectedpseudo-driveis larger than65534blocks,thecontrollerreturnsthenumber65534instead of this "large" size.Weremindyouthat the number65535isusedinsomeplacesforspecialpurposesandcannotbe the disk size.513 -\\ Wealsoremindyouthatiftheimagefileis not mounted on this drive,thesequenceofactionswill not work(command001selectdevice)andtheprogramexecutionwillsimplynotreachthis point.Therefore,thesecommandsdonotprovidefor errors.514 -\\ Exampleofaprogramwith large disks510 +Есть две команды получения размера псевдодиска, т.е. смонтированного на выбранный псевдопривод AZn файл-образа. 511 +\\Если используемая ОС (или программа, работающая с дисками без ОС) умеет работать с большими (больше 32М) дисками, следует пользоваться командой с кодом 017. Последовательность действий: сбросить контроллер (п. 3.1), выбрать накопитель (п. 3.2) и переслать в CSR код 017, а затем, без каких-либо ожиданий, считать из DR сначала младшее, и следом за ним старшее слово размера выбранного накопителя (файл-образа). 512 +\\Если используемая ОС не умеет работать с дисками бОльшими, чем 32М (RT-11), следует пользоваться командой 007 - получить размер псевдодиска с ограничением до 32М. Действия похожие: сбрасываем контроллер, выбираем диск, посылаем в CSR код [[007>>doc:||anchor="H007:41F43E43B44344743844244C44043043743C43544043F44143543243443E43443844143A430"]] и считываем из DR одно слово размера псевдодиска. Если размер файл-образа, смонтированного на выбранный псевдопривод, больше 65534 блоков, вместо этого "большого" размера, контроллер возвращает число 65534. Напоминаем, что число 65535 кое-где используется в специальных целях и не может быть размером диска. 513 +\\Также напоминаем, что если на этот накопитель не смонтирован файл-образ, последовательность действий не пройдет (команда 001 выбор устройства) и исполнение программы до этого места просто не дойдет. Поэтому ошибок у этих команд не предусмотрено. 514 +\\Пример программы с большими дисками 515 515 516 516 {{code language="assembler"}} 517 517 ;...................................... 518 518 519 -GetBig=017; Getthe"big"disksize519 +GetBig=017; Получить "большой" размер диска 520 520 521 -; Fromfragment3.2 (diskselection)wehaveinR3522 -; DR address(177222)521 +; От фрагмента 3.2 (выбор диска) у нас в R3 остался 522 +; адрес DR (177222) 523 523 524 - MOV #GetBig,-(R3); sendthe command525 - TST (R3)+; returntheaddressinR3backtoDR524 + MOV #GetBig,-(R3); пошлем команду 525 + TST (R3)+; вернем адрес в R3 назад, на DR 526 526 MOV @R3,BigSiz 527 527 MOV @R3,BigSiz+2 528 528 ;...................................... ... ... @@ -529,26 +529,27 @@ 529 529 {{/code}} 530 530 531 531 532 -== 020: Getextendeddiagnosticcode==532 +== **020: Получить расширенный код диагностики** == 533 533 534 - Commandcode020,afterresettingthecontroller,youshouldissuethiscommand in theCSRandthenreadtwowordsofextendeddiagnosticsfromDR.Thecommand is instant,nowaitingis required.534 +Код команды 020, после сброса контроллера следует выдать эту команду в CSR и затем прочитать два слова расширенной диагностики из DR. Команда мгновенная, ожидание не требуется. 535 535 536 536 537 -== 027: GetfirmwareversionAZ STM32 ==537 +== **027: Получить версию firmware AZ STM32** == 538 538 539 -Command code 027, returns 2 words 540 -\\first word - 06404 = high byte 13. this is the firmware version, low byte 4. this is the hardware version - i.e. AZБК in this case second word - 037 = this is the maximum mountable disk - 31. 539 +Код команды 027, возвращает 2 слова 540 +\\первое слово - 06404 = старший байт 13. это версия прошивки, младший байт 4. это версия железа - те AZБК в данном случае 541 +второе слово - 037 = это максимальный монтируемый диск - 31. 541 541 542 542 543 543 {{code language="assembler"}} 544 544 ;------------------------------------------------------------- 545 -; gettingSTM32firmware version-resultinR1 R1=0error546 +; получение версии прошивки STM32 - результат в R1 R1=0 ошибка 546 546 GTSTMV: MOV #AZ$CSR,R1 547 -1$: CLR (R1) ; Send"Reset"command548 - TSTB (R1) ; Checkcontrollerreadinessконтроллера549 - BPL 1$ ; Ifnot ready,resetagain548 +1$: CLR (R1) ; Пошлем команду "Сброс" 549 + TSTB (R1) ; Проверим готовность контроллера 550 + BPL 1$ ; Если не готов, сбрасываем еще 550 550 mov #27,(R1) 551 - TST (R1)+ ; Checkforerror552 + TST (R1)+ ; Проверяем на ошибку 552 552 BMI 2$ 553 553 mov (R1),R1 554 554 return ... ... @@ -558,45 +558,45 @@ 558 558 {{/code}} 559 559 560 560 561 -== 030: Nooperation==562 +== **030: Нет операции** == 562 562 563 - Themainpurposeofthiscommandistosettheinterrupt enable bit from the controller.Thecommandtransferstheinterrupt enable bit,whichisinthesamewordwith it,butisnotpartofit(remember,thecommandislocatedin bitsD0 - D5,andtheinterruptenablebitisD6),tothecorrespondingtriggerofthecontrolleranddoesnotaffecttheprocesses in the controller in any other way.Controlofthistriggerworkseveninthe"Thinking,pleasedonot interfere"state,andthisisthemainfeature of the"nooperation"command.564 -\\ Thecommandhasthe code0030.Sendingthecode0130totheCSRwill enable interrupts from the controller,sendingthecode0030willdisable them.Anexampleisnotgivendue to its triviality.564 +Основное назначение этой команды - устанавливать бит разрешения прерываний от контроллера. Команда передает бит разрешения прерывания, который находится с ней в одном слове, но не входит в ее состав (напоминаем, команда располагается в битах D0 - D5, а бит разрешения прерываний - D6), в соответствующий триггер контроллера и больше никак не влияет на процессы в контроллере. Управление этим триггером работает даже в состоянии "Думаю, прошу не мешать", и это главная особенность команды "нет операции". 565 +\\Команда имеет код 0030. Посылка в CSR кода 0130 разрешит прерывания от контроллера, посылка кода 0030 запретит их. Пример не приводится вследствие тривиальности его. 565 565 566 566 567 -= Commandblockforworkingwithnon-volatilememory=568 += **Блок команд работы с энергонезависимой памятью** = 568 568 569 - TheinterfaceprovidesanyAZcontrollerwithaccess to255wordsofnon-volatile memory,allcommandssetthereadybitupon completion.Thisallowsyoutosaveusersettingsin non-volatile memory,forexample,thisisusedinAZBK??-therearesavedsettingsformorecomfortableoperation of the controller.570 +Интерфейс предоставляет любому AZ-контроллеру доступ к 255 словам энергонезависимой памяти, все команды устанавливают бит готовности по завершению. Это позволяет сохранять пользовательские настройки в энергонезависимой памяти, к примеру это используется в AZБК - там сохраняются настройки для более комфортной работы контроллера. 570 570 571 - Allcommandsinthisblockuseanon-volatilememorybufferfor their operation.572 +Все команды этого блока используют буфер энергонезависимой памяти для своей работы. 572 572 573 -== 021: Readnon-volatilememoryblockintobuffer==574 +== **021: Cчитать блок энергонезависимой памяти в буфер** == 574 574 575 575 (% class="wikigeneratedid" %) 576 - Commandcode021,thiscommandcausesablockofnon-volatilememorytoberead into the non-volatile memory buffer.577 +Код команды 021, данная команда вызывает чтение блока энергонезависимой памяти в буфер энергонезависимой памяти. 577 577 578 578 579 -== 022: Transferthereadblockofnon-volatilememoryfromthebuffer to the bus==580 +== **022: Отдать на шину считанный блок энергонезависимой памяти из буфера** == 580 580 581 581 (% class="wikigeneratedid" %) 582 - Commandcode022,thiscommandensuresthatthenon-volatilememorybufferistransferred to theDRregisterfor reading.583 +Код команды 022, данная команда обеспечивает передачу буфера энергонезависимой памяти в регистр DR для считывания. 583 583 584 584 (% class="wikigeneratedid" %) 585 - Exampleprogram586 +Пример программы 586 586 587 587 {{code language="assembler"}} 588 -AZ$CSR = 177220; commandandstatusregister(CSR)589 -AZ$DR = 177222; dataregister(DR)589 +AZ$CSR = 177220; регистр команд и состояния (CSR) 590 +AZ$DR = 177222; регистр данных (DR) 590 590 591 591 592 -; trap 50 - resetAZ593 +; trap 50 - cброс AZ 593 593 ; результат в R1 =0 ok 594 594 AZreset: MOV #AZ$CSR,R1 595 -1$: CLR (R1); Sendthe"Reset"command596 - TSTB (R1); Checkthecontroller readiness597 - BPL 1$; Ifnotready,resetagain598 -; onceandcheckagain599 - TST (R1); Checkforan error,596 +1$: CLR (R1); Пошлем команду "Сброс" 597 + TSTB (R1); Проверим готовность контроллера 598 + BPL 1$; Если не готов, сбрасываем еще 599 + ; раз и проверяем снова 600 + TST (R1); Проверим на ошибку, 600 600 BMI 0ERR$ 601 601 CLR R1 602 602 return ... ... @@ -605,30 +605,30 @@ 605 605 return 606 606 607 607 608 -; trap 54 - readingnon-volatilememoryofblock1 EEPROMtothebufferfromthe addressADREEPROMMEM609 -; resultR3 -address,ifR3=0error610 -; readstatusinR1 0 - ok611 -; 1 - sizedoesnotmatch saved612 -; 2 - versionerror613 -; 3 - checksum error609 +; trap 54 - чтение энергонезависимой памяти блока 1 EEPROM в буфер с адреса ADREEPROMMEM 610 +; результат R3 - адрес, если R3=0 ошибка 611 +; статус чтения в R1 0 - ok 612 +; 1 - размер не соответствует сохраненному 613 +; 2 - oшибка версии 614 +; 3 - oшибка контрольной суммы 614 614 ReadEEPROM: push R2 615 - call AZreset; reset616 + call AZreset; сбросим 616 616 tst R1 617 617 bne 0ERR$ 618 618 ; теперь читаем 619 619 MOV #AZ$CSR,R1 620 - mov #21,(R1); readblock1ofnon-volatilememoryinto buffer621 -0$: TSTB (R1); checkexecutionresult622 - BPL 0$; wait623 - mov #22,(R1); sendreadblockofnon-volatilememoryfrombuffertobus624 -1$: TSTB (R1); checkexecutionresult625 - BPL 1$; wait626 - TST (R1)+; increment621 + mov #21,(R1); считать блок 1 энергонезависимой памяти в буфер 622 +0$: TSTB (R1); проверяем результат выполнения 623 + BPL 0$; ждем 624 + mov #22,(R1); отдать на шину считанный блок энергонезависимой памяти из буфера 625 +1$: TSTB (R1); проверяем результат выполнения 626 + BPL 1$; ждем 627 + TST (R1)+; инкрементируем 627 627 mov #ADREEPROMMEM,R3 628 - mov #256.,R2; read256.words;firstwordisreadingresult629 -2$: mov (R1),(R3)+; readblockofwordsinto memory629 + mov #256.,R2; читаем 256. слов; первое слово - результат чтения 630 +2$: mov (R1),(R3)+; читаем блок слов в память 630 630 sob R2,2$ 631 - mov #ADREEPROMMEM,R3; successful632 + mov #ADREEPROMMEM,R3; успешно 632 632 mov (R3),R1 633 633 br 0END$ 634 634 0ERR$: CLR R3 ... ... @@ -636,39 +636,41 @@ 636 636 return 637 637 {{/code}} 638 638 639 -obviously, after reading the memory, it is necessary to check the result code in the first word - see the decoding of error codes 640 -\\Examples of returned data for commands 641 -\\sequentially issuing the command 021 and then 022 will allow reading 256 words from non-volatile memory 642 -Attention! The first word will be the reading success status 640 +очевидно, после считывания памяти необходимо проверить код результата в первом слове - см расшифровку кодов ошибок 641 +\\Примеры возвращаемых данных по командам 642 +\\последовательная подача команды 021 и затем 022 позволит считать 256. слов 643 +из энергонезависимой памяти 644 +**Внимание! **первое слово это будет статус успешности чтения 645 + 643 643 644 644 * 0 - ok 645 -* 1 - sizedoesnotmatch saved646 -* 2 - versionerror647 -* 3 - checksum error648 +* 1 - размер не соответствует сохраненному 649 +* 2 - oшибка версии 650 +* 3 - oшибка контрольной суммы 648 648 649 -== 023: Receivedatafromthebusintothebufferforsubsequentwritinginto the buffer==652 +== **023: Принять с шины в буфер данные для последующей записи в буфер** == 650 650 651 - Commandcode023,thiscommandallowsyoutofillthe non-volatile memory buffer654 +Код команды 023, данная команда позволяет наполнить буфер энергонезависимой памяти 652 652 653 -== 024: Writefrombuffertonon-volatilememoryblock==656 +== **024: Записать из буфера в блок энергонезависимой памяти** == 654 654 655 - Commandcode024,thiscommandcausesanon-volatilememoryblocktobewrittenfrom the non-volatile memory buffer.658 +Код команды 024, данная команда вызывает запись блока энергонезависимой памяти из буфера энергонезависимой памяти. 656 656 657 - Exampleprogram660 +Пример программы 658 658 659 659 {{code language="assembler"}} 660 -AZ$CSR = 177220; CommandandStatusRegister(CSR)661 -AZ$DR = 177222; DataRegister(DR)663 +AZ$CSR = 177220; регистр команд и состояния (CSR) 664 +AZ$DR = 177222; регистр данных (DR) 662 662 663 663 664 -; trap 50 - resetAZ667 +; trap 50 - cброс AZ 665 665 ; результат в R1 =0 ok 666 666 AZreset: MOV #AZ$CSR,R1 667 -1$: CLR (R1); Sendthe"Reset"command668 - TSTB (R1); Checkthecontroller readiness669 - BPL 1$; Ifnotready,resetagain670 -; onceandcheckagain671 - TST (R1); Checkforan error,670 +1$: CLR (R1); Пошлем команду "Сброс" 671 + TSTB (R1); Проверим готовность контроллера 672 + BPL 1$; Если не готов, сбрасываем еще 673 + ; раз и проверяем снова 674 + TST (R1); Проверим на ошибку, 672 672 BMI 0ERR$ 673 673 CLR R1 674 674 return ... ... @@ -676,27 +676,27 @@ 676 676 COM R1 677 677 return 678 678 679 -; trap 55 - writenon-volatilememoryfromthebufferataddressADREEPROMMEM в блок 1 EEPROM682 +; trap 55 - запись энергонезависимой памяти из буфера с адреса ADREEPROMMEM в блок 1 EEPROM 680 680 WriteEEPROM: push R1 681 681 push R2 682 682 push R3 683 - call AZreset; reset686 + call AZreset; сбросим 684 684 tst R1 685 685 bne 0ERR$ 686 686 687 687 MOV #AZ$CSR,R1 688 - mov #23,(R1); commandthatwewillwritedatatothe buffer689 -0$: TSTB (R1); checktheresult of executio690 - BPL 0$; wait691 - TST (R1)+; increment691 + mov #23,(R1); командуем что будем писать данные в буфер 692 +0$: TSTB (R1); проверяем результат выполнения 693 + BPL 0$; ждем 694 + TST (R1)+; инкрементируем 692 692 mov #ADREEPROMMEM+2,R3 693 - mov #255.,R2; write255.words;skipthefirstword-theresult of reading694 -1$: mov (R3)+,(R1); sendtothe controller696 + mov #255.,R2; пишем 255. слов; первое слово пропускаем - результат чтения 697 +1$: mov (R3)+,(R1); отдаем в контроллер 695 695 sob R2,1$ 696 - tst -(R1); decrement697 - mov #24,(R1); writefromthebuffertoblock1ofnon-volatile memory698 -2$: TSTB (R1); checktheresult of execution699 - BPL 2$; we are waiting699 + tst -(R1); декрементируем 700 + mov #24,(R1); записать из буфера в блок 1 энергонезависимой памяти 701 +2$: TSTB (R1); проверяем результат выполнения 702 + BPL 2$; ждем 700 700 br 0END$ 701 701 0ERR$: CLR R3 702 702 0END$: pop R3 ... ... @@ -705,21 +705,23 @@ 705 705 return 706 706 {{/code}} 707 707 708 -** Pleasenote**thatwhen recording,thebufferimmediatelycomeswith the data,i.e.thereisnofirstword with the statu711 +**Обращаю внимание**, при записи, буфер идет сразу с данными, те нет первого слова со статусом. 709 709 710 710 711 711 712 -= BlockofcommandsforworkingwithRTCandNTP =715 += Блок команд для работы с RTC и NTP = 713 713 714 - TheAZ®controllerhas2sourcesofdate-time,thefirstis theRTCbuiltintotheSTM32,thesecondistheclockin theTCP/IPstack.TheRTCclockworksautonomouslywitha2032battery installed.TheclockintheTCP/IPstackissetbasedondata from theNTPserver.717 +В контроллере AZ® есть 2 источника получения даты-времени, первый это RTC встроенный в STM32, второй это часы в стеке TCP/IP. Часы RTC работают автономно при наличии установленной батарейки 2032. Часы в стеке TCP/IP устанавливаются на основании данных с NTP-сервера. 715 715 716 716 717 -== Bufferformattimestamp (readable) ==720 +== Формат буфера timestamp (доступен по чтению) == 718 718 719 - The controllerAPIimmediatelypreparestimeinseveralformats,sothatitcanbeconvenientlyusedon thePDP-11side722 +API контроллера сразу готовит время в нескольких форматах, дабы его было удобно применить на стороне PDP-11 720 720 721 721 {{info}} 722 -datetime buffer format octal offset - those words datetime buffer format 725 +формат буфера даты-времени 726 +offset в восьмеричной системе - те слова 727 +формат буфера даты-времени 723 723 \\[0]=rtc_rt11date(); 724 724 [2]=rt11 time 50Hz big word; 725 725 [4]=rt11 time 50Hz little word; ... ... @@ -737,72 +737,72 @@ 737 737 {{/info}} 738 738 739 739 740 -== SimpleIN buffer format(whenwriting) ==745 +== Формат буфера SimpleIN (при записи) == 741 741 742 - theformatis simplified as much as possible,forworkwithPDP-11747 +формат максимально упрощен, для работы со стороны PDP-11 743 743 744 744 {{info}} 745 -offset inoctal-thosewords750 +offset в восьмеричной системе - те слова 746 746 747 -[0]=year, thelowertwodigitsare22andnot2022(!)748 -[2]=month; month749 -[4]=day; day750 -[6]=wday; dayof the week=0notset, 1Monday2 -Tuesdayetc.751 -[10]=hour; hour752 -[12]=min; minute753 -[14]=sec; second752 +[0]=year год, младшие две цифры - те 22 а не 2022(!) 753 +[2]=month; месяц 754 +[4]=day; день 755 +[6]=wday; день недели =0 не установлен, 1- понедельник 2 - вторник итд 756 +[10]=hour; час 757 +[12]=min; минута 758 +[14]=sec; секунда 754 754 {{/info}} 755 755 756 756 757 -== 031: GettimefromRTCtotimestampbuffer==762 +== **031: Получить время из RTC в буфер timestamp** == 758 758 759 - Commandcode031,thiscommandusesRTCclockasasourceof fillingthe timestampbuffer764 +Код команды 031, данная команда использует RTC часы как источник заполнения буфера timestamp 760 760 761 - Exampleprogram:766 +Пример программы: 762 762 763 763 {{code language="assembler"}} 764 -; trap 61 - readingclockdatafromautonomousRTCclock765 -; R3 - bufferaddresswheretoread766 -; resultinR3addressifsuccessful. R3=0iferror769 +; trap 61 - чтение данных часов из автономных часов RTC 770 +; R3 - адрес буфера куда надо считать 771 +; результат в R3 адрес, если успешно. R3=0 если ошибка 767 767 GetDateFromRTC: push R0 768 768 push R1 769 769 push R2 770 - call AZreset; reset775 + call AZreset; сбросим 771 771 tst R1 772 772 bne G60ERR 773 773 MOV #AZ$CSR,R1 774 774 mov #31,(R1) 775 - br G60; let'sgotherebecausefurthercode is the same780 + br G60; идем туда тк дальше код одинаковый 776 776 {{/code}} 777 777 778 -== 032: Gettimefromtimestampbuffer==783 +== **032: Получить время из буфера timestamp** == 779 779 780 - Commandcode032,thiscommandsendsthecontentsofthe timestampbuffer to the bus785 +Код команды 032, данная команда отдает на шину содержимое буфера timestamp 781 781 782 782 {{code language="assembler"}} 783 -; workingwithclock784 -; trap 60 - readingclockdatafromTCP/IPstack785 -; R3 - bufferaddresswheretoread786 -; resultinR3addressifsuccessful. R3=0iferror788 +; работа с часами 789 +; trap 60 - чтение данных часов из TCP/IP стека 790 +; R3 - адрес буфера куда надо считать 791 +; результат в R3 адрес, если успешно. R3=0 если ошибка 787 787 GetDateFromLAN: push R0 788 788 push R1 789 789 push R2 790 - call AZreset; reset795 + call AZreset; сбросим 791 791 tst R1 792 792 bne G60ERR 793 793 MOV #AZ$CSR,R1 794 794 mov #42,(R1) 795 -G60: TSTB (R1); checkexecutionresult796 - BPL G60; wait800 +G60: TSTB (R1); проверяем результат выполнения 801 + BPL G60; ждем 797 797 mov #32,(R1) 798 -1$: TSTB (R1); checkexecutionresult803 +1$: TSTB (R1); проверяем результат выполнения 799 799 BPL 1$; ждем 800 - TST (R1)+; increment801 - mov R3,R0; rememberR3address802 - mov #10.,R2; read10words803 -2$: mov (R1),(R3)+; readblockofwordsinto memory805 + TST (R1)+; инкрементируем 806 + mov R3,R0; запомним R3 - адрес 807 + mov #10.,R2; читаем 10 слов 808 +2$: mov (R1),(R3)+; читаем блок слов в память 804 804 sob R2,2$ 805 - mov R0,R3; successful,returnaddresstoR3810 + mov R0,R3; успешно, вернем адрес в R3 806 806 br 0END$ 807 807 G60ERR: CLR R3 808 808 0END$: pop R2 ... ... @@ -811,11 +811,11 @@ 811 811 return 812 812 {{/code}} 813 813 814 - Itisworthcheckingthe correctness of the received time:819 +Стоит проверить корректность полученного времени: 815 815 816 816 {{code language="assembler"}} 817 -; trap 63 - checktimecorrectness818 -; R3 - bufferaddress,resultinR3,ifbufferaddressthenOK, =0error822 +; trap 63 - проверка корректности времени 823 +; R3 - адрес буфера, результат в R3, если адрес буфера то OK, =0 ошибка 819 819 CheckDateTime: Cmp 6(r3),#2021. 820 820 Blos 1err 821 821 Cmp 6(r3),#2100. ... ... @@ -825,94 +825,94 @@ 825 825 return 826 826 {{/code}} 827 827 828 -== 033: Writetime-datetoSimpleINbuffer==833 +== **033: Запись времени-даты в буфер SimpleIN** == 829 829 830 - Commandcode033,thiscommandreceivesdatafromthebusinto theSimpleINbuffer835 +Код команды 033, данная команда принимает с шины данные в буфер SimpleIN 831 831 832 - Theoperationofthiscommandissimilar tothe operationofcommands023 and016.837 +Работа данной команды аналогична работе команд [[023>>doc:||anchor="H023:41F44043843D44F44244C44144843843D44B43243144344443544043443043D43D44B43543443B44F43F43E44143B43543444344E44943543943743043F438441438432431443444435440"]] и [[016>>doc:||anchor="H016:A041F44043843D44F44244C43143B43E43A43443043D43D44B445432431443444435440"]]. 833 833 834 -== 034: SetRTCbasedonbufferdata==839 +== **034: Установка RTC на основании данных из буфера** == 835 835 836 - Commandcode034,thiscommandsetstheRTCbasedonthedatain theSimpleINbuffer841 +Код команды 034, данная команда устанавливает RTC на основании данных в буфере SimpleIN 837 837 838 - Thiscommandexecutesquickly,buttoavoidproblems,awaitloopis recommended.843 +Данная команда выполняется быстро, но для исключения проблем цикл ожидания выполнения рекомендуется. 839 839 840 -== 035: StimulatetimerequestfromNTPserver,setbasedonresponse==845 +== **035: Стимуляция запроса времени с NTP сервера, установка на основании ответа** == 841 841 842 - Commandcode035,thiscommandsendsarequestto theNTPserver(setintheAZ.INIfileorreceivedfromDHCP)andsetstheclockintheTCP/IPstack.847 +Код команды 035, данная команда отправляет запрос на NTP cервер (установленный в AZ.INI файле или полученный от DHCP) и устанавливает часы в стеке TCP/IP. 843 843 844 - Exampleprogram:sendingarequesttosetthetime from anNTPserver849 +Пример программы: отсылка запроса на установку времени с NTP сервера 845 845 846 846 {{code language="assembler"}} 847 -; trap 62 - sendingarequesttosetthetime from theNTPserver852 +; trap 62 - отсылка запроса на установку времени с NTP сервера 848 848 GetDateNTPtoNET:push R1 849 - call AZreset; reset854 + call AZreset; сбросим 850 850 tst R1 851 851 bne 0ERR$ 852 852 MOV #AZ$CSR,R1 853 853 mov #35,(R1) 854 -0$: TSTB (R1); checktheresult of execution855 - BPL 0$; wait859 +0$: TSTB (R1); проверяем результат выполнения 860 + BPL 0$; ждем 856 856 0ERR$: pop R1 857 857 return 858 858 {{/code}} 859 859 860 - Thecommandexecutiontakes1-2secondsonaverage.ThiscommandrequirestheTCP/IPstack to work,sowaitingcyclesareneededwhenthe stack is enabled.865 +Выполнение команды занимает 1-2 секунды в среднем. Данная команда требует работы стека TCP/IP, соответственно нужны циклы ожидания при включенном стеке. 861 861 862 - Anexampleofapollingcycletogettime from the network867 +Пример цикла опроса с целью получить время с сети 863 863 864 864 {{code language="assembler"}} 865 -; date-time870 +; дата-время 866 866 mov #S_DateTime_0,R3; "Lan Date:" 867 867 trap 10 868 - mov #20,R4; numberofwait cycles869 -$datry: trap 62; sentarequestto theNTPserver870 - mov #110,@#AZ$CSR; enablethe network871 - trap 47; waiting872 - trap 47; waiting873 + mov #20,R4; количество циклов ожидания 874 +$datry: trap 62; отослали запрос к NTP серверу 875 + mov #110,@#AZ$CSR; включим сеть 876 + trap 47; ожидание 877 + trap 47; ожидание 873 873 mov #ADRTMPSTR,R3 874 - trap 60; readthedate-timeinto the buffer875 - trap 63; checkedthe date-time879 + trap 60; считали в буфер дату-время 880 + trap 63; проверили дату-время 876 876 tst R3 877 877 bne $ok 878 878 $sob: sob R4,$datry 879 - mov #S_DateTime_2,R3; printerror884 + mov #S_DateTime_2,R3; печать ошибки 880 880 trap 7 881 881 br $go 882 882 883 883 $ok: mov #ADRTMPSTR,R3 884 - trap 24; printdate885 - trap 25; time886 -$go: mov #110,@#AZ$CSR; let's turn on the network889 + trap 24; печать даты 890 + trap 25; времени 891 +$go: mov #110,@#AZ$CSR; включим сеть 887 887 {{/code}} 888 888 889 - Hereweexplicitlysendarequestto theNTPserver,thenturnonthenetworkandwait for the result,periodicallypollingandcheckingthecorrectness of the result.894 +Тут мы явно отсылаем запрос к NTP серверу, затем включаем работу сети и ждем результата, периодически опрашивая и проверяя корректность результата. 890 890 891 -== 036: SettingRTCbasedonTCP/IPstackclock==896 +== **036: Установка RTC на основании часов TCP/IP стека** == 892 892 893 - Commandcode036,thiscommandsetstheRTCbasedontheclock in theTCP/IPstack.Youmustfirstsetthe clock inTCP/IP -command036.898 +Код команды 036, данная команда устанавливает RTC на основании часов в TCP/IP стека. Предварительно надо установить часы в TCP/IP - команда 036. 894 894 895 - Exampleprogram:900 +Пример программы: 896 896 897 897 {{code language="assembler"}} 898 -; trap 64 - setRTCtimebasedonstack time899 -; R1 - resultR1=0 - OK900 -SetDateNETtoRTC:call AZreset; reset903 +; trap 64 - установка времени RTC на основании времени стека 904 +; R1 - результат R1=0 - OK 905 +SetDateNETtoRTC:call AZreset; сбросим 901 901 tst R1 902 902 bne 0ERR$ 903 903 MOV #AZ$CSR,R1 904 904 mov #36,(R1) 905 -0$: TSTB (R1); checkexecutionresult906 - BPL 0$; wait910 +0$: TSTB (R1); проверяем результат выполнения 911 + BPL 0$; ждем 907 907 clr R1 908 908 0ERR$: return 909 909 {{/code}} 910 910 911 -== 042: GettimefromTCP/IPstackclockintotimestampbuffer==916 +== **042: Получить время из часов TCP/IP стека в буфер timestamp** == 912 912 913 - Commandcode042,thiscommandusestheTCP/IPstackclockasasource for fillingthe timestampbuffer.918 +Код команды 042, данная команда использует часы TCP/IP стека как источник заполнения буфера timestamp. 914 914 915 - Exampleprogram:920 +Пример программы: 916 916 917 917 {{code language="assembler"}} 918 918 ; работа с часами