Радио-86РК/Радио 10,11-90/PK плюс PC/Таблица 7
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: А. ДОЛГИЙ |
Таблица 7. program rk_plus_pc; const HIMEM:lnteger=$75FF; (Верхняя граница области) (пользователя в ОЗУ "Радио-86РК.) EDBUF:integer=$1900; ( Начальный адрес буфера текста) (редактора ED.МИКРОН.) var В,COUT,L,H,N,D1,D2,D3,D4:byte; А0,ADR,ADRBEG,ADREND,ER,I,I1,J,J1,CCTR:Integer; LCTR,LC,SL,SH,CSUM:Integer; LINE,SNAME:string[64]; С,C1,C2:char; INTD,ENDBLK:boolean; T:text; BUF:array[1.. $7600] of byte; procedure HEXBYTE(B:byte); function HEXCHAR(B:byte):char; var B1: byte; begin B1:=B AND $F;IF B1>9 THEN B1:=B1+7; HEXCHAR:=CHR(B1+48); end; begin WRITE(HEXCHAR(B shr 4)); WRITE(HEXCHAR(B)); end; procedure HEXINT(I:integer); begin HEXBYTE(HI(I)); HEXBYTE(LO(I)) end; function YES: boolean; var C: char; begin WRITE(' (Д/Н) ? '); repeat READ(KBD,C) until С in ['Y', 'y', 'N', 'n', 'Д', 'д', 'H', 'н'); WRITELN(C);YES:=(C in ['Y', 'y','Д','д')); end; procedure START; procedure INIT(K:byte); (приводится описание процедуры настройки порта СОM1) (ЕС-1640. Об изменениях в процедуре для компьютеров) (других типов см. в тексте статьи. при выводе через) (параллельный порт процедура INIT и ее вызов исключаются) (из программы. ) const H1:real=2.16; КЗ:real=6.61; S9600:integer=8; CTRL:lnteger=$3FC; CW53:lnteger=$3FB; CTR:integer=$3F8; CW51:lnteger=$3F9; DАТ51:integer=$3F8; TMODE:byte=$36; var S:integer; begin PORT[CTRL]:=$88; PORT[CW33]:=TMODE; S:=ROUND(S9600*(K*N1+N2)); PORT[CTR]:=LO(S); PORT[CTR]:=HI(S); PORT[CTRL]:=$48; PORT[CTRL]:=8; PORT[CW51]:=$OC; PORT[CW51]:=0; PORT[CW51]:=0; PORT[CW51]:=$27; end; begin WIHDOW(1,18,80,25);GOTOXY(13,1); WRITE('Подготовьте магнитофон к записи '); WRITELN('и нажмите любую клавишу. '); repeat until keypressed; INIT($1D); ( Только для последоват. интерфейса. ) WRITE(' Идет запись... '); end; procedure OUTMAG(B:byte); (Процедура OUTMAG должна соответствовать используемому) (интерфейсу (см. табл.1 и 2 в тексте статьи). приводится) (описание процедуры вывода байта через последовательный) (порт СОM1 ЕС-1840. ) const phm: array[0.. 15] of integer; ($55,$99,$65,$А5,$59,$99,$69,$А9, $56,$96,$65,$А6,$5А,$9А,$6А,$АА); procedure SEND(C:byte); const CW51:lnteger=$3F9; DAT5l:lnteger=$3F8; begin repeat until(PORT[CW51] and 1)<>0; PORT[DAT51]:=C; end; begin SEND(PHM[(B shr 4) and $0F]); SEND(PHM[B and $0F]); end; procedure QRX: begin WINDOW(1,18,80,25);CLRSCR:GOTOXV(35,3); WRITELN('Ждитe, читаю ',SNAME); end; procedure LDBUF(C:char: var I,CCTR,CSUM:integer); const LINELEN:integer=62; ( Максимальная длина строки ) ( редактора ED. МИКРОН) var В:byte; begin B:=ORD(C); repeat BUF[I]:=B;CSUM:=CSUM+B;I:=I+1; If B=$0D then CCTR:=0 else CCTR:=CCTR+1; B:=$0D; until CCTR<LINELEN; end; function TRANSTEXT (C:char;D1,D2,D3,D4:byte):char; var J:byte; begin J:=POS(C,'@ABCDEFGHIJKLMHOPQRSTUVWXYZ[\1'); If J<>0 then TRANSTEXT:=CHR(J+D1) else begin J:=POS(C,'•abcdefghljklmnopqrstuvwxyz{|}" '); If J<>0 then TRANSTEXT:=CHR(J+D2) else begin J:=POS(C,'юабпдефгхийклмнопярстужвьызшэшчь'); If J<>0 then TRANSTEXT:=CHR(J+D3) else begin J:=POS(C,'ЮАБЦДЕФГХИИКЛ1ШОПЯРСТУЖВЬЫЭЖЭШЧЪ'); If J<>0 then TRANSTEXT:=CHR(J+D4) else TRANSTEXT:='_' end end end end; procedure TRANSDUMP; begin саse J1 of 1:A0:=M; 2,3:A0:=(A0 shl 4)+H; 4:begin A0:=(A0 shl 4)+H; If I=5 then begin ADR:=А0; ADRBEG:=А0: BUF[1]:=HI(ADRBEG);BUF12):=LO(ADRBEG) end else If ADR<>A0 then begin ENDBLK:=true; ADREND:=ADR-1; I1:=I-1 end; end: 5..255:if not ODD(J1) then begin BUF[I]:=(N shl 4)+M;I:=I+1;ADR:=ADR+1; end else N:=M; end end: procedure TRANSHEX; begin case J1 of 1:L:=M; 2:L:=(L shl 4)+H; 3:A0:=M; 4,5: А0:=(А0 shl 4)+M; 6:begin A0:=(А0 shl 4)+M; if I=5 then begin ADR:=A0;ADRBEG:=A0; BUF[1]:=HI(ADRBEG);BUF[2]:=LO(ADRBEG) end else if ADR<>A0 then begin ENDBLK:=true:ADREND:=ADR-1: I1:=I-1 end; end; 7,8:; 9..255:if not ODD(J1) then begin if L>0 then begin BUF[I]:=(N shl 4>+M;I:=I+1;ADR:=ADR+1:L:=L-1 end end else N:=M; end end: procedure OUTBLOCK; begin CLRSCR;WIHDOW(41,11,80,17);CLRSCR; WRITELN;WRITELN; WRITE(' Начало блока : ') ;HEXINT(ADRBEG); WRITELN; WRITE(' Конец блока : ');HEXINT(ADREND); WRITELN; WRITE (' контр, сумма : '); SL:=0;SH:=0; for I:=5 to I1-1 do begin SL:=SL+BUF[I]; SH:=SH+BUF[I]+HI(SL); SL:=LO(SL) end; SL:=LO(SL+BUF[I1]):BUF[I1+1]:=0;BUF[I1+2]:=0; BUF[I1+3]:=$E0:BUF[I1+4]:=LO(SH);BUF[I1+5]:=LO(SL) HEXBYTE(LO(SH)):HEXBYTE(LO(SL));WRITELN; START: (Если используется параллельный интерфейс и необходимо) (во время записи на магнитофон запретить прерывания,) (здесь вставить оператор INLINE(*FA): ) for I:=1 to 256 do OUTMAG(0); OUTMAG($E6); for I:=1 to I1+5 do OUTMAG(BUF[I]); ( Если прерывания были запрещены, здесь разрешить их ) ( вновь, вставив оператор INLINE($FB); ) WRITE(' готово, повторить ') end; function NEXTBLOCK:boolean; begin If EOF(T) or (ER>0) then NEXTBLOCK:=false else begin CLKSCR;GOTOXY(6,3); WRITE('В Файле ',SNAME.' имеются еше данные.', ' продолжить вывод ');NEXTBLOCK:=YES end end; begin CLRSCR;WINDOW(5,1,80,10); WRITELN(' r-ASD-90--------------------------------------------------|'); WRITELN(' I'); WRITELN('| Запись данных на магнитофон', ' в Формате РАДИО-86РК |'); WRITELN('|'); WRITELN('------------------•------', '----------------------'); WRITELN; WRITE('Имя Файла, содержашего данные : '); READLN(SNAME);ASSIGN(T,SNAME);RESET(Т);INTD:=false; WINDOW(1,11,80,25); WRITELN(' Тип данных :'); WRITELN; WRITELN(' Текст. ................. 1'); WRITELN(' Таблица кодов (dump).... 2'); WRITELN(' НЕХ-ФаИЛ. .............. 3'); WINDOW(1,18,80,25);CLRSCR; WRITELN(' Введите цифру, соответствующую'); WRITE(' типу данных в Файле ',SNAME); repeat READ(KBD,C) until С in ['1','2','3']; CLRSCR;WIHDOW(34,0RD(C)-36,35,23);WRITE '+'); саsе С of '1':begin ER:=0;WINDOW(41,11,80,17);CLRSCR; WRITELN(' Преобразование текста :'); WRITELN; WRITELN(' ABCdef АБВгде в ABCDEF АБВГДЕ. . . . 1'); WRITELN(' ABCdef АБВгде в АВСДЕФ АБВГДЕ. . . . 2'); WRITELN(' ABCdef АБВгде в ABCdef abwGDE. . . . 3'); WRITELN(' ABCdef АБВгде в абцДЕФ АБВгде. . . . 4'); WINDOW(1,18,80,25); WRITE('Введите цифру, соответствуютщую '); WRITE(' нужному преобразованию. '); repeat READ(KBD,C1) until C1 in ['1'..'4'); CLRSCR;WINDOW(79,ORD(C1)-36,80,23);WRITE ('+'); case C1 of '1':begin D1:=$3F;D2:=$3F;D3:=$5F;D4:=$5F end; '2':begin D1:=$3F;D2:=$5F;D3:=$5F;D4:=$5F end; '3':begin D1:=$3F;D2:=$5F:D3:=$3F;D4:=$5F end; '4':begin D1:=$5F;D2:=$3F;D3:=$5F;D4:=$3F end; end; repeat QRX;I:=3;CCTR:=0;CSUM:=0; while not(EOF(T)or(I>HIMEM-EDBUF-*FF)) do begin READ(T,C);B:=ORD(C); case В of $00..$08, $0B,$0C,$0E..$1F: LDBUF('.',I,CCTR,CSUM); $09: repeat LDBUF(' ',I,CCTR,CSUM) until (CCTR mod 8)=0; $0A:; $0D,$20..$3F: LDBUF(C,I,CCTR,CSUM); else LDBUF(TRANSTEXT(C,D1,D2,D3,D4),I,CCTR,CSUM); end; end: LDBUF(#$0D,I,CCTR,CSUM); BUF[I]:=$FF; BUF[I+1]:=LO(CSUM);BUF[I+2]:=HI(CSUM); I1:=I+2;I:=2-I;BUF[1]:=LO(I); BUF[2]:=HI(I); repeat CLRSCR;START; (Ecли используется параллельный интерфейс и необхо-) (димо во время записи на магнитофон запретить прерывания,) (здесь вставить оператор INLINE(*FA); ) for I:=1 to 64 do OUTMAG($55); for I:=1 to 64 do OUTMAG(0); for I:=1 to 64 do OUTHAG($55); for I:=1 to 64 do OUTMAG(0); for I:=1 to 5 do OUTMAG($E6); for I:=1 to LENGTH(SNAME) do OUTMAG(ORD(SNAME[I]) and $7F); for I:=1 to 512 do OUTMAG(0); OUTMAG($E6); for I:=1 to I1 do OUTMAG(BUF[I]); (Если прерывания были запрещены, здесь разрешить их ) (вновь, вставив оператор INLINE(*FB); ) WRITE(' готово. Повторить '); until not YES; until not NEXTBLOCK: end; '2','3':begin LCTR:=0; repeat ER:=0;ENDBLK:=false;I:=5;QRX; while not(EOF(T) or (I>HIMEM+4) or ENDBLK) do begin READLN(T,LINE); LCTR:=LCTR+1; J1:=1; for J:=1 to LENGTH(LINE) do begin C2:=LINE[J]: саse C2 of ' ':; ':':if C='2' then ER:=ER+1; '0'..'9','A'..'F':begin M:=ORD(C2)-$30;if M>9 then M:=M-7; If C='2' then TRANSDUMP else TRANSHEX; J1:=J1+1 end else ER:=ER+1; end end end; if ER=0 then begin If not ENDBLK then begin ADREND:=ADR-1;I1:=I-1 end; BUF[3]:=HI(ADREND);BUF[4]:=LO(ADREND); repeat OUTBLOCK until not YES; end else begin WINDOW(1,20,80,25);CLRSCR;GOTOXY(20, 3); WRITE(' исправьте ошибк'); if ER=1 then WRITE('у') else WRITE('и'); WRITE(' в Файле ',SNAME); end; if ENDBLK and (POS(':00',LINE)=0) then begin RESET (T);LC:=LCTR; while LC>1 do begin READLN(T);LC:=LC-1 end; end: until not NEXTBLOCK; end; end; end.