Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WRITELN "*****************************************************";
- WRITELN "Моделирование функционирования мультиплексного канала";
- WRITELN "*****************************************************";
- {Объявление переменных}
- VAR I,WI,WJ,WK,WL,WN,WU,WX,WY;
- REG SB[2],RAKK[24],RAP[24],RCHP[32],BR[32],RDK[32],RDU[8],RVU[8],W1[5];
- MEM OP[1024][8],PU1[6][8],PU3[6][8],ZAPR[9][8];
- STRUCT RKK2[32] DLM[16],PRZ[16];
- STRUCT RKK1[32] ADR[24],KOP[8];
- {Задание исходных данных}
- GOSUB ZAGR2;
- PAUSE;
- PAUSE;
- FOR I:=1 TO 8;
- PAUSE;
- RVU:=ZAPR[I]; {Запись на регистр внешнего устройства номера обслуживаемого устройства}
- PAUSE;
- WRITELN;
- WRITELN "****************************************************";
- WRITELN "НОМЕР ОБСЛУЖИВАЕМОГО ЗАПРОСА * ",$D2 I," *";
- WRITELN "НОМЕР ОБСЛУЖИВАЕМОГО УСТРОЙСТВА * ",$D2 RVU," *";
- WRITELN "****************************************************";
- GOSUB ACT; {Загрузка в регистры RKK, RDK, SB, RAKK содержимого из подконала ВУ}
- PAUSE;
- IF RKK1.KOP=1 THEN GOTO READING; {Если Код Операции = 1 то чтение}
- IF RKK1.KOP=2 THEN GOTO WRITING; {Если Код Операции = 2 то запись}
- READING:
- PAUSE;
- GOSUB Z_RDU; {Загрузка регистра RDU}
- PAUSE;
- GOSUB K_U_K; {Запись RDK из RDU}
- PAUSE;
- SB := SB+1; {Увеличене счетчика байт на 1}
- RKK2.DLM := RKK2.DLM-1; {Уменьшение длины массива на 1}
- PAUSE;
- IF SB<>0 AND RKK2.DLM<>0 THEN GOTO NEXT_STEP;
- PAUSE;
- RAP := RKK1.ADR;
- BR := RDK; PAUSE;
- GOSUB K_OP; PAUSE;
- NEXT_STEP:
- PAUSE;
- RKK1.ADR := RKK1.ADR+1; {Переход к следующему адресу}
- GOSUB W_OP; {Печать содержимого памяти}
- IF RKK2.DLM = 0 THEN GOTO THREE;
- IF RKK2.DLM <> 0 THEN GOTO ONE;
- WRITING: {Запись}
- PAUSE;
- GOSUB K_U_K; PAUSE; {Запись RDU из RDK}
- SB := SB+1; {Увеличене счетчика байт на 1}
- RKK2.DLM := RKK2.DLM-1; {Уменьшение длины массива на 1}
- RKK1.ADR := RKK1.ADR+1; PAUSE; {Переход к следующему адресу}
- IF RKK2.DLM = 0 THEN GOTO THREE;
- IF SB <> 0 THEN GOTO ONE;
- TWO:
- RAP := RKK1.ADR;
- GOSUB OUT_OP; PAUSE; {Чтение из памяти}
- BR := RCHP; PAUSE;
- RDK := BR; PAUSE;
- ONE:
- GOSUB PAS; PAUSE; {Запесь содержимого регистра канала в регистр подканала}
- GOSUB W_PK; PAUSE; {Печать содержимого подканалов и RDU}
- GOTO NEXT_KOMAND; {Переход к следующей команде}
- THREE:
- SB := 0; PAUSE; {Обнуление счетчика байт}
- IF RKK2.PRZ = 8192 THEN GOTO END_OF_KOMAND;
- IF RKK2.PRZ = 24576 THEN GOTO CIRCUIT_OF_KOMAND;
- IF RKK2.PRZ = 40960 THEN GOTO CIRCUIT_OF_DATA;
- END_OF_KOMAND:
- RAKK := 0; RKK1 := 0; RKK2 := 0; RDK := 0; SB := 0; PAUSE;
- GOTO ONE;
- CIRCUIT_OF_KOMAND:
- PAUSE; {Выбор старших байтов канальной команды из ОП}
- RAP := RAKK;
- GOSUB OUT_OP;
- RKK1 := RCHP;
- GOTO NEXT_READING;
- CIRCUIT_OF_DATA:
- PAUSE; {Выбор старших байтов канальной команды из ОП без кода операции}
- RAP := RAKK;
- GOSUB OUT_OP; PAUSE;
- RKK1.ADR := RCHP[0..23]; PAUSE;
- NEXT_READING:
- PAUSE;
- RAKK := RAKK+4; RAP := RAKK;
- GOSUB OUT_OP; PAUSE;
- RKK2 := RCHP; PAUSE;
- RAKK := RAKK+4; RAP := RAKK;
- IF RKK1.KOP = 1 THEN GOTO ONE;
- IF RKK1.KOP = 2 THEN GOTO TWO;
- NEXT_KOMAND:
- NEXT;
- END;
- { ********* ПОДПРОГРАММЫ ************************* }
- { * ПП ОБМЕНА МЕЖДУ КАНАЛОМ И ВУ * }
- K_U_K:
- WU:=24-SB*8;
- IF RKK1.KOP=1 THEN RDK[WU..(WU+7)]:=RDU;
- IF RKK1.KOP=2 THEN RDU:=RDK[WU..(WU+7)];
- RETURN;
- { * ПП РАСПЕЧАТКИ СОДЕРЖИМОГО ПОДКАНАЛОВ И РДУ * }
- W_PK:
- WRITELN;
- WRITELN "РДУ=",$H2 RDU;
- WRITELN "СОДЕРЖИМОЕ ПОДКАНАЛОВ: ";
- WRITELN " РКК РДК СБ РАКК ";
- FOR WI:=0 TO 2;
- FOR WJ:=0 TO 15;
- WRITE $H2 OP[960+16*WI+WJ];
- IF (WJ=0)OR(WJ=3)OR(WJ=5)OR(WJ=8)OR(WJ=9)OR(WJ=10) THEN WRITE " ";
- IF (WJ=7)OR(WJ=11)OR(WJ=12)OR(WJ=15) THEN WRITE " * ";
- NEXT; WRITELN; NEXT;
- WRITELN "****************************************************";
- RETURN;
- { * ПП ПЕРЕДАЧИ ДАННЫХ ИЗ КАНАЛА В ПАМЯТЬ * }
- K_OP:
- {RAP-Д/Б РАНЕЕ ОПРЕДЕЛЕНО}
- GOSUB OUT_OP;
- W1:=(NOT (SB-1))*8;
- RCHP[W1..31]:=BR[W1..31];
- GOSUB IN_OP;
- RETURN;
- { * ПП ПЕРЕЗАПИСИ РЧП В ЯЧЕЙКИ ОП * }
- IN_OP:
- FOR WI:=0 TO 3;
- WU:=24-WI*8;
- OP[RAP+WI]:=RCHP[WU..(WU+7)];
- NEXT;
- RETURN;
- { * ПП РАСПЕЧАТКИ СОДЕРЖИМОГО ПАМЯТИ * }
- W_OP:
- WRITELN;
- WRITELN "СОДЕРЖИМОЕ ЯЧЕЕК ОП:";
- WX:=0;
- FOR WI:=0 TO 4;
- WX:=WX+WI*20;
- FOR WY:=0 TO 1;
- FOR WJ:=0 TO 3;
- WU:=16+WX+WY*4+WJ;
- WRITE $H6 WU," ",$H2 OP[WU]," * ";
- NEXT;
- WRITELN;
- NEXT;NEXT;
- RETURN;
- { * ПП ЧТЕНИЯ ИЗ ПАМЯТИ * }
- OUT_OP:
- RAP[0..1]:=0;
- FOR WI:=0 TO 3;
- WU:=24-WI*8;
- RCHP[WU..(WU+7)]:=OP[RAP+WI];
- NEXT;
- RETURN;
- { * ПП ЗАГРУЗКИ РЕГИСТРОВ КАНАЛА ИЗ ПОДКАНАЛА * }
- ACT:
- RAP:=960+(RVU-1)*16;
- GOSUB OUT_OP;
- RKK1:=RCHP;
- RAP:=RAP+4;
- GOSUB OUT_OP;
- RKK2:=RCHP;
- RAP:=RAP+4;
- GOSUB OUT_OP;
- RDK:=RCHP;
- RAP:=RAP+4;
- GOSUB OUT_OP;
- RAKK:=RCHP[0..23];
- SB:=RCHP[24..25];
- RETURN;
- { * ПП ЗАПИСИ РЕГ. КАНАЛА В ПОДКАНАЛ * }
- PAS:
- RAP:=960+(RVU-1)*16;
- RCHP:=RKK1;
- GOSUB IN_OP;
- RAP:=RAP+4;
- RCHP:=RKK2;
- GOSUB IN_OP;
- RAP:=RAP+4;
- RCHP:=RDK;
- GOSUB IN_OP;
- RAP:=RAP+4;
- RCHP[24..31]:=SB; RCHP[0..23]:=RAKK;
- GOSUB IN_OP;
- RETURN;
- { * ПП ЗАГРУЗКИ РДУ * }
- Z_RDU:
- IF ZAPR[I]=3 THEN GOTO LBL3;
- RDU:=PU1[WK]; WK:=WK+1;
- pause;
- RETURN;
- LBL3:
- RDU:=PU3[WL]; WL:=WL+1;
- RETURN;
- { ****** ЗАДАНИЕ ИСХ.ДАННЫХ ****** }
- { НЕ ДЛЯ ИЗУЧЕНИЯ !!! }
- ZAGR2:
- READ " ВВЕДИТЕ НОМЕР ВАРИАНТА ",WN;
- WRITELN "**************************************************";
- WRITELN "ИСХОДНЫЕ ДАННЫЕ:";
- WRITELN "ВАРИАНТ НОМЕР ",$D3 WN;
- RAP:=800; RCHP:=0H0200010; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H60000007; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H01000024; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H20000006; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H0200004C; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0HA0000002; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H00000088; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H20000004; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H010000D8; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H20000005; GOSUB IN_OP;
- WRITELN "КАНАЛЬНЫЕ ПРОГРАММЫ: ";
- WRITELN " ДЛЯ 1-го ВУ, В ПАМЯТИ ХРАНИТСЯ С АДРЕСА 000320:";
- WRITELN " 02 000010 6000 0007 ";
- WRITELN " 01 000024 2000 0006 ";
- WRITELN " ДЛЯ 2-го ВУ, В ПАМЯТИ ХРАНИТСЯ С АДРЕСА 000330:";
- WRITELN " 02 00004C A000 0002 ";
- WRITELN " 00 000088 2000 0004 ";
- WRITELN " ДЛЯ 3-го ВУ, В ПАМЯТИ ХРАНИТСЯ С АДРЕСА 000340: ";
- WRITELN " 01 0000D8 2000 0005 ";
- { ЗАГРУЗКА ПОДКАНАЛОВ }
- RAP:=960; RCHP:=0H02000012; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H60000005; GOSUB IN_OP;
- RAP:=RAP+8; RCHP:=0H02000328; GOSUB IN_OP;
- RAP:=976; RCHP:=0H0200004C; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0HA0000002; GOSUB IN_OP;
- RAP:=RAP+8; RCHP:=0H00000338; GOSUB IN_OP;
- RAP:=992; RCHP:=0H010000D9; GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H20000004; GOSUB IN_OP;
- RAP:=RAP+8; RCHP:=0H01000348; GOSUB IN_OP;
- IF WN<6 THEN GOTO LBL4;
- OP[963]:=19; OP[967]:=4; OP[972]:=3; OP[979]:=137;
- OP[980]:=32; OP[983]:=3; OP[988]:=1; OP[991]:=64;
- OP[995]:=218; OP[999]:=3; OP[1004]:=2;
- IF WN>10 THEN GOTO LBL4;
- OP[960]:=1; OP[963]:=39; OP[964]:=32; OP[967]:=3;
- OP[975]:=48; OP[979]:=77; OP[980]:=160; OP[983]:=1;
- OP[991]:=56; OP[995]:=216; OP[999]:=5; OP[1004]:=0;
- LBL4:
- { ЗАГРУЗКА ПАМЯТИ ДАННЫМИ }
- FOR WI:=0 TO 2;
- FOR WJ:=0 TO 7;
- OP[16+WI*60+WJ]:=5+WJ*WN*93+WI*17+WJ+WN;
- OP[36+WI*90+WJ]:=0;
- NEXT; NEXT;
- GOSUB W_OP;
- { НАЧАЛЬНЫЕ ЗНАЧЕНИЯ РДК }
- RAP:=OP[963]; GOSUB OUT_OP; RAP:=968; GOSUB IN_OP;
- RAP:=OP[979]; GOSUB OUT_OP; RAP:=984; GOSUB IN_OP;
- { ФОРМИРОВАНИЕ СПИСКА ЗАПРОСОВ }
- RAP:=1008; RCHP:=0H6D9B6D9B;
- GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H799E799E;
- GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H6DE76DE7;
- GOSUB IN_OP;
- RAP:=RAP+4; RCHP:=0H79B779B7;
- GOSUB IN_OP;
- RAP:=1008+WN[0..1]*4;
- GOSUB OUT_OP;
- WJ:=31-WN[2..3]*4;
- WRITE "ПОСЛЕДОВАТЕЛЬНОСТЬ ЗАПРОСОВ : ";
- FOR WI:=1 TO 8;
- ZAPR[WI]:=RCHP[(WJ-1)..WJ];
- WJ:=WJ-2;
- WRITE $D2 ZAPR[WI];
- NEXT;
- WRITELN;
- { ЧИСЛА ДЛЯ ВВОДА С ВУ }
- WK:=0; WL:=0;
- FOR WI:=0 TO 5;
- PU1[WI]:=3+WI*WN*17;
- PU3[WI]:=7+WI*WN*19;
- IF (OP[963]-WI)<=36 THEN GOTO LBL1;
- OP[968+WK]:=PU1[WI]; WK:=WK+1;
- LBL1:
- IF (OP[995]-WI)<=216 THEN GOTO LBL2;
- OP[1000+WL]:=PU3[WI]; WL:=WL+1;
- LBL2:
- NEXT;
- WRITE " ЧИСЛА, СЧИТЫВАЕМЫЕ С 1-го ВУ: ";
- FOR WI:=WK TO 5;
- WRITE $H2 PU1[WI]," ";
- NEXT;
- WRITELN;
- WRITE " ЧИСЛА, СЧИТЫВАЕМЫЕ С 3-го ВУ: ";
- FOR WI:=WL TO 4;
- WRITE $H2 PU3[WI]," ";
- NEXT; WRITELN;
- GOSUB W_PK;
- RETURN;
Add Comment
Please, Sign In to add comment