Last modified by Max on 2025/03/02 15:18

From version 1.3
edited by Max
on 2025/02/25 10:56
Change comment: (Autosaved)
To version 2.6
edited by Max
on 2025/02/25 12:16
Change comment: (Autosaved)

Summary

Details

Page properties
Content
... ... @@ -15,7 +15,6 @@
15 15  * 177224 - Primary Boot Register (BOOT1)
16 16  * 177226 - Alternate Boot Register (BOOT2)
17 17  
18 -
19 19  The CSR register accepts commands in bits D0-D5 and the interrupt enable bit in bit D6, all write only, always zero is read. In bit D7, the readiness bit is read. One in it means that the previous command has been executed and the controller is ready for exchange. Zero means that the controller is busy executing the previous operation, the other registers are disabled, access to any of them will cause Trap to 4. If the execution of the previous command caused an error, bit D15 is set simultaneously with bit D7.
20 20  \\Writing to registers is done only in words; byte writing is not allowed.
21 21  \\All data exchange is conducted via DR. For commands with a single-word argument, this argument should be sent to DR, and then the command should be sent to CSR. For commands exchanging with the controller buffer, on the contrary, the command should be issued and only after it a data block of a certain length should be received or transmitted.
... ... @@ -154,18 +154,19 @@
154 154  
155 155  == 003: Open HFS Table of Contents ==
156 156  
157 -Последовательность действий
158 -\\• [[сбросить контроллер>>doc:||anchor="H000:A042143144043E44143A43E43D44244043E43B43B435440430"]]
159 -• подать в CSR команду "Принять блок данных в буфер" и передать пословно всю строку с полным текстом пути (Full Path) к требуемому оглавлению. Строка должна завершаться нулевым байтом (0х00) и быть не длиннее 384 байт (192 слов).
160 -• переслать в CSR код команды "Открыть оглавление"
161 -• дождаться ее окончания (команда длительная)
162 -• проверить на ошибку
156 +Sequence of actions:
163 163  
164 -[[**//Пример утилиты - AZDIR//**>>url:https://forum.maxiol.com/index.php?s=&showtopic=5605&view=findpost&p=59418]]
158 +• reset the controller
159 +• send the command "Accept data block to buffer" to the CSR and transmit the entire line with the full path text (Full Path) to the required table of contents word by word. The line must end with a zero byte (0x00) and be no longer than 384 bytes (192 words).
160 +• send the "Open table of contents" command code to the CSR
161 +• wait for it to finish (the command is long)
162 +• check for errors
165 165  
164 +[[Example utility - AZDIR>>url:https://forum.maxiol.com/index.php?s=&showtopic=5605&view=findpost&p=59418]]
166 166  
167 -Пример программы:
168 168  
167 +Example program:
168 +
169 169  {{code language="assembler"}}
170 170  ;.............................
171 171  AZ$CSR = 177220
... ... @@ -173,46 +173,44 @@
173 173  OpnDir = 003
174 174  
175 175   MOV #AZ$CSR,R3
176 -
177 -; Ячейка DirPtr содержит указатель на начало поля с Full
178 -; Path. Считаем, что строка завершается тремя нулевыми
179 -; байтами, чтобы распознать по нулю окончание пересылки
180 -; строки пословно. Действительно, если количество
181 -; символов в строке четное, то следующие два байта нулей
182 -; образуют нулевое слово; если же нечетное, то один ноль
183 -; уйдет вместе с последним символом строки, а нулевое
184 -; слово образуют второй и третий нулевые байты,
185 -; оканчивающие строку. То есть, такое окончание строки,
186 -; передаваемой пословно, вполне надежно.
176 +; The DirPtr cell contains a pointer to the beginning of the field with Full
177 +; Path. We assume that the string is terminated by three zero
178 +; bytes in order to recognize the end of the transfer of the
179 +; string word by word by zero. Indeed, if the number of
180 +; characters in the string is even, then the next two bytes of zeros
181 +; form a zero word; if it is odd, then one zero
182 +; will go away with the last character of the string, and the zero
183 +; word is formed by the second and third zero bytes,
184 +; ending the string. That is, such an end of the string,
185 +; transferred word by word, is quite reliable.
187 187   MOV DirPtr,R2
188 188  
189 - MOV #WrBuf,(R3)+; Подаем команду "Запись в
190 - ; буфер" и передаем строку
191 -11$: MOV (R2)+,@R3; пословно, до тех пор,
192 - BNE 11$ ; пока не перешлется ноль
188 + MOV #WrBuf,(R3)+; We issue the "Write to
189 + ; buffer" command and transmit the string
190 +11$: MOV (R2)+,@R3; word by word,
191 + BNE 11$ ;until zero is sent,
193 193  
194 - MOV #OpnDir,-(R3); Подаем команду "Открыть
195 - ; оглавление"
193 + MOV #OpnDir,-(R3); We issue the "Open
194 + ; table of contents" command
196 196  
197 -12$: TSTB @R3; и ждем, когда контроллер ее
198 - BPL 12$; выполнит,
199 - TST @R3; после чего проверяем на ошибку.
200 - BMI Err10; Ошибка -->
196 +12$: TSTB @R3; and wait for the controller to
197 + BPL 12$; execute it,
198 + TST @R3; after which we check for an error.
199 + BMI Err10; Error -->
201 201  ;.............................
202 202  {{/code}}
203 203  
204 -== **004: Монтировать диск** ==
203 +== 004: Mount a disk ==
205 205  
206 -Порядок действий:
207 -• [[Сбросить контроллер>>doc:||anchor="H000:A042143144043E44143A43E43D44244043E43B43B435440430"]]
208 -• Переслать в контроллер строку с записью, подобной строкам описания дисков в файле AZ.INI
209 -• Выдать команду "Монтировать диск"
210 -• Дождаться ее окончания (команда длительная)
211 -• Проверить на ошибки
212 -На выбранный накопитель AZnn НЕ ДОЛЖЕН быть смонтирован диск. Если он таки смонтирован, перед монтированием туда нового диска следует размонтировать старый - команда 014
213 -
205 +Sequence of actions:
206 +• Reset the controller
207 +• Send a line to the controller with a record similar to the lines describing the disks in the AZ.INI file
208 +• Issue the "Mount disk" command
209 +• Wait for it to finish (the command is long)
210 +• Check for errors
211 +The selected AZnn drive MUST NOT have a disk mounted. If it is mounted, the old disk should be unmounted before mounting a new one - command 014
214 214  
215 -Пример программы:
213 +Example program:
216 216  
217 217  {{code language="assembler"}}
218 218  ;..................
... ... @@ -222,20 +222,20 @@
222 222   MOV #AZ$CSR,R3
223 223  
224 224  20$: CLR @R3;
225 - TSTB @R3; Сбросим контроллер
223 + TSTB @R3; Reset the controller
226 226   BPL 20$;
227 227  
228 - MOV #WrBuf,(R3)+; Перешлем в него строку
229 - MOV #MDTXT,R2; с командой назначения
226 + MOV #WrBuf,(R3)+; Send it a string
227 + MOV #MDTXT,R2; with the assignment command
230 230   MOV #MDLEN/2,R1;
231 231  21$: MOV (R2)+,@R3;
232 232   SOB R1,21$;
233 233  
234 - MOV #AZMNT,-(R3); и отдадим ее на
235 -22$: TSTB @R3 ; исполнение
232 + MOV #AZMNT,-(R3); and pass it to
233 +22$: TSTB @R3 ; execution
236 236   BPL 22$ ;
237 237  
238 - TST @R3; после чего проверим на ошибку
236 + TST @R3; then check for an error
239 239   BMI Err11;
240 240  ;.........................
241 241  
... ... @@ -244,57 +244,57 @@
244 244  ;..................
245 245  {{/code}}
246 246  
247 -В этом фрагменте на диск AZ4 монтируется файл-образ 51SYS_DS.DSK, лежащий в папке SYSTEM, которая лежит в папке DISKS, лежащей в корневом оглавлении карточки микро-SD.
245 +In this fragment, the 51SYS_DS.DSK image file is mounted on the AZ4 disk, located in the SYSTEM folder, which is located in the DISKS folder, which is located in the root directory of the micro-SD card.
248 248  
249 249  
250 -== **005: Чтение блока в буфер** ==
248 +== 005: Reading block into buffer ==
251 251  
252 -У контроллера имеется [[встроенный буфер на 256 слов (512 байт).>>doc:||anchor="H411443444435440430"]] Фактически, это часть оперативной памяти микроконтроллера STM32, выделенная в его программе под этот буфер. Весь обмен в основном блоке команд идет через этот буфер.
253 -\\Память дисков AZ представлена, как набор блоков объемом 512 байт каждый. Такой блок - единственная доступная единица для обмена данными с дисками AZ. Блоки пронумерованы от нуля до 65533 для 16-разрядного варианта или до 8388607 для 32-разрядного - это при использовании накопителей AZ максимально допустимой емкости. Никто не мешает использовать накопители меньшей емкости - фактический размер накопителя равен размеру файл-образа, смонтированного на этот накопитель. При попытке обратиться за пределы файл-образа будет зарегистрирована ошибка.
254 -\\Команда 005 - чтение блока с MicroSD в [[буфер>>doc:||anchor="Micro"]]. С псевдодиска AZn, выбранного ранее командой "Выбор устройства" запускается на чтение блок, номер которого передан командой (командами) "Установка номера блока". Команда длительного действия.
255 -\\Фактически, блок с карточки MicroSD читается, примерно, 500-800 мкс. На это время контроллер переходит в состояние, которое во время обсуждения проекта получило название "Думаю, прошу не мешать." А именно, на все время ее исполнения отключаются все регистры устройства, кроме CSR, в котором считывается ноль до тех пор, пока контроллер занят исполнением этой команды. По окончании считывания блока к МПИ подключаются остальные регистры контроллера, взводится бит D7 (готовность) в CSR и, если был установлен бит D6 (разрешение прерываний) в CSR, вырабатывается прерывание с вектором 0174.
256 -\\Пример без прерываний тривиален:
250 +The controller has a built-in buffer for 256 words (512 bytes). In fact, this is part of the STM32 microcontroller's RAM, allocated in its program for this buffer. All exchange in the main command block goes through this buffer.
251 +\\The AZ disk memory is represented as a set of blocks, each 512 bytes in size. Such a block is the only available unit for exchanging data with AZ disks. The blocks are numbered from zero to 65533 for the 16-bit version or up to 8388607 for the 32-bit version - this is when using AZ drives of the maximum permissible capacity. No one prevents you from using drives of a smaller capacity - the actual size of the drive is equal to the size of the file-image mounted on this drive. An error will be registered if you try to access beyond the file-image.
252 +\\Command 005 - reading a block from MicroSD to the buffer. From the pseudo-disk AZn, previously selected by the command "Select device", the block whose number is transmitted by the command (commands) "Set block number" is started for reading. Long-term command.
253 +\\In fact, a block from a MicroSD card is read in about 500-800 µs. During this time, the controller goes into a state that during the discussion of the project was called "I think, please do not interfere." Namely, for the entire time of its execution, all device registers are disabled, except for CSR, in which zero is read as long as the controller is busy executing this command. After the block is read, the remaining controller registers are connected to the QBUS, bit D7 (ready) is set in CSR and, if bit D6 (interrupt enable) was set in CSR, an interrupt with vector 0174 is generated.
254 +\\An example without interruptions is trivial:
257 257  
258 258  {{code language="assembler"}}
259 259  ;...................................
260 260  
261 -CmdRea=005; символическое наименование команды "Читать
262 -; блок"
259 +CmdRea=005; symbolic name of the "Read block" command
263 263  
264 -; В R3 у нас от предыдущего фрагмента остался адрес CSR.
265 -; Пересылаем туда код команды чтения
261 +; In R3 we have the CSR address left from the previous fragment.
262 +; We send the read command code there
266 266   MOV #CmdRea,@R3
267 -2$: TSTB @R3 ; Проверим бит готовности
268 - BPL 2$; Не готово -> уходим проверять еще
269 - ; раз
270 - TST @R3; Проверим на ошибку
264 +2$: TSTB @R3 Let's check the ready bit
265 + BPL 2$; Not ready -> we go to check again
266 +; once
267 + TST @R3; Let's check for an error
271 271   BMI ERR4
272 -; Здесь у нас опять, в отличие от фрагментов пп. 3.1 и
273 -; 3.2, в R3 остался адрес CSR, а не DR.
269 +; Here again, unlike the fragments of pp. 3.1 and
270 +; 3.2, we have the CSR address left in R3, not DR.
274 274  
275 275  ;...................................
276 276  {{/code}}
277 277  
278 278  
279 -== **006: Записать блок из буфера на диск** ==
276 +== 006: Write block from buffer to disk ==
280 280  
281 -Код команды 006. Содержимое буфера пишется на выбранный псевдодиск по заданному дисковомк адресу (номеру блока). Перед записью выполняются проверки (1) "была ли запись в буфер?", если нет, выдается ошибка и (2) "заполнен ли буфер полностью?", если нет (для последнего укороченного блока файла), остаток буфера очищается нулями. Далее производится запись блока на носитель. Операция длительная, после ее запуска контроллер, как и при чтении переходит в состояние "Думаю, прошу не мешать". И так же, как и при чтении окончания этой операции надо дождаться, теми же средствами, как и при чтении.
282 -\\Пример программы без прерываний:
278 +Command code 006. The buffer contents are written to the selected pseudo-disk at the specified disk address (block number). Before writing, checks are performed (1) "was there a write to the buffer?", if not, an error is returned and (2) "is the buffer completely filled?", if not (for the last shortened block of the file), the rest of the buffer is cleared with zeros. Then the block is written to the media. The operation is lengthy, after it is started the controller, as with reading, goes into the "I think, please do not interfere" state. And just as with reading, you must wait for the end of this operation, by the same means as with reading.
283 283  
280 +
281 +Example of a program without interrupts:
282 +
284 284  {{code language="assembler"}}
285 285  ;...............................................................
286 286  
287 -CmdWri=006; символическое наименование команды "Писать
288 - ; блок"
286 +CmdWri=006; symbolic name of the "Write
287 +; block" command
289 289  
290 -; В R3 у нас от предыдущего фрагмента остался адрес DR.
291 -; Исправляем его на CSR и пересылаем туда код команды
292 -; записи
289 +; In R3 we have the DR address left over from the previous fragment.
290 +; We correct it to the CSR and send the
291 +; write command code there
293 293   MOV #CmdWri,-(R3)
294 -5$: TSTB @R3 ; Проверим бит готовности
295 - BPL 5$; Не готово -> уходим проверять еще
296 - ; раз
297 - TST @R3; Проверим на ошибку
293 +5$: TSTB @R3 ; Let's check the ready bit
294 + BPL 5$; Not ready -> we go and check again once
295 + TST @R3; Let's check for an error
298 298   BMI ERR5
299 299  
300 300  ;....................................................................
... ... @@ -301,73 +301,73 @@
301 301  {{/code}}
302 302  
303 303  
304 -== **007: Получить размер псевдодиска** ==
302 +== 007: Get disk size ==
305 305  
306 -Есть две команды получения размера псевдодиска, т.е. смонтированного на выбранный псевдопривод AZn файл-образа.
307 -\\Если используемая ОС (или программа, работающая с дисками без ОС) умеет работать с большими (больше 32М) дисками, следует пользоваться [[командой с кодом 017>>doc:||anchor="H017:A041F43E43B44344743844244C44043043743C43544043F44143543243443E43443844143A4302C43143E43B44C44843E439"]]. Последовательность действий: сбросить контроллер (команда 000), выбрать накопитель (п. 3.2) и переслать в CSR код 017, а затем, без каких-либо ожиданий, считать из DR сначала младшее, и следом за ним старшее слово размера выбранного накопителя (файл-образа).
308 -\\Если используемая ОС не умеет работать с дисками бОльшими, чем 32М (RT-11), следует пользоваться командой 007 - получить размер псевдодиска с ограничением до 32М. Действия похожие: сбрасываем контроллер, выбираем диск, посылаем в CSR код 007 и считываем из DR одно слово размера псевдодиска. Если размер файл-образа, смонтированного на выбранный псевдопривод, больше 65534 блоков, вместо этого "большого" размера, контроллер возвращает число 65534. Напоминаем, что число 65535 кое-где используется в специальных целях и не может быть размером диска.
309 -\\Также напоминаем, что если на этот накопитель не смонтирован файл-образ, последовательность действий не пройдет (команда 001 выбор устройства) и исполнение программы до этого места просто не дойдет. Поэтому ошибок у этих команд не предусмотрено.
304 +There are two commands for obtaining the size of a pseudo-disk, i.e. the AZn file-image mounted on the selected pseudo-drive.
305 +\\If the OS being used (or a program working with disks without an OS) can work with large (more than 32M) disks, you should use the command with the code 017. The sequence of actions: reset the controller (command 000), select the drive (p. 3.2) and send the code 017 to the CSR, and then, without any waiting, read from DR first the lower word, and then the higher word of the size of the selected drive (image file).
306 +\\If the OS you are using cannot work with disks larger than 32M (RT-11), you should use the 007 command - get the pseudo-disk size with a limit of up to 32M. The steps are similar: reset the controller, select the disk, send the 007 code to the CSR and read one word of the pseudo-disk size from DR. If the size of the image file mounted on the selected pseudo-drive is larger than 65534 blocks, the controller returns the number 65534 instead of this "large" size. We remind you that the number 65535 is used in some places for special purposes and cannot be the disk size.
307 +\\We also remind you that if the image file is not mounted on this drive, the sequence of actions will not work (command 001 select device) and the program execution will simply not reach this point. Therefore, these commands do not provide for errors.
310 310  
311 -Пример программы с "малыми" дисками
309 +Example of a program with "small" disks
312 312  
313 313  {{code language="assembler"}}
314 314  ;......................................
315 315  
316 -GetSiz=007; Получить "малый" размер диска
314 +GetSiz=007; Get the "small" disk size
317 317  
318 -; От фрагмента 3.2 (выбор диска) у нас в R3 остался
319 -; адрес DR (177222)
316 +; From fragment 3.2 (disk selection) we have in R3
317 +; DR address (177222)
320 320  
321 - MOV #GetSiz,-(R3); пошлем команду
322 - TST (R3)+; вернем адрес в R3 назад, на DR
319 + MOV #GetSiz,-(R3); send the command
320 + TST (R3)+; return the address in R3 back to DR
323 323   MOV @R3,DskSiz
324 324  ;......................................
325 325  {{/code}}
326 326  
327 -== **010: Разрешить работу сети** ==
325 +== 010: Allow network operation ==
328 328  
329 -Код команды 010. Закончив последовательность действий по передаче очередной порции данных, и ожидая, что следующий запрос последует не сразу же, можно "утилизировать" процессорное время микроконтроллера STM32, составляющего основу AZ - занять его обслуживанием сети. В той же RT-11 это можно сделать перед выходом из драйвера AZ, перед макрокомандой .DRFIN, завершающей исполнение запроса ввода-вывода.
330 -\\Действительно, операция ввода-вывода завершена, программа ЦП в системе будет готовить новую порцию данных для вывода, или соображать (на основании предыдущих прочитанных данных), где ей еще что-то прочитать, или вообще размышлять о чем-то своём. [[image:https://forum.maxiol.com/style_emoticons/default/smile.gif||alt="smile.gif"]] Другими словами, после окончания запроса ввода-вывода, довольно высока вероятность того, что последует пауза в работе с дисками AZ. Вот, время этой паузы и можно отдать на обслуживание сети. Для этого, перед исполнением макрокоманды .DRFIN в RT-11 или ее аналога в других ОС следует отправить в CSR код 110 (разрешить сеть плюс разрешить прерывания).
331 -\\Прерывание в этом случае не произойдет, оно активируется только по завершении "длительных" операций, которые переводят контроллер в состояние "Думаю, прошу не мешать", а установленный в "1" триггер разрешения прерываний, кроме этого, разрешает еще и работу сети, если она активирована. При запуске следующей операции ввода-вывода действия в п. 3.1 (сброс контроллера) сбросят и этот триггер, после чего программа обслуживания сети, обнаружив сброс этого триггера, прекратит (приостановит) свою работу и вернет управление основной программе обслуживания дисков AZ. Максимум, что можно заметить со стороны ЦП - это небольшая (10-20 мкс) задержка исполнения команды сброса, но это вполне умеренная плата за сетевые возможности.
332 -
327 +Command code 010. Having completed the sequence of actions for transferring the next portion of data, and expecting that the next request will not follow immediately, you can "utilize" the processor time of the STM32 microcontroller, which is the basis of AZ - occupy it with servicing the network. In the same RT-11, this can be done before exiting the AZ driver, before the .DRFIN macro command, which completes the execution of the input-output request.
328 +\\Indeed, the I/O operation is completed, the CPU program in the system will prepare a new portion of data for output, or figure out (based on the previously read data) where it should read something else, or generally think about something of its own. smile.gif In other words, after the I/O request is completed, there is a fairly high probability that there will be a pause in working with the AZ disks. So, the time of this pause can be given to servicing the network. To do this, before executing the .DRFIN macro in RT-11 or its analogue in other OS, you should send code 110 (enable network plus enable interrupts) to the CSR.
333 333  
334 -== **011: Получить таблицу назначений приводов AZn** ==
335 335  
336 -Код команды 011. Получив эту команду, контроллер переключается с буфера для блока на свою внутреннюю таблицу назначений (32 строки по 140 байт каждая)* . Перед выдачей этой команды следует сбросить контроллер. После выдачи этой команды следует выдать команду 015 (чтение буфера), но в этом случае будет читаться не буфер, а та самая таблица, последовательно, слово за словом.
337 -\\* начиная с версии v17, длина имени файла уже не 130 байт, а 386 байт (последнее слово - нулевое, для окончания строки)
331 +In this case, the interrupt will not occur, it is activated only upon completion of "long" operations that transfer the controller to the "Thinking, please do not interfere" state, and the interrupt enable trigger set to "1" also enables network operation if it is activated. When the next input-output operation is started, the actions in paragraph 3.1 (controller reset) will also reset this trigger, after which the network service program, having detected the reset of this trigger, will stop (suspend) its work and return control to the main disk service program AZ. The maximum that can be noticed from the CPU side is a small (10-20 µs) delay in executing the reset command, but this is a very reasonable price for network capabilities.
338 338  
339 -[[**//пример утилиты AZSMNT//**>>url:https://forum.maxiol.com/index.php?s=&showtopic=5605&view=findpost&p=59420]]
333 +== 011: Get AZn drive assignment table ==
340 340  
335 +Command code 011. Upon receiving this command, the controller switches from the block buffer to its internal assignment table (32 lines of 140 bytes each)*. Before issuing this command, the controller should be reset. After issuing this command, command 015 (read buffer) should be issued, but in this case it will not be the buffer that is read, but the same table, sequentially, word by word.
336 +\\* starting with v17, the file name length is no longer 130 bytes, but 386 bytes (the last word is zero, to end the line)
341 341  
342 -Пример программы:
338 +[[AZSMNT utility example>>url:https://forum.maxiol.com/index.php?s=&showtopic=5605&view=findpost&p=59420]]
343 343  
340 +
341 +Example program:
342 +
344 344  {{code language="assembler"}}
345 345  ;...................................
346 -AZ$CSR = 177220; CSR контроллера
347 -RdBuf = 012; Команда "Читать из памяти контроллера"
348 -RdTbl = 011; Команда "Читать таблицу назначений"
349 -TblSiz = 1120.; Длина таблицы в байтах (десятичная)
345 +AZ$CSR = 177220; Controller CSR
346 +RdBuf = 012; Command "Read from controller memory"
347 +RdTbl = 011; Command "Read assignment table"
348 +TblSiz = 1120.; Table length in bytes (decimal)
350 350  
351 -; Считаем, что в R2 находится адрес первого слова
352 -; области памяти для таблицы назначений. Процедуру
353 -; получения этого адреса не показываем.
350 +; We assume that R2 contains the address of the first word of the
351 +; memory area for the assignment table. We do not show the procedure for obtaining this address.
354 354  
355 - MOV #AZ$CSR,R3; Готовим CSR контроллера
353 + MOV #AZ$CSR,R3; Preparing the controller CSR
356 356  10$: CLR @R3;
357 - TSTB @R3; Сбросим контроллер
355 + TSTB @R3; Reset the controller
358 358   BPL 10$;
359 359  
360 - MOV #RdTbl,@R3; Команда "Передать
361 - ; таблицу"
358 + MOV #RdTbl,@R3;Command "Transfer
359 + ; table"
362 362  
363 - MOV #RdBuf,(R3+); Команда "Читать из
364 -; памяти контроллера. Одновременно передвинем адрес в R3
365 -; на DR контроллера (177222).
361 + MOV #RdBuf,(R3+); Command "Read from
362 +; controller memory. At the same time, move the address in R3
363 +; to the DR of the controller (177222).
366 366  
367 - MOV #TblSiz/2,R1; Готовим счетчик слов
365 + MOV #TblSiz/2,R1; Prepare the word counter
368 368  
369 -11$: MOV @R3,(R2)+; Перешлем текущее слово
370 - SOB R1,11$; и повторим 560 раз
367 +11$: MOV @R3,(R2)+; Send the current word
368 +SOB R1,11$; and repeat 560 times
371 371  ;...................................
372 372  {{/code}}
373 373