Радио-86РК/Радио 10,11-90/PK плюс PC/Таблица 7

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: А. ДОЛГИЙ

Источник: http://retro.h1.ru/RK86/RK_PC/RrkpcTbl7.txt

							Таблица 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.