Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WRITELN "*********************************************";
- WRITELN "* Моделирование работы селекторного канала **";
- WRITELN "*********************************************";
- {Объявление переменных}
- VAR W7,WB,WF,WI,WJ,WK,WN,WR,WU;
- REG SB[2],RAKK[24],RAP[24],RCHP[32],BR[32],RDK[32],RDU[8];
- REG W1[5],ADDR[24];
- MEM OP[1024][8],PU[16][8];
- STRUCT RKK2[32] DLM[16],PRZ[16];
- STRUCT RKK1[32] ADR[24],KOP[8];
- GOSUB ZAGR; {Ввод данных и задание исходных данных}
- RAKK:=ADDR; {Установка RAKK}
- L1: {Выбор старших байт канальной команды из ОП}
- RAP:=RAKK;
- GOSUB OUT_OP; {Чтение из ОП содержимого 4х ячеек}
- RKK1:=RCHP;
- RAKK:=RAKK+4;
- L2: {Выбор младших байт канальной команды из ОП}
- RAP:=RAKK;
- GOSUB OUT_OP; {Чтение из ОП содержимого 4х ячеек}
- RKK2:=RCHP;
- RAKK:=RAKK+4;
- SB:=RKK1[0..1];
- IF RKK1.KOP=1 THEN GOTO READING; {Если команда на чтение, то перейти к метке READING}
- IF RKK1.KOP=2 THEN GOTO WRITING; {Если команда на запись, то перейти к метке WRITING}
- WRITELN "НЕВЕРНЫЙ КОД ОПЕРАЦИИ"; {Иначе вывести сообщение о неверном коде операции}
- GOTO EXIT; {Завершить выполнение}
- READING: {Чтение данных}
- GOSUB Z_RDU; {Загружение в регистр RDU очереного значения из PU}
- PAUSE;
- GOSUB K_U_K; {Запись 1 байта информации из RDU в RDK}
- PAUSE;
- RKK2.DLM:=RKK2.DLM-1; {Уменьшение на 1 значение поле длины массива}
- PAUSE;
- SB:=SB+1; {Увеличение значения счетчика байтов на 1}
- PAUSE;
- GOSUB W_REG; {Распечатка содержимого регистров RKK, SB, RDK, RDU }
- PAUSE;
- {Если SB<>0 и RKK2.DLM<>0, то переход к метке OUT}
- IF (SB<>0) AND (RKK2.DLM<>0) THEN GOTO OUT;
- PAUSE;
- {Иначе если SB=0 и RKK2.DLM=0}
- RAP:=RKK1.ADR; {В регистр RAP передаем адрес из RKK}
- PAUSE;
- BR:=RDK; {Передача данных их RDK в BR}
- PAUSE;
- GOSUB K_OP; {Запись в ОП блока информации из канала BR}
- PAUSE;
- GOSUB W_OP; {Распечатка содержимого ячеек ОП}
- PAUSE;
- OUT:
- RKK1.ADR:=RKK1.ADR+1; {Увеличиваем значение поля адреса на 1}
- IF RKK2.DLM<>0 THEN GOTO READING; {Если длина массива <> 0 продолжаем чтение}
- GOTO L3; {Переход к метки 3}
- WRITING: {Запись данных}
- RAP:=RKK1.ADR; {В регистр адреса памяти кладем адрес команды}
- PAUSE;
- GOSUB OUT_OP; {Выборка данных из ОП}
- PAUSE;
- BR:=RCHP; {В буферный регистр памяти кладем значеиние из регистра числа памяти}
- PAUSE;
- RDK:=BR; {Передача данных из буферного регистра в регистр данных канала}
- PAUSE;
- L4:
- GOSUB K_U_K; {Запись 1 байта информации из RDU в RDK}
- PAUSE;
- SB:=SB+1; {Увеличение значения счетчика байтов на 1}
- RKK2.DLM:=RKK2.DLM-1;
- RKK1.ADR:=RKK1.ADR+1;
- GOSUB W_REG; {Распечатка содержимого регистров RKK, SB, RDK, RDU }
- IF RKK2.DLM=0 THEN GOTO L3;
- IF SB=0 THEN GOTO WRITING;
- GOTO L4;
- L3:
- WRITELN;
- IF RKK2.PRZ=0H2000 THEN GOTO EXIT; {Если конец канальной команды, то закончить выполнение}
- IF RKK2.PRZ=0H6000 THEN GOTO L1; {Если цепочка команд, то переход к метке 1}
- IF RKK2.PRZ=0HA000 THEN RAP:=RAKK; {Цепочка данных, то }
- GOSUB OUT_OP; {Выборка данных из ОП}
- RKK1[0..23]:=RCHP[0..23];
- RAKK:=RAKK+4;
- GOTO L2;
- EXIT:
- END;
- {Описание подпрограмм}
- {Запись 1 байта информации из RDU в RDK}
- 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;
- {Распечатка содержимого регистров RKK, SB, RDK, RDU }
- W_REG:
- WRITELN " RKK СЧ.БАЙТ РДК РДУ PAKK ";
- WRITE $H2 RKK1.KOP," ",$H6 RKK1.ADR," ";
- WRITE $H4 RKK2.PRZ," ",$H4 RKK2.DLM," ";
- WRITE $H1 SB," ",$H2 RDK[24..31]," ";
- WRITE $H2 RDK[16..23]," ",$H2 RDK[8..15]," ";
- WRITELN $H2 RDK[0..7]," ",$H2 RDU," ",$H6 RAKK;
- RETURN;
- {Запись в ОП блока информации из канала BR}
- K_OP:
- {RAP-Д/Б РАНЕЕ ОПРЕДЕЛЕНО}
- GOSUB OUT_OP;
- W1:=(NOT (SB-1))*8;
- RCHP[W1..31]:=BR[W1..31];
- GOSUB IN_OP;
- RETURN;
- {Запись в ОП содержимого регистра RCHP}
- IN_OP:
- FOR WI:=0 TO 3;
- WU:=24-WI*8;
- OP[RAP+WI]:=RCHP[WU..(WU+7)];
- NEXT;
- RETURN;
- {Распечатка содержимого ячеек ОП}
- W_OP:
- WRITELN " СОДЕРЖИМОЕ ЯЧЕЕК ОП:";
- FOR WK:=0 TO 1;
- FOR WI:=0 TO 1;
- FOR WJ:=0 TO 3;
- WU:=OP[ADDR+3+WK*8]+WI*4+WJ;
- WRITE $H6 WU," ",$H2 OP[WU]," * ";
- NEXT;
- WRITELN;
- NEXT;NEXT;
- RETURN;
- {Выборка из ОП содержимого 4х ячеек}
- OUT_OP:
- RAP[0..1]:=0;
- FOR WI:=0 TO 3;
- WU:=24-WI*8;
- RCHP[WU..(WU+7)]:=OP[RAP+WI];
- NEXT;
- RETURN;
- {Загружение в регистр RDU очереного значения из PU}
- Z_RDU:
- RDU:=PU[WR]; WR:=WR+1;
- RETURN;
- {Задание исходных данных}
- ZAGR:
- READ "Введите номер варианта",WN;
- ADDR:=200+WN*16;
- WR:=0;
- W7:=WN*7;
- WF:=0;
- OP[ADDR]:=2; OP[ADDR+8]:=2;
- IF WN[0..0]=1 THEN OP[ADDR]:=1;
- IF WN[0..0]=0 THEN OP[ADDR+8]:=WN[1..1];
- OP[ADDR+7]:=7-W7[0..1]; OP[ADDR+15]:=2+W7[0..1];
- IF OP[ADDR+8]=0 THEN OP[ADDR+4]:=160;
- IF OP[ADDR+8]<>0 THEN OP[ADDR+4]:=96;
- OP[ADDR+12]:=32;
- OP[(ADDR+3),2..4]:=W7[0..2]; OP[(ADDR+3),5..6]:=WN[2..3];
- OP[ADDR+11]:=OP[ADDR+3]+24+4*WN[0..1];
- FOR WI:=0 TO 1;
- WJ:=ADDR+8*WI;
- IF OP[WJ]=1 THEN WF:=WF+OP[WJ+7];
- IF OP[WJ]<>1 THEN GOSUB Z_OP;
- NEXT;
- WRITELN "ВАРИАНТ НОМЕР ",$D3 WN;
- WRITELN "АДРЕС ПЕРВОЙ КАН. КОМАНДЫ ",$H6 ADDR;
- WRITELN "КАНАЛЬНАЯ ПРОГРАММА: ";
- FOR WI:=0 TO 1;
- WRITE " ",$H2 OP[ADDR+WI*8]," ",$H2 OP[ADDR+1+WI*8];
- WRITE $H2 OP[ADDR+2+WI*8],$H2 OP[ADDR+3+WI*8]," ";
- WRITE $H2 OP[ADDR+4+WI*8],$H2 OP[ADDR+5+WI*8]," ";
- WRITELN $H2 OP[ADDR+6+WI*8],$H2 OP[ADDR+7+WI*8];
- NEXT;
- GOSUB W_OP;
- IF WF=0 THEN GOTO WM1;
- WRITELN "ЧИСЛА, СЧИТЫВАЕМЫЕ С ВУ:";
- FOR WI:=0 TO (WF-1);
- PU[WI]:=3+WI*WN*17;
- WRITE " ",$H2 PU[WI];
- NEXT;
- WM1:
- WRITELN;
- WRITELN "************************************************";
- RETURN;
- Z_OP:
- FOR WK:=0 TO 7;
- OP[OP[WJ+3]+WK]:=5+WK*WN*13+WJ;
- NEXT;
- RETURN;
Add Comment
Please, Sign In to add comment