baadgeorge

селекторный

Dec 25th, 2021
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.02 KB | None | 0 0
  1. WRITELN "*********************************************";
  2. WRITELN "* Моделирование работы селекторного канала **";
  3. WRITELN "*********************************************";
  4. {Объявление переменных}
  5. VAR W7,WB,WF,WI,WJ,WK,WN,WR,WU;
  6. REG SB[2],RAKK[24],RAP[24],RCHP[32],BR[32],RDK[32],RDU[8];
  7. REG W1[5],ADDR[24];
  8. MEM OP[1024][8],PU[16][8];
  9. STRUCT RKK2[32] DLM[16],PRZ[16];
  10. STRUCT RKK1[32] ADR[24],KOP[8];
  11.  
  12.  
  13. GOSUB ZAGR; {Ввод данных и задание исходных данных}
  14. RAKK:=ADDR; {Установка RAKK}
  15.  
  16. L1: {Выбор старших байт канальной команды из ОП}
  17. RAP:=RAKK;
  18. GOSUB OUT_OP; {Чтение из ОП содержимого 4х ячеек}
  19. RKK1:=RCHP;
  20. RAKK:=RAKK+4;
  21.  
  22. L2: {Выбор младших байт канальной команды из ОП}
  23. RAP:=RAKK;
  24. GOSUB OUT_OP; {Чтение из ОП содержимого 4х ячеек}
  25. RKK2:=RCHP;
  26. RAKK:=RAKK+4;
  27. SB:=RKK1[0..1];
  28.  
  29. IF RKK1.KOP=1 THEN GOTO READING; {Если команда на чтение, то перейти к метке READING}
  30. IF RKK1.KOP=2 THEN GOTO WRITING; {Если команда на запись, то перейти к метке WRITING}
  31. WRITELN "НЕВЕРНЫЙ КОД ОПЕРАЦИИ"; {Иначе вывести сообщение о неверном коде операции}
  32. GOTO EXIT; {Завершить выполнение}
  33.  
  34. READING: {Чтение данных}
  35. GOSUB Z_RDU; {Загружение в регистр RDU очереного значения из PU}
  36. PAUSE;
  37. GOSUB K_U_K; {Запись 1 байта информации из RDU в RDK}
  38. PAUSE;
  39. RKK2.DLM:=RKK2.DLM-1; {Уменьшение на 1 значение поле длины массива}
  40. PAUSE;
  41. SB:=SB+1; {Увеличение значения счетчика байтов на 1}
  42. PAUSE;
  43. GOSUB W_REG; {Распечатка содержимого регистров RKK, SB, RDK, RDU }
  44. PAUSE;
  45. {Если SB<>0 и RKK2.DLM<>0, то переход к метке OUT}
  46. IF (SB<>0) AND (RKK2.DLM<>0) THEN GOTO OUT;
  47. PAUSE;
  48. {Иначе если SB=0 и RKK2.DLM=0}
  49. RAP:=RKK1.ADR; {В регистр RAP передаем адрес из RKK}
  50. PAUSE;
  51. BR:=RDK; {Передача данных их RDK в BR}
  52. PAUSE;
  53. GOSUB K_OP; {Запись в ОП блока информации из канала BR}
  54. PAUSE;
  55. GOSUB W_OP; {Распечатка содержимого ячеек ОП}
  56. PAUSE;
  57.  
  58. OUT:
  59. RKK1.ADR:=RKK1.ADR+1; {Увеличиваем значение поля адреса на 1}
  60. IF RKK2.DLM<>0 THEN GOTO READING; {Если длина массива <> 0 продолжаем чтение}
  61. GOTO L3; {Переход к метки 3}
  62.  
  63. WRITING: {Запись данных}
  64. RAP:=RKK1.ADR; {В регистр адреса памяти кладем адрес команды}
  65. PAUSE;
  66. GOSUB OUT_OP; {Выборка данных из ОП}
  67. PAUSE;
  68. BR:=RCHP; {В буферный регистр памяти кладем значеиние из регистра числа памяти}
  69. PAUSE;
  70. RDK:=BR; {Передача данных из буферного регистра в регистр данных канала}
  71. PAUSE;
  72.  
  73. L4:
  74. GOSUB K_U_K; {Запись 1 байта информации из RDU в RDK}
  75. PAUSE;
  76. SB:=SB+1; {Увеличение значения счетчика байтов на 1}
  77. RKK2.DLM:=RKK2.DLM-1;
  78. RKK1.ADR:=RKK1.ADR+1;
  79. GOSUB W_REG; {Распечатка содержимого регистров RKK, SB, RDK, RDU }
  80. IF RKK2.DLM=0 THEN GOTO L3;
  81. IF SB=0 THEN GOTO WRITING;
  82. GOTO L4;
  83.  
  84. L3:
  85. WRITELN;
  86. IF RKK2.PRZ=0H2000 THEN GOTO EXIT; {Если конец канальной команды, то закончить выполнение}
  87. IF RKK2.PRZ=0H6000 THEN GOTO L1; {Если цепочка команд, то переход к метке 1}
  88. IF RKK2.PRZ=0HA000 THEN RAP:=RAKK; {Цепочка данных, то }
  89. GOSUB OUT_OP; {Выборка данных из ОП}
  90. RKK1[0..23]:=RCHP[0..23];
  91. RAKK:=RAKK+4;
  92. GOTO L2;
  93.  
  94. EXIT:
  95. END;
  96.  
  97. {Описание подпрограмм}
  98. {Запись 1 байта информации из RDU в RDK}
  99. K_U_K:
  100. WU:=24-SB*8;
  101. IF RKK1.KOP=1 THEN RDK[WU..(WU+7)]:=RDU;
  102. IF RKK1.KOP=2 THEN RDU:=RDK[WU..(WU+7)];
  103. RETURN;
  104.  
  105. {Распечатка содержимого регистров RKK, SB, RDK, RDU }
  106. W_REG:
  107. WRITELN " RKK СЧ.БАЙТ РДК РДУ PAKK ";
  108. WRITE $H2 RKK1.KOP," ",$H6 RKK1.ADR," ";
  109. WRITE $H4 RKK2.PRZ," ",$H4 RKK2.DLM," ";
  110. WRITE $H1 SB," ",$H2 RDK[24..31]," ";
  111. WRITE $H2 RDK[16..23]," ",$H2 RDK[8..15]," ";
  112. WRITELN $H2 RDK[0..7]," ",$H2 RDU," ",$H6 RAKK;
  113. RETURN;
  114.  
  115. {Запись в ОП блока информации из канала BR}
  116. K_OP:
  117. {RAP-Д/Б РАНЕЕ ОПРЕДЕЛЕНО}
  118. GOSUB OUT_OP;
  119. W1:=(NOT (SB-1))*8;
  120. RCHP[W1..31]:=BR[W1..31];
  121. GOSUB IN_OP;
  122. RETURN;
  123.  
  124. {Запись в ОП содержимого регистра RCHP}
  125. IN_OP:
  126. FOR WI:=0 TO 3;
  127. WU:=24-WI*8;
  128. OP[RAP+WI]:=RCHP[WU..(WU+7)];
  129. NEXT;
  130. RETURN;
  131.  
  132. {Распечатка содержимого ячеек ОП}
  133. W_OP:
  134. WRITELN " СОДЕРЖИМОЕ ЯЧЕЕК ОП:";
  135. FOR WK:=0 TO 1;
  136. FOR WI:=0 TO 1;
  137. FOR WJ:=0 TO 3;
  138. WU:=OP[ADDR+3+WK*8]+WI*4+WJ;
  139. WRITE $H6 WU," ",$H2 OP[WU]," * ";
  140. NEXT;
  141. WRITELN;
  142. NEXT;NEXT;
  143. RETURN;
  144.  
  145. {Выборка из ОП содержимого 4х ячеек}
  146. OUT_OP:
  147. RAP[0..1]:=0;
  148. FOR WI:=0 TO 3;
  149. WU:=24-WI*8;
  150. RCHP[WU..(WU+7)]:=OP[RAP+WI];
  151. NEXT;
  152. RETURN;
  153.  
  154. {Загружение в регистр RDU очереного значения из PU}
  155. Z_RDU:
  156. RDU:=PU[WR]; WR:=WR+1;
  157. RETURN;
  158.  
  159. {Задание исходных данных}
  160. ZAGR:
  161. READ "Введите номер варианта",WN;
  162. ADDR:=200+WN*16;
  163. WR:=0;
  164. W7:=WN*7;
  165. WF:=0;
  166. OP[ADDR]:=2; OP[ADDR+8]:=2;
  167. IF WN[0..0]=1 THEN OP[ADDR]:=1;
  168. IF WN[0..0]=0 THEN OP[ADDR+8]:=WN[1..1];
  169. OP[ADDR+7]:=7-W7[0..1]; OP[ADDR+15]:=2+W7[0..1];
  170. IF OP[ADDR+8]=0 THEN OP[ADDR+4]:=160;
  171. IF OP[ADDR+8]<>0 THEN OP[ADDR+4]:=96;
  172. OP[ADDR+12]:=32;
  173. OP[(ADDR+3),2..4]:=W7[0..2]; OP[(ADDR+3),5..6]:=WN[2..3];
  174. OP[ADDR+11]:=OP[ADDR+3]+24+4*WN[0..1];
  175. FOR WI:=0 TO 1;
  176. WJ:=ADDR+8*WI;
  177. IF OP[WJ]=1 THEN WF:=WF+OP[WJ+7];
  178. IF OP[WJ]<>1 THEN GOSUB Z_OP;
  179. NEXT;
  180. WRITELN "ВАРИАНТ НОМЕР ",$D3 WN;
  181. WRITELN "АДРЕС ПЕРВОЙ КАН. КОМАНДЫ ",$H6 ADDR;
  182. WRITELN "КАНАЛЬНАЯ ПРОГРАММА: ";
  183. FOR WI:=0 TO 1;
  184. WRITE " ",$H2 OP[ADDR+WI*8]," ",$H2 OP[ADDR+1+WI*8];
  185. WRITE $H2 OP[ADDR+2+WI*8],$H2 OP[ADDR+3+WI*8]," ";
  186. WRITE $H2 OP[ADDR+4+WI*8],$H2 OP[ADDR+5+WI*8]," ";
  187. WRITELN $H2 OP[ADDR+6+WI*8],$H2 OP[ADDR+7+WI*8];
  188. NEXT;
  189. GOSUB W_OP;
  190. IF WF=0 THEN GOTO WM1;
  191. WRITELN "ЧИСЛА, СЧИТЫВАЕМЫЕ С ВУ:";
  192. FOR WI:=0 TO (WF-1);
  193. PU[WI]:=3+WI*WN*17;
  194. WRITE " ",$H2 PU[WI];
  195. NEXT;
  196.  
  197. WM1:
  198. WRITELN;
  199. WRITELN "************************************************";
  200. RETURN;
  201.  
  202. Z_OP:
  203. FOR WK:=0 TO 7;
  204. OP[OP[WJ+3]+WK]:=5+WK*WN*13+WJ;
  205. NEXT;
  206. RETURN;
Add Comment
Please, Sign In to add comment