baadgeorge

Untitled

Dec 25th, 2021
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.24 KB | None | 0 0
  1. WRITELN "*****************************************************";
  2. WRITELN "Моделирование функционирования мультиплексного канала";
  3. WRITELN "*****************************************************";
  4. {Объявление переменных}
  5. VAR I,WI,WJ,WK,WL,WN,WU,WX,WY;
  6. REG SB[2],RAKK[24],RAP[24],RCHP[32],BR[32],RDK[32],RDU[8],RVU[8],W1[5];
  7. MEM OP[1024][8],PU1[6][8],PU3[6][8],ZAPR[9][8];
  8. STRUCT RKK2[32] DLM[16],PRZ[16];
  9. STRUCT RKK1[32] ADR[24],KOP[8];
  10.  
  11. {Задание исходных данных}
  12. GOSUB ZAGR2;
  13. PAUSE;
  14. PAUSE;
  15.  
  16. FOR I:=1 TO 8;
  17. PAUSE;
  18. RVU:=ZAPR[I]; {Запись на регистр внешнего устройства номера обслуживаемого устройства}
  19. PAUSE;
  20. WRITELN;
  21. WRITELN "****************************************************";
  22. WRITELN "НОМЕР ОБСЛУЖИВАЕМОГО ЗАПРОСА * ",$D2 I," *";
  23. WRITELN "НОМЕР ОБСЛУЖИВАЕМОГО УСТРОЙСТВА * ",$D2 RVU," *";
  24. WRITELN "****************************************************";
  25.  
  26. GOSUB ACT; {Загрузка в регистры RKK, RDK, SB, RAKK содержимого из подконала ВУ}
  27. PAUSE;
  28.  
  29. IF RKK1.KOP=1 THEN GOTO READING; {Если Код Операции = 1 то чтение}
  30. IF RKK1.KOP=2 THEN GOTO WRITING; {Если Код Операции = 2 то запись}
  31.  
  32. READING:
  33. PAUSE;
  34. GOSUB Z_RDU; {Загрузка регистра RDU}
  35. PAUSE;
  36. GOSUB K_U_K; {Запись RDK из RDU}
  37. PAUSE;
  38. SB := SB+1; {Увеличене счетчика байт на 1}
  39. RKK2.DLM := RKK2.DLM-1; {Уменьшение длины массива на 1}
  40. PAUSE;
  41.  
  42. IF SB<>0 AND RKK2.DLM<>0 THEN GOTO NEXT_STEP;
  43. PAUSE;
  44. RAP := RKK1.ADR;
  45. BR := RDK; PAUSE;
  46. GOSUB K_OP; PAUSE;
  47.  
  48. NEXT_STEP:
  49. PAUSE;
  50. RKK1.ADR := RKK1.ADR+1; {Переход к следующему адресу}
  51. GOSUB W_OP; {Печать содержимого памяти}
  52. IF RKK2.DLM = 0 THEN GOTO THREE;
  53. IF RKK2.DLM <> 0 THEN GOTO ONE;
  54.  
  55. WRITING: {Запись}
  56. PAUSE;
  57. GOSUB K_U_K; PAUSE; {Запись RDU из RDK}
  58. SB := SB+1; {Увеличене счетчика байт на 1}
  59. RKK2.DLM := RKK2.DLM-1; {Уменьшение длины массива на 1}
  60. RKK1.ADR := RKK1.ADR+1; PAUSE; {Переход к следующему адресу}
  61.  
  62. IF RKK2.DLM = 0 THEN GOTO THREE;
  63.  
  64. IF SB <> 0 THEN GOTO ONE;
  65.  
  66. TWO:
  67. RAP := RKK1.ADR;
  68. GOSUB OUT_OP; PAUSE; {Чтение из памяти}
  69. BR := RCHP; PAUSE;
  70. RDK := BR; PAUSE;
  71.  
  72. ONE:
  73. GOSUB PAS; PAUSE; {Запесь содержимого регистра канала в регистр подканала}
  74. GOSUB W_PK; PAUSE; {Печать содержимого подканалов и RDU}
  75. GOTO NEXT_KOMAND; {Переход к следующей команде}
  76.  
  77.  
  78.  
  79. THREE:
  80. SB := 0; PAUSE; {Обнуление счетчика байт}
  81.  
  82. IF RKK2.PRZ = 8192 THEN GOTO END_OF_KOMAND;
  83. IF RKK2.PRZ = 24576 THEN GOTO CIRCUIT_OF_KOMAND;
  84. IF RKK2.PRZ = 40960 THEN GOTO CIRCUIT_OF_DATA;
  85.  
  86. END_OF_KOMAND:
  87. RAKK := 0; RKK1 := 0; RKK2 := 0; RDK := 0; SB := 0; PAUSE;
  88. GOTO ONE;
  89.  
  90.  
  91. CIRCUIT_OF_KOMAND:
  92. PAUSE; {Выбор старших байтов канальной команды из ОП}
  93. RAP := RAKK;
  94. GOSUB OUT_OP;
  95. RKK1 := RCHP;
  96. GOTO NEXT_READING;
  97.  
  98. CIRCUIT_OF_DATA:
  99. PAUSE; {Выбор старших байтов канальной команды из ОП без кода операции}
  100. RAP := RAKK;
  101. GOSUB OUT_OP; PAUSE;
  102. RKK1.ADR := RCHP[0..23]; PAUSE;
  103.  
  104. NEXT_READING:
  105. PAUSE;
  106. RAKK := RAKK+4; RAP := RAKK;
  107. GOSUB OUT_OP; PAUSE;
  108. RKK2 := RCHP; PAUSE;
  109. RAKK := RAKK+4; RAP := RAKK;
  110.  
  111.  
  112.  
  113. IF RKK1.KOP = 1 THEN GOTO ONE;
  114. IF RKK1.KOP = 2 THEN GOTO TWO;
  115.  
  116.  
  117.  
  118. NEXT_KOMAND:
  119. NEXT;
  120. END;
  121.  
  122.  
  123.  
  124. { ********* ПОДПРОГРАММЫ ************************* }
  125. { * ПП ОБМЕНА МЕЖДУ КАНАЛОМ И ВУ * }
  126. K_U_K:
  127. WU:=24-SB*8;
  128. IF RKK1.KOP=1 THEN RDK[WU..(WU+7)]:=RDU;
  129. IF RKK1.KOP=2 THEN RDU:=RDK[WU..(WU+7)];
  130. RETURN;
  131.  
  132. { * ПП РАСПЕЧАТКИ СОДЕРЖИМОГО ПОДКАНАЛОВ И РДУ * }
  133. W_PK:
  134. WRITELN;
  135. WRITELN "РДУ=",$H2 RDU;
  136. WRITELN "СОДЕРЖИМОЕ ПОДКАНАЛОВ: ";
  137. WRITELN " РКК РДК СБ РАКК ";
  138. FOR WI:=0 TO 2;
  139. FOR WJ:=0 TO 15;
  140. WRITE $H2 OP[960+16*WI+WJ];
  141. IF (WJ=0)OR(WJ=3)OR(WJ=5)OR(WJ=8)OR(WJ=9)OR(WJ=10) THEN WRITE " ";
  142. IF (WJ=7)OR(WJ=11)OR(WJ=12)OR(WJ=15) THEN WRITE " * ";
  143. NEXT; WRITELN; NEXT;
  144. WRITELN "****************************************************";
  145. RETURN;
  146.  
  147. { * ПП ПЕРЕДАЧИ ДАННЫХ ИЗ КАНАЛА В ПАМЯТЬ * }
  148. K_OP:
  149. {RAP-Д/Б РАНЕЕ ОПРЕДЕЛЕНО}
  150. GOSUB OUT_OP;
  151. W1:=(NOT (SB-1))*8;
  152. RCHP[W1..31]:=BR[W1..31];
  153. GOSUB IN_OP;
  154. RETURN;
  155.  
  156. { * ПП ПЕРЕЗАПИСИ РЧП В ЯЧЕЙКИ ОП * }
  157. IN_OP:
  158. FOR WI:=0 TO 3;
  159. WU:=24-WI*8;
  160. OP[RAP+WI]:=RCHP[WU..(WU+7)];
  161. NEXT;
  162. RETURN;
  163.  
  164. { * ПП РАСПЕЧАТКИ СОДЕРЖИМОГО ПАМЯТИ * }
  165. W_OP:
  166. WRITELN;
  167. WRITELN "СОДЕРЖИМОЕ ЯЧЕЕК ОП:";
  168. WX:=0;
  169. FOR WI:=0 TO 4;
  170. WX:=WX+WI*20;
  171. FOR WY:=0 TO 1;
  172. FOR WJ:=0 TO 3;
  173. WU:=16+WX+WY*4+WJ;
  174. WRITE $H6 WU," ",$H2 OP[WU]," * ";
  175. NEXT;
  176. WRITELN;
  177. NEXT;NEXT;
  178. RETURN;
  179.  
  180. { * ПП ЧТЕНИЯ ИЗ ПАМЯТИ * }
  181. OUT_OP:
  182. RAP[0..1]:=0;
  183. FOR WI:=0 TO 3;
  184. WU:=24-WI*8;
  185. RCHP[WU..(WU+7)]:=OP[RAP+WI];
  186. NEXT;
  187. RETURN;
  188.  
  189. { * ПП ЗАГРУЗКИ РЕГИСТРОВ КАНАЛА ИЗ ПОДКАНАЛА * }
  190. ACT:
  191. RAP:=960+(RVU-1)*16;
  192. GOSUB OUT_OP;
  193. RKK1:=RCHP;
  194. RAP:=RAP+4;
  195. GOSUB OUT_OP;
  196. RKK2:=RCHP;
  197. RAP:=RAP+4;
  198. GOSUB OUT_OP;
  199. RDK:=RCHP;
  200. RAP:=RAP+4;
  201. GOSUB OUT_OP;
  202. RAKK:=RCHP[0..23];
  203. SB:=RCHP[24..25];
  204. RETURN;
  205.  
  206. { * ПП ЗАПИСИ РЕГ. КАНАЛА В ПОДКАНАЛ * }
  207. PAS:
  208. RAP:=960+(RVU-1)*16;
  209. RCHP:=RKK1;
  210. GOSUB IN_OP;
  211. RAP:=RAP+4;
  212. RCHP:=RKK2;
  213. GOSUB IN_OP;
  214. RAP:=RAP+4;
  215. RCHP:=RDK;
  216. GOSUB IN_OP;
  217. RAP:=RAP+4;
  218. RCHP[24..31]:=SB; RCHP[0..23]:=RAKK;
  219. GOSUB IN_OP;
  220. RETURN;
  221.  
  222. { * ПП ЗАГРУЗКИ РДУ * }
  223. Z_RDU:
  224. IF ZAPR[I]=3 THEN GOTO LBL3;
  225. RDU:=PU1[WK]; WK:=WK+1;
  226. pause;
  227. RETURN;
  228. LBL3:
  229. RDU:=PU3[WL]; WL:=WL+1;
  230. RETURN;
  231.  
  232. { ****** ЗАДАНИЕ ИСХ.ДАННЫХ ****** }
  233. { НЕ ДЛЯ ИЗУЧЕНИЯ !!! }
  234. ZAGR2:
  235. READ " ВВЕДИТЕ НОМЕР ВАРИАНТА ",WN;
  236. WRITELN "**************************************************";
  237. WRITELN "ИСХОДНЫЕ ДАННЫЕ:";
  238. WRITELN "ВАРИАНТ НОМЕР ",$D3 WN;
  239. RAP:=800; RCHP:=0H0200010; GOSUB IN_OP;
  240. RAP:=RAP+4; RCHP:=0H60000007; GOSUB IN_OP;
  241. RAP:=RAP+4; RCHP:=0H01000024; GOSUB IN_OP;
  242. RAP:=RAP+4; RCHP:=0H20000006; GOSUB IN_OP;
  243. RAP:=RAP+4; RCHP:=0H0200004C; GOSUB IN_OP;
  244. RAP:=RAP+4; RCHP:=0HA0000002; GOSUB IN_OP;
  245. RAP:=RAP+4; RCHP:=0H00000088; GOSUB IN_OP;
  246. RAP:=RAP+4; RCHP:=0H20000004; GOSUB IN_OP;
  247. RAP:=RAP+4; RCHP:=0H010000D8; GOSUB IN_OP;
  248. RAP:=RAP+4; RCHP:=0H20000005; GOSUB IN_OP;
  249. WRITELN "КАНАЛЬНЫЕ ПРОГРАММЫ: ";
  250. WRITELN " ДЛЯ 1-го ВУ, В ПАМЯТИ ХРАНИТСЯ С АДРЕСА 000320:";
  251. WRITELN " 02 000010 6000 0007 ";
  252. WRITELN " 01 000024 2000 0006 ";
  253. WRITELN " ДЛЯ 2-го ВУ, В ПАМЯТИ ХРАНИТСЯ С АДРЕСА 000330:";
  254. WRITELN " 02 00004C A000 0002 ";
  255. WRITELN " 00 000088 2000 0004 ";
  256. WRITELN " ДЛЯ 3-го ВУ, В ПАМЯТИ ХРАНИТСЯ С АДРЕСА 000340: ";
  257. WRITELN " 01 0000D8 2000 0005 ";
  258. { ЗАГРУЗКА ПОДКАНАЛОВ }
  259. RAP:=960; RCHP:=0H02000012; GOSUB IN_OP;
  260. RAP:=RAP+4; RCHP:=0H60000005; GOSUB IN_OP;
  261. RAP:=RAP+8; RCHP:=0H02000328; GOSUB IN_OP;
  262. RAP:=976; RCHP:=0H0200004C; GOSUB IN_OP;
  263. RAP:=RAP+4; RCHP:=0HA0000002; GOSUB IN_OP;
  264. RAP:=RAP+8; RCHP:=0H00000338; GOSUB IN_OP;
  265. RAP:=992; RCHP:=0H010000D9; GOSUB IN_OP;
  266. RAP:=RAP+4; RCHP:=0H20000004; GOSUB IN_OP;
  267. RAP:=RAP+8; RCHP:=0H01000348; GOSUB IN_OP;
  268. IF WN<6 THEN GOTO LBL4;
  269. OP[963]:=19; OP[967]:=4; OP[972]:=3; OP[979]:=137;
  270. OP[980]:=32; OP[983]:=3; OP[988]:=1; OP[991]:=64;
  271. OP[995]:=218; OP[999]:=3; OP[1004]:=2;
  272. IF WN>10 THEN GOTO LBL4;
  273. OP[960]:=1; OP[963]:=39; OP[964]:=32; OP[967]:=3;
  274. OP[975]:=48; OP[979]:=77; OP[980]:=160; OP[983]:=1;
  275. OP[991]:=56; OP[995]:=216; OP[999]:=5; OP[1004]:=0;
  276. LBL4:
  277. { ЗАГРУЗКА ПАМЯТИ ДАННЫМИ }
  278. FOR WI:=0 TO 2;
  279. FOR WJ:=0 TO 7;
  280. OP[16+WI*60+WJ]:=5+WJ*WN*93+WI*17+WJ+WN;
  281. OP[36+WI*90+WJ]:=0;
  282. NEXT; NEXT;
  283. GOSUB W_OP;
  284. { НАЧАЛЬНЫЕ ЗНАЧЕНИЯ РДК }
  285. RAP:=OP[963]; GOSUB OUT_OP; RAP:=968; GOSUB IN_OP;
  286. RAP:=OP[979]; GOSUB OUT_OP; RAP:=984; GOSUB IN_OP;
  287. { ФОРМИРОВАНИЕ СПИСКА ЗАПРОСОВ }
  288. RAP:=1008; RCHP:=0H6D9B6D9B;
  289. GOSUB IN_OP;
  290. RAP:=RAP+4; RCHP:=0H799E799E;
  291. GOSUB IN_OP;
  292. RAP:=RAP+4; RCHP:=0H6DE76DE7;
  293. GOSUB IN_OP;
  294. RAP:=RAP+4; RCHP:=0H79B779B7;
  295. GOSUB IN_OP;
  296. RAP:=1008+WN[0..1]*4;
  297. GOSUB OUT_OP;
  298. WJ:=31-WN[2..3]*4;
  299. WRITE "ПОСЛЕДОВАТЕЛЬНОСТЬ ЗАПРОСОВ : ";
  300. FOR WI:=1 TO 8;
  301. ZAPR[WI]:=RCHP[(WJ-1)..WJ];
  302. WJ:=WJ-2;
  303. WRITE $D2 ZAPR[WI];
  304. NEXT;
  305. WRITELN;
  306. { ЧИСЛА ДЛЯ ВВОДА С ВУ }
  307. WK:=0; WL:=0;
  308. FOR WI:=0 TO 5;
  309. PU1[WI]:=3+WI*WN*17;
  310. PU3[WI]:=7+WI*WN*19;
  311. IF (OP[963]-WI)<=36 THEN GOTO LBL1;
  312. OP[968+WK]:=PU1[WI]; WK:=WK+1;
  313. LBL1:
  314. IF (OP[995]-WI)<=216 THEN GOTO LBL2;
  315. OP[1000+WL]:=PU3[WI]; WL:=WL+1;
  316. LBL2:
  317. NEXT;
  318. WRITE " ЧИСЛА, СЧИТЫВАЕМЫЕ С 1-го ВУ: ";
  319. FOR WI:=WK TO 5;
  320. WRITE $H2 PU1[WI]," ";
  321. NEXT;
  322. WRITELN;
  323. WRITE " ЧИСЛА, СЧИТЫВАЕМЫЕ С 3-го ВУ: ";
  324. FOR WI:=WL TO 4;
  325. WRITE $H2 PU3[WI]," ";
  326. NEXT; WRITELN;
  327. GOSUB W_PK;
  328. RETURN;
Add Comment
Please, Sign In to add comment