Program DisketteWriter;
{$M 65520, 0, 655360}
{$G+,D-,E-,N+}
Uses DOS, ProgFace;
type
THCS = record
H, C, S, nSec : Byte;
end;
TWinColor = record
_WinAttr, _WBorderAttr, _WinHAttr, _MnAttrK, _MnAttrM,
_ButtAttr, _ButtLight, _ButtShadow : Byte;
end;
var
MainWinColor, ErrorWinColor, CompileWinColor, WorkWinColor, EnterWinColor : TWinColor;
HCS : THCS;
longHCS: Longint Absolute HCS;
FSize : Longint;
nH, nC, nS : Byte;
bH, bC, bS : Byte;
{ FileName: String;}
CylSec : Word;
i, j, k : Word;
curDScript: String;
cfgName : String;
curFile, cfgFile, tmpFile : File;
logFile, DScriptFile: Text;
tmpSt, tmpStx : String;
ttxx : array[0..255] of Char Absolute tmpSt;
tx0Attr, txAttr, tx1Attr, txCompile, ErAttr : Byte;
cDate : record
Year, Month, Day, DayofWeek : Word;
end;
cTime : record
Hour, Minute, Second, Sec100 : Word;
end;
Buffer : array[0..512*48-1] of Byte;
BuffSz : Word;
compileBuff : array[0..512*18-1] of Byte Absolute Buffer;
NCommCount, zStrCount, nCompCount, erStrCount, nCount, Mode : Word;
_Mode : String[3];
_rw : String[1];
_H, _C, _S, _File : String;
TTT : Byte Absolute WinAttr;
const
addpossible : Boolean = False;
SBig : Boolean = False;
CBig : Boolean = False;
logon : Boolean = True;
HeadString: String = '[ Diskette Writer by Felix! ]';
HeadStringConfig: String = '[ Diskette Writer by Felix! ]: * Configure * ';
StatString: String = '*** /Status/ ***';
tmpName = 'diwr.tmp';
logName = 'diwr.log';
cfgExt = '.CFG';
NSecrw : Word = 1;
{===============}
Procedure ScrollByOneLineUp(y, Cnt : Word); Assembler;
{ScrollByOneLineUp(2*12*80, 8*80)}
asm
push ds
push es
mov ax, 0B800h
mov ds, ax
mov es, ax
cld
mov di, y
mov si, di
add si, 2*80
mov cx, Cnt
rep movsw
pop es
pop ds
end;
{------------------}
Procedure ToggleIntense_Blink(b : Byte);Assembler;{0 - Intense/ 1 - Blink}
asm
mov bl, byte ptr b
mov ax, 1003h
int 10h
end;
{------------------}
Procedure SetWidth8;Assembler;
asm
mov dx, 03C4h
mov al, 01h
out dx, al
inc dx
in al, dx
and al, 11111011b
or al, 00000001b
out dx, al
end;
Procedure SetWidth9;Assembler;
asm
mov dx, 03C4h
mov al, 01h
out dx, al
inc dx
in al, dx
and al, 0FEh
out dx, al
end;
Procedure SetCurColor(GQ : TWinColor);
begin
with GQ do
begin
WinAttr := _WinAttr;
WBorderAttr := _WBorderAttr;
WinHAttr := _WinHAttr;
MnAttrK := _MnAttrK;
MnAttrM := _MnAttrM;
ButtAttr := _ButtAttr;
ButtLight := _ButtLight;
ButtShadow := _ButtShadow;
end;
end;
Procedure ChangeColor(var GQ : TWinColor);
begin
with GQ do
begin
_WinAttr := WinAttr;
_WBorderAttr := WBorderAttr;
_WinHAttr := WinHAttr;
_MnAttrK := MnAttrK;
_MnAttrM := MnAttrM;
_ButtAttr := ButtAttr;
_ButtLight := ButtLight;
_ButtShadow := ButtShadow;
end;
end;
{------------------}
Function InitMouse : Boolean; Assembler;
asm
mov ax, 0
int 33h
end;
Procedure ShowMouse; Assembler;
asm
mov ax, 1
int 33h
end;
Procedure HideMouse; Assembler;
asm
mov ax, 2
int 33h
end;
Function MouseButt : Word; Assembler;
asm
mov ax, 3
int 33h
mov ax, bx
end;
Function MouseX : Word; Assembler;
asm
mov ax, 3
int 33h
mov ax, cx
shr ax, 3
inc ax
end;
Function MouseY : Word; Assembler;
asm
mov ax, 3
int 33h
mov ax, dx
shr ax, 3
inc ax
end;
{---------------------}
Function MouseIn(x1, y1, x2, y2 : Word) : Boolean;
begin
MouseIn := (MouseX>=x1) and (MouseX<=x2) and (MouseY>=y1) and (MouseY<=y2);
end;
{=================}
Procedure WaitRetrace;Assembler;
asm
mov dx, 03DAh
@VRTL1:
in al, dx
test al, 8
jnz @VRTL1
@VRTL2:
in al, dx
test al, 8
jne @VRTL2
end;
{=================}
Function SetAbsSector(Disk,Head: Byte; CSec: Word; var Buf) : Boolean;
var
R : Registers; {Записывает абсолютный дисковый сектор с помощью прерывания $13}
begin
with R do
begin
ah := 3; {Операция записи}
dl := Disk; {Номер привода}
dh := Head; {Номер головки}
cx := CSec; {Цилиндр/сектор}
al := NSecrw; {Читаем один NSECREAD секторов}
es := seg(Buf);
bx := ofs(Buf);
Intr($13,R);
SetAbsSector:=(Flags and FCarry) = 0
end
end; {SetAbsSector}
{---------------------}
Function DiskStatus : Byte;Assembler;
asm
mov ah, 1
mov dl, 0
int $13
end;
{---------------------}
Function ReadAbsSector(Disk,Head:Byte;CylSec:Word;var Buf):Boolean;
var
R:Registers;
begin
with R do
begin
ah:=2;
al:=NSecrw;
dl:=Disk;
dh:=Head;
cx:=CylSec;
es:=seg(Buf);
bx:=ofs(Buf);
Intr($13,R);
ReadAbsSector:=(Flags and FCarry) = 0
end
end;{ReadAbsSector}
{---------------}
Function PackCylSec(Cyl,Sec:Word):Word;
begin
PacKCylSec:=Sec+(Cyl and $300) shr 2+(Cyl shl 8)
end;
Function UpString(S:String):String;
var
i : Integer;
S1 : String;
begin
S1 := S;
for i := 1 to Length(S1) do
S1[i] := UpCase(S1[i]);
UpString := S1;
end;
Procedure logWrTimeDate;
begin
if not logon then Exit;
with cDate do GetDate(Year, Month, Day, DayofWeek);
with cTime do GetTime(Hour, Minute, Second, Sec100);
with cDate do
begin
Str(Day, tmpSt);
Write(logFile, tmpSt+' ');
case Month of
1: tmpSt := 'Января';
2: tmpSt := 'Февраля';
3: tmpSt := 'Марта';
4: tmpSt := 'Апреля';
5: tmpSt := 'Мая';
6: tmpSt := 'Июня';
7: tmpSt := 'Июля';
8: tmpSt := 'Августа';
9: tmpSt := 'Сентября';
10: tmpSt := 'Октября';
11: tmpSt := 'Ноября';
12: tmpSt := 'Декабря'
end;
Write(logFile, tmpSt+' ');
Str(Year, tmpSt);
Write(logFile, tmpSt+' года, ');
case DayofWeek of
0: tmpSt := 'Вс';
1: tmpSt := 'Пн';
2: tmpSt := 'Вт';
3: tmpSt := 'Ср';
4: tmpSt := 'Чт';
5: tmpSt := 'Пт';
6: tmpSt := 'Сб';
end;
Write(logFile, tmpSt+', ');
end;
with cTime do
begin
Str(Hour, tmpSt);
Write(logFile, tmpSt+'ч. ');
Str(Minute, tmpSt);
Write(logFile, tmpSt+'мин. ');
Str(Second, tmpSt);
Write(logFile, tmpSt+'.');
Str(Sec100, tmpSt);
Write(logFile, tmpSt+' сек.');
end;
end;
{---------------}
Procedure logTimeWr;
begin
if not logon then Exit;
with cTime do GetTime(Hour, Minute, Second, Sec100);
with cTime do
begin
Str(Hour, tmpSt);
Write(logFile, tmpSt+':');
Str(Minute, tmpSt);
Write(logFile, tmpSt+':');
Str(Second, tmpSt);
Write(logFile, tmpSt+'.');
Str(Sec100, tmpSt);
Write(logFile, tmpSt+'# ');
end;
end;
{---------------}
Procedure Error(St : String);
var
tSt : String;
begin
if logon then
begin
{$I-}
Append(logFile);
{$I+}
if IOResult = 0 then
begin
Write(logFile, '=> diwr: [* Ошибка! *] ');
logTimeWr;
WriteLn(logFile, 'Диагноз: ', St);
Close(logFile);
end;
end;
SetCurColor(ErrorWinColor);
SaveBar(27, 8, 53, 16);
SetWindow(27, 8, 53, 16, 2, ' -= Ошибка !!! =- ', True);
Repeat
NewLine;
tSt := Copy(St, 1, Pos('|', St)-1);
Delete(St, 1, Pos('|', St));
WriteLine(tSt, ErAttr);
Until tSt = '';
WriteLine(St, ErAttr);
While not KeyPressed do;
While KeyPressed Do ReadKey;
UndoMenu;
end;
{---------------}
Procedure WriteCFG;
var
tmpb : Byte;
begin
Assign(cfgFile, cfgName);
{$I-}
ReWrite(cfgFile, 1);
{$I+}
if IOResult<>0 then
begin
Error(' | | Ошибка записи | в файл конфигурации!');
if logon then Close(logFile);
Halt($FFF0);
end;
Seek(cfgFile, 0);
tmpSt := 'cfgDIWR'#20;
BlockWrite(cfgFile, ttxx[1], 8);
i := Length(CurDScript);
BlockWrite(cfgFile, i, 2);
BlockWrite(cfgFile, CurDScript, Length(CurDScript)+1);
{Читаем в порядке:
WinAttr, WBorderAttr, WinHAttr, MnAttrK, MnAttrM,
ButtAttr, ButtLight, ButtShadow
}
BlockWrite(cfgFile, MainWinColor, 8);
BlockWrite(cfgFile, ErrorWinColor, 8);
BlockWrite(cfgFile, CompileWinColor, 8);
BlockWrite(cfgFile, WorkWinColor, 8);
BlockWrite(cfgFile, EnterWinColor, 8);
BlockWrite(cfgFile, txCompile, 1);
BlockWrite(cfgFile, tx0Attr, 1);
BlockWrite(cfgFile, tx1Attr, 1);
BlockWrite(cfgFile, txAttr, 1);
BlockWrite(cfgFile, logon, 1);
Close(cfgFile);
end;
Procedure MkStandartCFG;
begin
logon := True;
CurDScript := 'st.ds';
SetAttr(White, Blue, WinAttr);
SetAttr(White, Blue, WBorderAttr);
SetAttr(Yellow, Blue, WinHAttr);
SetAttr(White, Blue, MnAttrK);
SetAttr(Yellow, Blue, MnAttrM);
SetAttr(White, Green, ButtAttr);
SetAttr(Yellow, LightGreen, ButtLight);
SetAttr(LightBlue, Magenta, ButtShadow);
ChangeColor(MainWinColor);
SetAttr(Yellow, Blue, txAttr);
SetAttr(LightGreen, Blue, txCompile);
SetAttr(Cyan, Blue, tx0Attr);
SetAttr(LightCyan, Blue, tx1Attr);
SetAttr(LightRed, LightRed, ErAttr);
WinAttr := ErAttr;
WinHAttr := ErAttr;
WBorderAttr := ErAttr;
ChangeColor(ErrorWinColor);
SetAttr(Green, Blue, WinAttr);
SetAttr(LightMagenta, Blue, WinHAttr);
SetAttr(LightBlue, Blue, WBorderAttr);
ChangeColor(CompileWinColor);
SetAttr(Green, Blue, WinAttr);
SetAttr(LightMagenta, Blue, WinHAttr);
SetAttr(LightBlue, Blue, WBorderAttr);
ChangeColor(WorkWinColor);
SetAttr(Red, Green, WinAttr);
SetAttr(LightRed, Blue, WinHAttr);
SetAttr(Red, Blue, WBorderAttr);
ChangeColor(EnterWinColor);
WriteCFG;
end;
Procedure ReadCFG;
begin
Assign(cfgFile, cfgName);
{$I-}
ReSet(cfgFile, 1);
{$I+}
if IOResult<>0 then
begin
SetAttr(LightRed, LightRed, ErAttr);
WinAttr := ErAttr;
WinHAttr := ErAttr;
WBorderAttr := ErAttr;
ChangeColor(ErrorWinColor);
CursorOff;
Error(' | Ошибка открытия | файла конфигурации!| | Будет записан| стандартный файл...');
MkStandartCFG;
CursorOn;
Halt;
end;
BlockRead(cfgFile, ttxx[1], 8);
tmpSt[0] := #8;
if tmpSt <> 'cfgDIWR'#20 then
begin
Error(' | | Неверный файл | конфигурации!| |'+'('+cfgName+')');
While KeyPressed Do ReadKey;
Exit;
end;
BlockRead(cfgFile, i, 2);
BlockRead(cfgFile, CurDScript, i+1);
{Читаем в порядке:
WinAttr, WBorderAttr, WinHAttr, MnAttrK, MnAttrM,
ButtAttr, ButtLight, ButtShadow
}
BlockRead(cfgFile, MainWinColor, 8);
BlockRead(cfgFile, ErrorWinColor, 8);
BlockRead(cfgFile, CompileWinColor, 8);
BlockRead(cfgFile, WorkWinColor, 8);
BlockRead(cfgFile, EnterWinColor, 8);
BlockRead(cfgFile, txCompile, 1);
BlockRead(cfgFile, tx0Attr, 1);
BlockRead(cfgFile, tx1Attr, 1);
BlockRead(cfgFile, txAttr, 1);
BlockRead(cfgFile, logon, 1);
Close(cfgFile);
ErAttr := ErrorWinColor._WinAttr;
end;
Procedure logWr(S : String);
begin
if not logon then Exit;
{$I-}
Append(logFile);
{$I+}
if IOResult = 0 then
begin
logTimeWr;
WriteLn(logFile, S);
Close(logFile);
end;
end;
Procedure lgWr(S : String);
begin
WaitRetrace;
ScrollByOneLineUp(2*7*80, 16*80);
PutCursor(2, 24);
WriteLine(S+' ', txAttr);
if not logon then Exit;
logTimeWr;
WriteLn(logFile, S);
end;
Function Compile: Boolean;
var
Count, Countn : Byte;
_code : Integer;
n : Word;
firstn, lastn : Word;
begin
txAttr := txCompile;
Count := 0;
Countn := 0;
While Pos(',', _H) <> 0 do
begin
tmpSt := Copy(_H, 1, Pos(',', _H)-1);
Delete(_H, 1, Pos(',', _H));
if Pos('-', tmpSt) = 0 then
begin
Val(tmpSt, n, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для H...');
Compile := False;
Exit;
end;{if _code...}
inc(Count);
inc(Countn);
compileBuff[Count] := n;
end {if Pos...}
else {есть тире}
begin
tmpStx := Copy(tmpSt, 1, Pos('-', tmpSt)-1);
Delete(tmpSt, 1, Pos('-', tmpSt));
Val(tmpStx, firstn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для H...');
Compile := False;
Exit;
end;
Val(tmpSt, lastn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для H...');
Compile := False;
Exit;
end;
if lastn>=firstn then
begin
for i := firstn to lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end
else
begin
for i := firstn downto lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end;
end;{else...}
end; {While ...}
if Pos('-', _H) = 0 then
begin
Val(_H, n, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для H...');
Compile := False;
Exit;
end;
inc(Count);
inc(Countn);
compileBuff[Count] := n;
end
else {Тире есть}
begin
tmpSt := _H;
tmpStx := Copy(tmpSt, 1, Pos('-', tmpSt)-1);
Delete(tmpSt, 1, Pos('-', tmpSt));
Val(tmpStx, firstn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для H...');
Compile := False;
Exit;
end;
Val(tmpSt, lastn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для H...');
Compile := False;
Exit;
end;
if lastn>=firstn then
begin
for i := firstn to lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end
else
begin
for i := firstn downto lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end;
end;
compileBuff[0] := Countn;
Str(Countn, tmpSt);
lgWr('Всего значений для H: '+tmpSt);
Countn := 0;{C}
inc(Count);
While Pos(',', _C) <> 0 do
begin
tmpSt := Copy(_C, 1, Pos(',', _C)-1);
Delete(_C, 1, Pos(',', _C));
if Pos('-', tmpSt) = 0 then
begin
Val(tmpSt, n, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для C...');
Compile := False;
Exit;
end;
inc(Count);
inc(Countn);
compileBuff[Count] := n;
end
else {есть тире}
begin
tmpStx := Copy(tmpSt, 1, Pos('-', tmpSt)-1);
Delete(tmpSt, 1, Pos('-', tmpSt));
Val(tmpStx, firstn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для C...');
Compile := False;
Exit;
end;
Val(tmpSt, lastn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для C...');
Compile := False;
Exit;
end;
if lastn>=firstn then
begin
for i := firstn to lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end
else
begin
for i := firstn downto lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end;
end;
end;
if Pos('-', _C) = 0 then
begin
Val(_C, n, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для C...');
Compile := False;
Exit;
end;
inc(Count);
inc(Countn);
compileBuff[Count] := n;
end
else {Тире есть}
begin
tmpSt := _C;
tmpStx := Copy(tmpSt, 1, Pos('-', tmpSt)-1);
Delete(tmpSt, 1, Pos('-', tmpSt));
Val(tmpStx, firstn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для C...');
Compile := False;
Exit;
end;
Val(tmpSt, lastn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для C...');
Compile := False;
Exit;
end;
if lastn>=firstn then
begin
for i := firstn to lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end
else
begin
for i := firstn downto lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end;
end;
compileBuff[Count-Countn] := Countn;
Str(Countn, tmpSt);
lgWr('Всего значений для C: '+tmpSt);
Countn := 0;{S}
inc(Count);
While Pos(',', _S) <> 0 do
begin
tmpSt := Copy(_S, 1, Pos(',', _S)-1);
Delete(_S, 1, Pos(',', _S));
if Pos('-', tmpSt) = 0 then
begin
Val(tmpSt, n, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для S...');
Compile := False;
Exit;
end;
inc(Count);
inc(Countn);
compileBuff[Count] := n;
end
else {есть тире}
begin
tmpStx := Copy(tmpSt, 1, Pos('-', tmpSt)-1);
Delete(tmpSt, 1, Pos('-', tmpSt));
Val(tmpStx, firstn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для S...');
Compile := False;
Exit;
end;
Val(tmpSt, lastn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для S...');
Compile := False;
Exit;
end;
if lastn>=firstn then
begin
for i := firstn to lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end
else
begin
for i := firstn downto lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end;
end;
end;
if Pos('-', _S) = 0 then
begin
Val(_S, n, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для S...');
Compile := False;
Exit;
end;
inc(Count);
inc(Countn);
compileBuff[Count] := n;
end
else {Тире есть}
begin
tmpSt := _S;
tmpStx := Copy(tmpSt, 1, Pos('-', tmpSt)-1);
Delete(tmpSt, 1, Pos('-', tmpSt));
Val(tmpStx, firstn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для S...');
Compile := False;
Exit;
end;
Val(tmpSt, lastn, _code);
if _code <> 0 then
begin
lgWr('==> Ошибка при компиляции значений для S...');
Compile := False;
Exit;
end;
if lastn>=firstn then
begin
for i := firstn to lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end
else
begin
for i := firstn downto lastn do
begin
inc(Count);
inc(Countn);
CompileBuff[Count] := i;
end;
end;
end;
compileBuff[Count-Countn] := Countn;
Str(Countn, tmpSt);
lgWr('Всего значений для S: '+tmpSt);
Compile := True;
end;
Function CheckH : Boolean;
var
i : Byte;
t : Boolean;
begin
t := True;
for i := 1 to compileBuff[0] do
begin
{ Str(compileBuff[i], tmpSt);
Str(i, tmpStx);
lgWr('H['+tmpStx+'] = '+tmpSt);}
t := t and (compileBuff[i] in [0, 1]);
end;
CheckH := t;
end;
Procedure CheckC;
var
i : Byte;
begin
CBig := False;
nC := compileBuff[0] + 1;{//3}
for i := nC + 1 to nC + compileBuff[nC] do
begin
{ Str(compileBuff[i], tmpSt);
Str(i, tmpStx);
lgWr('C['+tmpStx+'] = '+tmpSt);}
if compileBuff[i] > 79 then CBig := True;
end;
end;
Function CheckS : Boolean;
var
i : Byte;
t : Boolean;
begin
SBig := False;
t := True;
nS := compileBuff[0] + 1;{//3}
nS := compileBuff[0] + compileBuff[nS] + 2;
for i := nS + 1 to nS + compileBuff[nS] do
begin
{ Str(compileBuff[i], tmpSt);
Str(i, tmpStx);
lgWr('S['+tmpStx+'] = '+tmpSt);}
t := t and (compileBuff[i] <> 0);
if compileBuff[i] > 18 then SBig := True;
end;
CheckS := t;
end;
Procedure CheckCplDScript;
var
St, tmpS : String;
begin
SaveBar(1, 7, 80, 25);
WaitRetrace;
SetCurColor(CompileWinColor);
SetWindow(1, 7, 80, 25, 2, '', False);
_File := '';
_H := '';
_C := '';
_S := '';
_Mode := ' ';
NCommCount := 0;
zStrCount := 0;
erStrCount := 0;
nCompCount := 0;
nCount := 0;
Mode := 0;
logWr('Проверка и компилирование Data Script-файла '+curDScript+'...');
Assign(DScriptFile, curDScript);
{$I-}
Reset(DScriptFile);
{$I+}
if IOResult<>0 then
begin
Error(' | Ошибка открытия файла| '+curDScript+', | с описаниями действий| работы программы!');
Halt;
end;
logWr('Файл успешно открыт.');
{$I-}
Rewrite(tmpFile, 1);
{$I+}
if IOResult <> 0 then
begin
Close(DScriptFile);
Error(' | | Ошибка открытия| временного файла!');
Exit;
end;
if logon then
begin
{$I-}
Append(logFile);
{$I+}
end;
tmpSt := 'tmpDIWR'#20;
BlockWrite(tmpFile, tmpSt[1], 8);
lgWr('Записан заголовок временного файла. Компиляция...');
While not EOF(DScriptFile) do
begin
ReadLn(DScriptFile, St);
inc(nCount);
if (St[1]+St[2] = '//') or (St[1]+St[2] = '\\') then
begin
inc(NCommCount);
Continue;
end;
{Компиляция}
if Length(St) = 0 then
begin
inc(zStrCount);
Str(zStrCount, St);
lgWr('Внимание! Пустая строка '+St+'!');
Continue;
end;
Str(nCount, tmpS);
St := UpString(St);
lgWr('*** На входе: '+St+'; *** строка '+tmpS);
_rw := St[1];
if (_rw <> 'W') and (_rw<>'R') and (_rw<>'+') then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует "r", "w" или "+" в начале строки).');
Continue;
end;
case _rw[1] of
'W':
begin
lgWr('Выбран режим: '+_rw+' (запись на дискету).');
{ addpossible := True;}
end;
'R':
begin
lgWr('Выбран режим: '+_rw+' (чтение дискеты, запись в файл).');
{ addpossible := True;}
end;
'+':
begin
lgWr('Режим добавления: '+_rw);
if not addpossible then
begin
lgWr('Режим добавления в данном месте невозможен!');
Continue;
end;
end;
end;
if _rw = '+' then Delete(St, 1, 1)
else Delete(St, 1, 2);{Удаляем первые два символа}
if _rw <> '+' then
begin
if Pos(']', St)=0 then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует "]", обозначающая конец имени файла).');
Continue;
end;
_File := Copy(St, 1, Pos(']', St)-1);{Копируем имя файла}
Delete(St, 1, Pos(']', St));{Удаляем имя файла}
end; {if _rw <> '+' ...}
if (_File='') or (_File='?') then
lgWr('Имя файла будет запрашиваться: "['+_File+']"')
else
lgWr('Определено имя файла: '+_File);
if _File='' then _File := '?';
if (Pos('H', St) = 0) or (Pos('C', St) = 0) or (Pos('S', St) = 0) then
begin
lgWr(St);
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Отсутствуют идентификаторы головки, цилиндра или сектора ("H", "C", "S")).');
Continue;
end;
_Mode[1] := St[1];
if not (_Mode[1] in ['H', 'C', 'S']) then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Неверный идентификатор: "'+_Mode[1]+'")');
Continue;
end;
if St[2]<>'{' then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует открывающая скобка ("{"): "'+St[2]+'")');
Continue;
end;
if Pos('}', St) = 0 then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует закрывающая скобка ("}"):)');
lgWr('"'+St+'"');
Continue;
end;
case _Mode[1] of
'H':
begin
_H := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[1]+': '+_H);
end;
'C':
begin
_C := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[1]+': '+_C);
end;
'S':
begin
_S := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[1]+': '+_S);
end;
end;
Delete(St, 1, Pos('}', St));
_Mode[2] := St[1];
if not (_Mode[2] in ['H', 'C', 'S']) then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Неверный идентификатор: "'+_Mode[2]+'")');
Continue;
end;
if St[2]<>'{' then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует открывающая скобка ("{"): "'+St[2]+'")');
Continue;
end;
if Pos('}', St) = 0 then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует закрывающая скобка ("}"):)');
lgWr('"'+St+'"');
Continue;
end;
case _Mode[2] of
'H':
begin
_H := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[2]+': '+_H);
end;
'C':
begin
_C := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[2]+': '+_C);
end;
'S':
begin
_S := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[2]+': '+_S);
end;
end;
Delete(St, 1, Pos('}', St));
_Mode[3] := St[1];
if not (_Mode[3] in ['H', 'C', 'S']) then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Неверный идентификатор: "'+_Mode[3]+'")');
Continue;
end;
if St[2]<>'{' then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует открывающая скобка ("{"): "'+St[2]+'")');
Continue;
end;
if Pos('}', St) = 0 then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+'! (Отсутствует закрывающая скобка ("}"):)');
lgWr('"'+St+'"');
Continue;
end;
case _Mode[3] of
'H':
begin
_H := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[3]+': '+_H);
end;
'C':
begin
_C := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[3]+': '+_C);
end;
'S':
begin
_S := Copy(St, 3, Pos('}', St)-3);
lgWr('Пределы изменения '+_Mode[3]+': '+_S);
end;
end;
Delete(St, 1, Pos('}', St));
if St <> '' then
lgWr('// *** Остаток (комментарий): '+St);
{Удаляем пробелы}
lgWr('Удаление пробелов...');
While Pos(' ', _H) <> 0 do Delete(_H, Pos(' ', _H), 1);
While Pos(' ', _C) <> 0 do Delete(_C, Pos(' ', _C), 1);
While Pos(' ', _S) <> 0 do Delete(_S, Pos(' ', _S), 1);
lgWr('H: {'+_H+'}');
lgWr('C: {'+_C+'}');
lgWr('S: {'+_S+'}');
if (_H = '') or (_C = '') or (_S = '') then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Неизвестны пределы изменения одного или нескольких идентификаторов!)');
Continue;
end;
if (_File <> '?') and (_rw = 'W') then
begin
Assign(curFile, _File);
{$I-}
Reset(curFile);
{$I+}
if IOResult <> 0 then
begin
lgWr('===--> Не найден файл "'+_File+'"!!!');
lgWr('==> Внимание! Файл с данными для записи не найден! Вам придётся ввести другое имя.');
_File := '?';
end
else
Close(curFile);
end;
{Далее идёт создание по строкам соответствующей процедуры записи/чтения
и запись её во временный файл}
if _Mode = 'HCS' then Mode := 1;
if _Mode = 'CHS' then Mode := 2;
if _Mode = 'HSC' then Mode := 3;
if _Mode = 'SHC' then Mode := 4;
if _Mode = 'CSH' then Mode := 5;
if _Mode = 'SCH' then Mode := 6;
Str(Mode, St);
lgWr('*** Режим работы: '+_Mode+' ('+St+') ***');
case Mode of
1 {HCS}:
begin
if Compile then lgWr('<===> Успешно!')
else
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Ошибка при компиляции пределов изменения параметров!)');
Continue;
end;
if not CheckH then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Одно из значений H не 0 и не 1!)');
Continue;
end;
CheckC;
if not CheckS then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Имеется нулевое значение S!)');
Continue;
end;
if CBig or SBig then
begin
lgWr('>>>==> ВНИМАНИЕ! Заданы нестандартные значения для параметров C или S!');
end;
addpossible := True;
if _rw = '+' then Seek(tmpFile, FilePos(tmpFile) - 4);
nH := compileBuff[0];
bH := 1;
nC := compileBuff[0] + 1;
bC := nC + 1;
nS := compileBuff[0] + compileBuff[nC] + 2;
nC := compileBuff[nC];
bS := nS + 1;
nS := compileBuff[nS];
if _rw <> '+' then
begin
BlockWrite(tmpFile, _rw[1], 1);
i := Length(_File);
BlockWrite(tmpFile, i, 2);
BlockWrite(tmpFile, _File, i+1);
end;
for i := bH to bH + nH - 1 do
for j := bC to bC + nC - 1 do
begin
with HCS do
begin
H := compileBuff[i];
C := compileBuff[j];
k := bS;
S := compileBuff[k];
nSec := 1;
While k < bS + nS - 1 do
begin
inc(k);
if (compileBuff[k] = compileBuff[k-1] + 1) then
inc(nSec)
else
begin
BlockWrite(tmpFile, HCS, 4);
S := compileBuff[k];
nSec := 1;
end;
end;
BlockWrite(tmpFile, HCS, 4);
end;
end;
longHCS := 0;
BlockWrite(tmpFile, HCS, 4);
{ Str(nH, tmpSt);
lgWr('nH = '+tmpSt);
Str(bH, tmpSt);
lgWr('bH = '+tmpSt);
Str(nC, tmpSt);
lgWr('nC = '+tmpSt);
Str(bC, tmpSt);
lgWr('bC = '+tmpSt);
Str(nS, tmpSt);
lgWr('nS = '+tmpSt);
Str(bS, tmpSt);
lgWr('bS = '+tmpSt);}
end;
2 {CHS}:
begin
if Compile then lgWr('<===> Успешно!')
else
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Ошибка при компиляции пределов изменения параметров!)');
Continue;
end;
if not CheckH then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Одно из значений H не 0 и не 1!)');
Continue;
end;
CheckC;
if not CheckS then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Имеется нулевое значение S!)');
Continue;
end;
if CBig or SBig then
begin
lgWr('>>>==> ВНИМАНИЕ! Заданы нестандартные значения для параметров C или S!');
end;
addpossible := True;
if _rw = '+' then Seek(tmpFile, FilePos(tmpFile) - 4);
nH := compileBuff[0];
bH := 1;
nC := compileBuff[0] + 1;
bC := nC + 1;
nS := compileBuff[0] + compileBuff[nC] + 2;
nC := compileBuff[nC];
bS := nS + 1;
nS := compileBuff[nS];
if _rw <> '+' then
begin
BlockWrite(tmpFile, _rw[1], 1);
i := Length(_File);
BlockWrite(tmpFile, i, 2);
BlockWrite(tmpFile, _File, i+1);
end;
for j := bC to bC + nC - 1 do
for i := bH to bH + nH - 1 do
begin
with HCS do
begin
H := compileBuff[i];
C := compileBuff[j];
k := bS;
S := compileBuff[k];
nSec := 1;
While k < bS + nS - 1 do
begin
inc(k);
if (compileBuff[k] = compileBuff[k-1] + 1) then
inc(nSec)
else
begin
BlockWrite(tmpFile, HCS, 4);
S := compileBuff[k];
nSec := 1;
end;
end;
BlockWrite(tmpFile, HCS, 4);
end;
end;
longHCS := 0;
BlockWrite(tmpFile, HCS, 4);
end;
3 {HSC}:
begin
if Compile then lgWr('<===> Успешно!')
else
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Ошибка при компиляции пределов изменения параметров!)');
Continue;
end;
if not CheckH then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Одно из значений H не 0 и не 1!)');
Continue;
end;
CheckC;
if not CheckS then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Имеется нулевое значение S!)');
Continue;
end;
if CBig or SBig then
begin
lgWr('>>>==> ВНИМАНИЕ! Заданы нестандартные значения для параметров C или S!');
end;
addpossible := True;
if _rw = '+' then Seek(tmpFile, FilePos(tmpFile) - 4);
nH := compileBuff[0];
bH := 1;
nC := compileBuff[0] + 1;
bC := nC + 1;
nS := compileBuff[0] + compileBuff[nC] + 2;
nC := compileBuff[nC];
bS := nS + 1;
nS := compileBuff[nS];
if _rw <> '+' then
begin
BlockWrite(tmpFile, _rw[1], 1);
i := Length(_File);
BlockWrite(tmpFile, i, 2);
BlockWrite(tmpFile, _File, i+1);
end;
for i := bH to bH + nH - 1 do
for k := bS to bS + nS - 1 do
for j := bC to bC + nC - 1 do
with HCS do
begin
H := compileBuff[i];
C := compileBuff[j];
S := compileBuff[k];
nSec := 1;
BlockWrite(tmpFile, HCS, 4);
end;
longHCS := 0;
BlockWrite(tmpFile, HCS, 4);
end;
4 {SHC}:
begin
if Compile then lgWr('<===> Успешно!')
else
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Ошибка при компиляции пределов изменения параметров!)');
Continue;
end;
if not CheckH then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Одно из значений H не 0 и не 1!)');
Continue;
end;
CheckC;
if not CheckS then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Имеется нулевое значение S!)');
Continue;
end;
if CBig or SBig then
begin
lgWr('>>>==> ВНИМАНИЕ! Заданы нестандартные значения для параметров C или S!');
end;
addpossible := True;
if _rw = '+' then Seek(tmpFile, FilePos(tmpFile) - 4);
nH := compileBuff[0];
bH := 1;
nC := compileBuff[0] + 1;
bC := nC + 1;
nS := compileBuff[0] + compileBuff[nC] + 2;
nC := compileBuff[nC];
bS := nS + 1;
nS := compileBuff[nS];
if _rw <> '+' then
begin
BlockWrite(tmpFile, _rw[1], 1);
i := Length(_File);
BlockWrite(tmpFile, i, 2);
BlockWrite(tmpFile, _File, i+1);
end;
for k := bS to bS + nS - 1 do
for i := bH to bH + nH - 1 do
for j := bC to bC + nC - 1 do
with HCS do
begin
H := compileBuff[i];
C := compileBuff[j];
S := compileBuff[k];
nSec := 1;
BlockWrite(tmpFile, HCS, 4);
end;
longHCS := 0;
BlockWrite(tmpFile, HCS, 4);
end;
5 {CSH}:
begin
if Compile then lgWr('<===> Успешно!')
else
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Ошибка при компиляции пределов изменения параметров!)');
Continue;
end;
if not CheckH then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Одно из значений H не 0 и не 1!)');
Continue;
end;
CheckC;
if not CheckS then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Имеется нулевое значение S!)');
Continue;
end;
if CBig or SBig then
begin
lgWr('>>>==> ВНИМАНИЕ! Заданы нестандартные значения для параметров C или S!');
end;
addpossible := True;
if _rw = '+' then Seek(tmpFile, FilePos(tmpFile) - 4);
nH := compileBuff[0];
bH := 1;
nC := compileBuff[0] + 1;
bC := nC + 1;
nS := compileBuff[0] + compileBuff[nC] + 2;
nC := compileBuff[nC];
bS := nS + 1;
nS := compileBuff[nS];
if _rw <> '+' then
begin
BlockWrite(tmpFile, _rw[1], 1);
i := Length(_File);
BlockWrite(tmpFile, i, 2);
BlockWrite(tmpFile, _File, i+1);
end;
for j := bC to bC + nC - 1 do
for k := bS to bS + nS - 1 do
for i := bH to bH + nH - 1 do
with HCS do
begin
H := compileBuff[i];
C := compileBuff[j];
S := compileBuff[k];
nSec := 1;
BlockWrite(tmpFile, HCS, 4);
end;
longHCS := 0;
BlockWrite(tmpFile, HCS, 4);
end;
6 {SCH}:
begin
if Compile then lgWr('<===> Успешно!')
else
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Ошибка при компиляции пределов изменения параметров!)');
Continue;
end;
if not CheckH then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Одно из значений H не 0 и не 1!)');
Continue;
end;
CheckC;
if not CheckS then
begin
inc(erStrCount);
Str(erStrCount, St);
lgWr('==> Внимание! Неправильная строка '+St+
'! (Имеется нулевое значение S!)');
Continue;
end;
if CBig or SBig then
begin
lgWr('>>>==> ВНИМАНИЕ! Заданы нестандартные значения для параметров C или S!');
end;
addpossible := True;
if _rw = '+' then Seek(tmpFile, FilePos(tmpFile) - 4);
nH := compileBuff[0];
bH := 1;
nC := compileBuff[0] + 1;
bC := nC + 1;
nS := compileBuff[0] + compileBuff[nC] + 2;
nC := compileBuff[nC];
bS := nS + 1;
nS := compileBuff[nS];
if _rw <> '+' then
begin
BlockWrite(tmpFile, _rw[1], 1);
i := Length(_File);
BlockWrite(tmpFile, i, 2);
BlockWrite(tmpFile, _File, i+1);
end;
for k := bS to bS + nS - 1 do
for j := bC to bC + nC - 1 do
for i := bH to bH + nH - 1 do
with HCS do
begin
H := compileBuff[i];
C := compileBuff[j];
S := compileBuff[k];
nSec := 1;
BlockWrite(tmpFile, HCS, 4);
end;
longHCS := 0;
BlockWrite(tmpFile, HCS, 4);
end;
end;{case...}
{for i := 0 to 30 do
begin
Str(compileBuff[i], tmpSt);
Str(i, tmpStx);
lgWr('Yo!['+tmpStx+'] = '+tmpSt);
end;}
{*** Закончилась}
inc(nCompCount);
Str(nCompCount, St);
lgWr('Скомпилирована строка '+St);
end;
lgWr(' ---------------------------------------------');
Str(nCompCount, St);
lgWr('Всего скомпилировано строк (верных): '+St);
if logon then Close(logFile);
longHCS := 0;
BlockWrite(tmpFile, HCS, 1);
BlockWrite(tmpFile, HCS, 4);
Close(tmpFile);
Str(NCommCount, St);
logWr('Проверка завершена. Комментариев в файле: '+St);
Close(DScriptFile);
ReadKey;
WaitRetrace;
UndoMenu;
end;
{==================}
Procedure DoWork;
begin
CylSec:=PackCylSec(0,1);
ReadAbsSector(0, 0, CylSec, Buffer);
if DiskStatus = $80 then
begin
SaveBar(30, 12, 50, 14);
Repeat
SetCurColor(ErrorWinColor);
SetWindow(30, 12, 50, 13, 1, '[Вставьте дискету!]', False);
if ReadKey = #27 then
begin
UndoMenu;
Exit;
end;
ReadAbsSector(0, 0, CylSec, Buffer);
Until DiskStatus <> $80 ;
UndoMenu;
end;
with HCS do
begin
H := 0; C := 0; S := 1;
CylSec := PackCylSec(C, S);
nSec := 1;
ReadAbsSector(0, H, CylSec, Buffer);
if not SetAbsSector(0, H, CylSec, Buffer) then
begin
SaveBar(30, 12, 50, 14);
SetCurColor(ErrorWinColor);
SetWindow(20, 12, 60, 13, 1, '[Снимите защиту от записи с дискеты!]', False);
ReadKey;
UndoMenu;
Exit;
end;
end;
{$I-}
Reset(tmpFile, 1);
{$I+}
if IOResult <> 0 then
begin
LogWr('==> Внимание! Попытка открыть временный файл завершилась неудачей!');
LogWr('Операция прекращена!');
Exit;
end;
SaveBar(25, 7, 56, 15);
SetCurColor(WorkWinColor);
WaitRetrace;
SetWindow(25, 7, 56, 15, 2, ' <Запись / Чтение> ', True);
BlockRead(tmpFile, ttxx, 8);
While not EOF(tmpFile) do
begin
BlockRead(tmpFile, _rw[1], 1);
_rw[0]:= #1;
if _rw[1] = #0 then Break;
BlockRead(tmpFile, i, 2);
BlockRead(tmpFile, _File, i+1);
if _File = '?' then
begin
Repeat
SaveBar(2, 11, 79, 13);
SetCurColor(EnterWinColor);
SetWindow(2, 11, 79, 13, 1, ' Введите имя файла (пустое поле - отмена): ', False);
ZZCursor;
CursorOn;
ReadLn(_File);
CursorOff;
UndoMenu;
Assign(curFile, _File);
{$I-}
if _rw = 'W' then
Reset(curFile, 1)
else
Rewrite(curFile, 1)
{$I+}
Until (IOResult = 0);
{$I-}
Close(curFile);
{$I+}
end;
Assign(curFile, _File);
if (_rw = 'W') and (_File<>'') then
begin
{$I-}
Reset(curFile, 1);
{$I+}
FSize := FileSize(curFile);
Close(curFile);
end;
if _File = '' then Break;
{$I-}
case _rw[1] of
'W' : Reset(curFile, 1);
'R' : Rewrite(curFile, 1);
end;
{$I+}
BlockRead(tmpFile, HCS, 4);
if EOF(curFile) then Seek(curFile, 0);
While (longHCS <> 0) or not EOF(tmpFile) do
begin
WindowSize(27, 7, 56, 15);
ZZCursor;
NewLine;
NewLine;
WriteLine('Операция: ', tx0Attr);
WriteLine(_rw+' ', tx1Attr);
logWr('Операция: '+_rw);
NewLine;
WriteLine('Головка: ', tx0Attr);
Str(HCS.H, tmpSt);
WriteLine(tmpSt+' ', tx1Attr);
logWr('Головка: '+tmpSt);
NewLine;
WriteLine('Дорожка: ', tx0Attr);
Str(HCS.C, tmpSt);
WriteLine(tmpSt+' ', tx1Attr);
logWr('Дорожка: '+tmpSt);
NewLine;
WriteLine('Сектор: ', tx0Attr);
Str(HCS.S, tmpSt);
WriteLine(tmpSt+' ', tx1Attr);
logWr('Сектор: '+tmpSt);
NewLine;
WriteLine('Число секторов: ', tx0Attr);
Str(HCS.nSec, tmpSt);
WriteLine(tmpSt+' ', tx1Attr);
logWr('Число секторов: '+tmpSt);
NewLine;
with HCS do
case _rw[1] of
'W' :
begin
NSecrw := nSec;
CylSec := PackCylSec(C, S);
if (FSize - FilePos(curFile)) < 512*nSec then
begin
ReadAbsSector(0, H, CylSec, Buffer);
BlockRead(curFile, Buffer, (FSize - FilePos(curFile)));
SetAbsSector(0, H, CylSec, Buffer);
end else
begin
BlockRead(curFile, Buffer, 512*nSec);
SetAbsSector(0, H, CylSec, Buffer);
end;
end;
'R' :
begin
NSecrw := nSec;
CylSec := PackCylSec(C, S);
ReadAbsSector(0, H, CylSec, Buffer);
BlockWrite(curFile, Buffer, nSec*512);
end;
end;
BlockRead(tmpFile, HCS, 4);
if longHCS = 0 then Break;
end;
Close(curFile);
end;
UndoMenu;
Close(tmpFile);
end;
Procedure Example;
begin
PutWindow(3, 2, 40, 20, 2, ' Образец окна ');
PutWindow(5, 4, 30, 15, 1, ' Example Window ');
SetButtSize(9, 2);
SetButton(7, 13, 2, ' Кнопка');
PutCursor(7, 6);
WriteLine('Текст в окне', WinAttr);
PutCursor(8, 7);
WriteLine('Текст в окне', WinAttr);
PutCursor(9, 8);
WriteLine('Текст в окне', WinAttr);
PutCursor(7, 10);
WriteLine('Key', MnAttrK);
WriteLine(' MenuItem', MnAttrM);
end;
Procedure MakePalWin(Col : Byte; Bl : Boolean);
var
i, j, Color : Byte;
Tx, Back : Byte;
begin
HideMouse;
Color := Col;
SetCurColor(MainWinColor);
WaitRetrace;
SetWindow(24, 7, 58, 19, 2, ' { Палитра } ', Bl);
WaitRetrace;
PutWindow(27, 8, 40, 17 , 1, ' Текст');
WaitRetrace;
PutWindow(42, 8, 55, 17 , 1, ' Фон');
WaitRetrace;
for j := 1 to 4 do
for i := 1 to 4 do
begin
SetAttr($4*(j-1)+i-1, 0, Color);
WriteCharXY(25+i*3, 7+j*2, Color, #219);
WriteCharXY(26+i*3, 7+j*2, Color, #219);
WriteCharXY(27+i*3, 7+j*2, Color, #219);
WriteCharXY(25+i*3, 8+j*2, Color, #219);
WriteCharXY(26+i*3, 8+j*2, Color, #219);
WriteCharXY(27+i*3, 8+j*2, Color, #219);
end;
for j := 1 to 4 do
for i := 1 to 4 do
begin
SetAttr($4*(j-1)+i-1, 0, Color);
WriteCharXY(40+i*3, 7+j*2, Color, #219);
WriteCharXY(41+i*3, 7+j*2, Color, #219);
WriteCharXY(42+i*3, 7+j*2, Color, #219);
WriteCharXY(40+i*3, 8+j*2, Color, #219);
WriteCharXY(41+i*3, 8+j*2, Color, #219);
WriteCharXY(42+i*3, 8+j*2, Color, #219);
end;
WindowSize(1, 1, 80, 25);
PutCursor(26, 18);
WriteLine('Пример текста / An Example Text', Col);
UnPackAttribute(Col, Tx, Back);
i := Tx and $3 + 1;
j := (Tx and $C) shr 2 + 1;
WriteCharXY(25+i*3, 7+j*2, 255-Col, #17);
WriteCharXY(26+i*3, 7+j*2, 255-Col, #16);
i := Back and $3 + 1;
j := (Back and $C) shr 2 + (Tx and $80) shr 6 + 1;
WriteCharXY(40+i*3, 7+j*2, 255-Col, #17);
WriteCharXY(41+i*3, 7+j*2, 255-Col, #16);
ShowMouse;
end;
Procedure Palette(var Col : Byte);
var
i, j, Color : Byte;
Tx, Back : Byte;
C : Char;
TB : Boolean;
begin
TB := False;
SaveBar(24, 7, 58, 19);
ShowMouse;
MakePalWin(Col, True);
UnPackAttribute(Col, Tx, Back);
Color := Col;
Repeat
if KeyPressed then
begin
C := ReadKey;
if C = #9 then TB := not TB;
if C = #0 then
begin
UnPackAttribute(Color, Tx, Back);
if not TB then
begin
i := Tx and $3 + 1;
j := (Tx and $C) shr 2 + 1;
end else
begin
i := Back and $3 + 1;
j := (Back and $C) shr 2 + (Tx and $80) shr 6 + 1;
end;
C := ReadKey;
case C of
#72{UP}: dec(j);
#80{DOWN}: inc(j);
#75{LEFT}: dec(i);
#77{Right}: inc(i);
end;{case C...}
if i < 1 then i := 4;
if i > 4 then i := 1;
if j < 1 then j := 4;
if j > 4 then j := 1;
if not TB then
begin
if j = 1 then
case i of
1: Tx := 0;
2: Tx := 1;
3: Tx := 2;
4: Tx := 3;
end;
if j = 2 then
case i of
1: Tx := 4;
2: Tx := 5;
3: Tx := 6;
4: Tx := 7;
end;
if j = 3 then
case i of
1: Tx := 8;
2: Tx := 9;
3: Tx := 10;
4: Tx := 11;
end;
if j = 4 then
case i of
1: Tx := 12;
2: Tx := 13;
3: Tx := 14;
4: Tx := 15;
end;
end else
begin
if j = 1 then
case i of
1: Back := 0;
2: Back := 1;
3: Back := 2;
4: Back := 3;
end;
if j = 2 then
case i of
1: Back := 4;
2: Back := 5;
3: Back := 6;
4: Back := 7;
end;
if j = 3 then
case i of
1: Back := 0 + Blink;
2: Back := 1 + Blink;
3: Back := 2 + Blink;
4: Back := 3 + Blink;
end;
if j = 4 then
case i of
1: Back := 4 + Blink;
2: Back := 5 + Blink;
3: Back := 6 + Blink;
4: Back := 7 + Blink;
end;
end;
if C in [#72, #75, #77, #80] then
begin
SetAttr(Tx, Back, Color);
MakePalWin(Color, False);
end;
end;
end;
if MouseButt = 1 then
begin
if not MouseIn(24, 7, 58, 19) then C := #27;
if MouseIn(28, 9, 39, 16) or MouseIn(43, 9, 54, 16) then
begin
if MouseIn(28, 9, 39, 16) then TB := False;
if MouseIn(43, 9, 54, 16) then TB := True;
if MouseIn( 28, 9, 30, 10) then Tx := Black;
if MouseIn( 31, 9, 33, 10) then Tx := Blue;
if MouseIn( 34, 9, 36, 10) then Tx := Green;
if MouseIn( 37, 9, 39, 10) then Tx := Cyan;
if MouseIn( 28, 11, 30, 12) then Tx := Red;
if MouseIn( 31, 11, 33, 12) then Tx := Magenta;
if MouseIn( 34, 11, 36, 12) then Tx := Brown;
if MouseIn( 37, 11, 39, 12) then Tx := LightGray;
if MouseIn( 28, 13, 30, 14) then Tx := DarkGray;
if MouseIn( 31, 13, 33, 14) then Tx := LightBlue;
if MouseIn( 34, 13, 36, 14) then Tx := LightGreen;
if MouseIn( 37, 13, 39, 14) then Tx := LightCyan;
if MouseIn( 28, 15, 30, 16) then Tx := LightRed;
if MouseIn( 31, 15, 33, 16) then Tx := LightMagenta;
if MouseIn( 34, 15, 36, 16) then Tx := Yellow;
if MouseIn( 37, 15, 39, 16) then Tx := White;
if MouseIn( 43, 9, 45, 10) then Back := Black;
if MouseIn( 46, 9, 48, 10) then Back := Blue;
if MouseIn( 49, 9, 51, 10) then Back := Green;
if MouseIn( 52, 9, 54, 10) then Back := Cyan;
if MouseIn( 43, 11, 45, 12) then Back := Red;
if MouseIn( 46, 11, 48, 12) then Back := Magenta;
if MouseIn( 49, 11, 51, 12) then Back := Brown;
if MouseIn( 52, 11, 54, 12) then Back := LightGray;
if MouseIn( 43, 13, 45, 14) then Back := DarkGray + Blink;
if MouseIn( 46, 13, 48, 14) then Back := LightBlue + Blink;
if MouseIn( 49, 13, 51, 14) then Back := LightGreen + Blink;
if MouseIn( 52, 13, 54, 14) then Back := LightCyan + Blink;
if MouseIn( 43, 15, 45, 16) then Back := LightRed + Blink;
if MouseIn( 46, 15, 48, 16) then Back := LightMagenta + Blink;
if MouseIn( 49, 15, 51, 16) then Back := Yellow + Blink;
if MouseIn( 52, 15, 54, 16) then Back := White + Blink;
SetAttr(Tx, Back, Color);
MakePalWin(Color, False);
While MouseButt<>0 do;
end;
end;{if MouseButt...}
Until (C = #13) or (C = #27);
if KeyPressed then ReadKey;
HideMouse;
if C <> #27 then
Col := Color;
UndoMenu;
end;
Procedure Configure;
var
TxWin, BkGrWin : Byte;
TxButt, BkGrButt : Byte;
begin
ReadCFG;
CursorOff;
SetCurColor(MainWinColor);
SaveBar(1, 1, 80, 25);
WaitRetrace;
SetWindow(1, 1, 80, 25, 2, HeadStringConfig, True);
SetButtSize(12, 2);
SetButton(3, 23, 2, ' Сохранить');
SetButtSize(15, 2);
SetButton(16, 23, 2, ' Восстановить');
SetButtSize(15, 2);
SetButton(63, 23, 2, ' По умолчанию');
PutWindow(52, 17, 70, 21, 2, '');
PutCursor(53, 19);
WriteLine(' Писать логи: ', WinAttr);
PutWindow(67, 18, 69, 20, 1, '');
if logon then WriteLine(#15, WinAttr)
else WriteLine(' ', WinAttr);
PutWindow(42, 2, 78, 4, 1, '(* Текущий скрипт в файле: *)');
PutCursor(44, 3);
WriteLine(CurDScript, WinAttr);
PutWindow(42, 5, 78, 16, 2, '(* Цвета *)');
ZZCursor;
WriteLine(' Основное окно', WinAttr);{MainWinColor}
NewLine;
WriteLine(' Сообщения об ошибке', WinAttr);{ErrorWinColor}
NewLine;
WriteLine(' Окно компиляции', WinAttr);{CompileWinColor}
NewLine;
WriteLine(' Рабочее окно', WinAttr);{WorkWinColor}
NewLine;
WriteLine(' Окно для ввода', WinAttr);{EnterWinColor}
NewLine;
NewLine;
WriteLine(' Текст 1', WinAttr);{txAttr}
NewLine;
WriteLine(' Текст 2', WinAttr);{txCompileAttr}
NewLine;
WriteLine(' Текст 3', WinAttr);{tx0Attr}
NewLine;
WriteLine(' Текст 4', WinAttr);{tx1Attr}
PutWindow(63, 6, 77, 15, 1, '');
ZZCursor;
WriteLine('Текст в окне', WinAttr);{WinAttr}
NewLine;
WriteLine('Рамка окна', WinAttr);{WBorderAttr}
NewLine;
WriteLine('Заголовок', WinAttr);{WinHAttr}
NewLine;
WriteLine('Меню Key', WinAttr);{MnAttrK}
NewLine;
WriteLine('Меню', WinAttr);{MnAttrM}
NewLine;
WriteLine('Кнопка', WinAttr);{ButtAttr}
NewLine;
WriteLine('Кнопка: яркая', WinAttr);{ButtLight}
NewLine;
WriteLine('Кнопка: тень', WinAttr);{ButtShadow}
NewLine;
SetCurColor(MainWinColor);
While MouseButt <> 2 do
begin
Example;
Palette(MainWinColor._WinAttr);
SetCurColor(MainWinColor);
end;
ShowMouse;
{ _WinAttr, _WBorderAttr, _WinHAttr, _MnAttrK, _MnAttrM,
_ButtAttr, _ButtLight, _ButtShadow : Byte;
}
ReadKey;
HideMouse;
UndoMenu;
RestoreScreen;
CursorOn;
end;
begin
InitMouse;
ToggleIntense_Blink(0);
cfgName := ParamStr(0);
Delete(cfgName, Length(cfgName)-3, 4);
cfgName := cfgName + cfgExt;
ReadCFG;
if ParamCount > 0 then
begin
tmpSt := UpString(ParamStr(1));
if (tmpSt = '-NOLOG') or (tmpSt = '/NOLOG')
then logon := False;
if (tmpSt = '-LOGON') or (tmpSt = '/LOGON')
then logon := True;
if (tmpSt = '-CONFIG') or (tmpSt = '/CONFIG')
then
begin
Configure;
Halt;
end;
if (tmpSt[1]<>'-') and (tmpSt[1]<>'/') then curDScript := tmpSt;
end;
Assign(logFile, logName);
Assign(tmpFile, tmpName);
if logon then
begin
{$I-}
Append(logFile);
{$I+}
if IOResult <> 0 then
begin
{$I-}
Rewrite(logFile);
{$I+}
if IOResult <> 0 then
begin
WriteLn('Ошибка при создании файла-лога!');
Halt;
end;
end;
Write(logFile, '=> diwr: [* Запуск *] / ');
logWrTimeDate;
WriteLn(logFile, '/');
Close(logFile);
end;{if logon ...}
{ ClrScr;}
SetCurColor(MainWinColor);
if logon then
begin
{$I-}
Append(logFile);
{$I+}
if IOResult = 0 then
begin
logTimeWr;
Write(logFile, 'Загружена палитра: {');
Write(logFile, WinAttr, '; ');
Write(logFile, WBorderAttr, '; ');
Write(logFile, WinHAttr, '; ');
Write(logFile, MnAttrK, '; ');
Write(logFile, MnAttrM, '; ');
Write(logFile, ButtAttr, '; ');
Write(logFile, ButtLight, '; ');
Write(logFile, ButtShadow, '; ');
Write(logFile, txAttr, '; ');
WriteLn(logFile, ErAttr, '} ');
Close(logFile);
end;
end;
CursorOff;
SaveBar(1, 1, 80, 25);
WaitRetrace;
SetWindow(1, 1, 80, 25, 2, HeadString, True);
SetWindow(1, 1, 26, 25, 1, StatString, True);
Border(1, 1, 80, 25, 2);
Border(26, 1, 56, 2, 1);
for i := 1 to Length(HeadString) do
WriteCharXY(i+26, 1, WinHAttr, HeadString[i]);
for i := 1 to Length(StatString) do
WriteCharXY(i+4, 2, WinHAttr, StatString[i]);
WriteCharXY(26, 1, WBorderAttr, #184);
WriteCharXY(26, 25, WBorderAttr, #207);
WriteCharXY(26, 2, WBorderAttr, #195);
WriteCharXY(56, 1, WBorderAttr, #213);
for i := 1 to 24 do
WriteCharXY(i+1, 3, WinHAttr, #196);
{ UndoMenu;}
PutCursor(2, 4);
WriteLine('Описание текущей работы: ', txAttr);
PutCursor(2, 6);
WriteLine('Файл '+curDScript, txAttr);
CheckCplDScript;
LogWr('Начало обработки дискеты...');
DoWork;
LogWr('Окончание обработки дискеты...');
RestoreScreen;
ZZCursor;
CursorOn;
{ curDScript := 'st.ds';}
if logon then
begin
{$I-}
Append(logFile);
{$I+}
if IOResult = 0 then
begin
Write(logFile, '=> diwr: [* Завершение работы... *] (');
logWrTimeDate;
WriteLn(logFile, ')');
WriteLn(logFile, '===---===---===---===---===---===---===---===---===---===---===---===---===---==');
Close(logFile);
end;
end;{logon}
Erase(tmpFile);
RestoreScreen;
{ ClearScreen;}
end.