home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sp15-g1.zip / tvsrc.zip / TVSRC / TVPATCH.DAT next >
Text File  |  1996-01-30  |  132KB  |  5,279 lines

  1. !MEMORY.PAS
  2. #{$O+,F+,X+,I-,S-,Q-}
  3. >{$I-,S-,Q-}
  4. #  MaxHeapSize: Word = 655360 div 16;    { 640K }
  5. #  MaxBufMem: Word = 65536 div 16;       {  64K }
  6. >  MaxHeapSize: LongWord = (8192*1024) DIV 16;  {  8 MB }
  7. >  LowMemSize: LongWord = 4096 DIV 16;          {  4 KB }
  8. >  MaxBufMem: Word = 65536 DIV 16;              {  64 K }
  9. #function MemAllocSeg(Size: Word): Pointer;
  10. >
  11. #{$IFNDEF DPMI}
  12. #{$ENDIF}
  13. >
  14. #  PtrRec = record
  15. #  end;
  16. >  PtrRec = record
  17. >    Ofs: LongWord;
  18. >  end;
  19. #{$IFDEF DPMI}
  20. >
  21. #    Data: record end;
  22. >    Data: record end;
  23. >    BufSize:WORD;
  24. #  CacheList: PCache = nil;
  25. >  CacheList:  PCache = nil;
  26. >  BufferList: PCache = nil;
  27. #function MemAllocateBlock(HeapHandle, Size, Attributes: Word;
  28. #external 'RTM' index $0014;
  29. >
  30. #function MemAllocSeg(Size: Word): Pointer;
  31. #end;
  32. >
  33. #  PtrRec(Cache).Ofs := 0;
  34. #    PtrRec(Cache).Seg := 0;
  35. >  Cache:=NIL;
  36. >  IF MaxAvail>=Size THEN GetMem(Cache,Size);
  37. #    Cache^.Master := @P;
  38. >    Cache^.Master := @P;
  39. >    Cache^.BufSize:= Size;
  40. #  PtrRec(Cache).Seg := PtrRec(P).Seg;
  41. >
  42. #    MemFreeBlock(PtrRec(Cache).Seg);
  43. >    FreeMem(Cache,Cache^.BufSize);
  44. #procedure NewBuffer(var P: Pointer; Size: Word);
  45. #end;
  46. >procedure NewBuffer(var P: Pointer; Size: Word);
  47. >begin
  48. >     P:=MemAlloc(Size+Sizeof(TCache));
  49. >     IF P<>NIL THEN
  50. >     BEGIN
  51. >          PCache(P)^.Next:=BufferList;
  52. >          BufferList:=P;
  53. >          BufferList^.BufSize:=Size;
  54. >          BufferList^.Master:=@P;
  55. >          inc(P,SizeOf(TCache));
  56. >     END;
  57. >end;
  58. #procedure DisposeBuffer(P: Pointer);
  59. #end;
  60. >procedure DisposeBuffer(P: Pointer);
  61. >VAR dummy,dummy1:PCache;
  62. >LABEL l;
  63. >begin
  64. >     IF P=NIL THEN exit;
  65. >     dec(P,SizeOf(TCache));
  66. >     dummy1:=NIL;
  67. >     dummy:=BufferList;
  68. >     WHILE dummy<>NIL DO
  69. >     BEGIN
  70. >          IF dummy=P THEN goto l;
  71. >          dummy1:=dummy;
  72. >          dummy:=dummy^.Next;
  73. >     END;
  74. >     exit;  {no match found}
  75. >l:
  76. >     IF dummy1=NIL THEN BufferList:=dummy^.Next
  77. >     ELSE dummy1^.Next:=dummy^.Next;
  78. >     FreeMem(P,dummy^.BufSize);
  79. >end;
  80. #function GetBufferSize(P: Pointer): Word;
  81. #end;
  82. >function GetBufferSize(P: Pointer): Word;
  83. >begin
  84. >     IF P<>NIL THEN
  85. >     BEGIN
  86. >          dec(P,SizeOf(TCache));
  87. >          GetBufferSize:=PCache(P)^.BufSize;
  88. >     END
  89. >     ELSE GetBufferSize:=0;
  90. >end;
  91. #function SetBufferSize(P: Pointer; Size: Word): Boolean;
  92. #end;
  93. >function SetBufferSize(P: Pointer; Size: Word): Boolean;
  94. >begin
  95. >    SetBufferSize:=FALSE;  {not supported yet}
  96. >end;
  97. #{$ELSE}
  98. #end.
  99. >end.
  100. !OBJECTS.PAS
  101. #{$O+,F+,X+,I-,S-}
  102. >{$I-,S-}
  103. #interface
  104. >interface
  105. >
  106. >
  107. >uses Os2Def,BseDos,Memory,Strings;
  108. #  PtrRec = record
  109. #  end;
  110. >  PtrRec = record
  111. >    Ofs: LongWord;
  112. >  end;
  113. #{ String pointers }
  114. #  PString = ^String;
  115. >
  116. #  TWordArray = array[0..16383] of Word;
  117. >  TWordArray = array[0..16383] of Word;
  118. >  PPtrArray = ^TPtrArray;
  119. >  TPtrArray = array[0..8192] of Pointer;
  120. #  PObject = ^TObject;
  121. #  end;
  122. >  TObject = object
  123. >    constructor Init;
  124. >    procedure Free;
  125. >    destructor Done; virtual;
  126. >  end;
  127. >  PObject = ^TObject;
  128. #{ TStreamRec }
  129. #  end;
  130. >{ TStreamRec }
  131. >  PStreamRec = ^TStreamRec;
  132. >  TStreamRec = record
  133. >    ObjType: Word;
  134. >    VmtLink: Pointer;
  135. >    Load: Pointer;
  136. >    Store: Pointer;
  137. >    Next: PStreamRec;
  138. >  end;
  139. #{$IFDEF Windows}
  140. #{$ENDIF}
  141. >  FNameStr = string;
  142. #    Handle: Word;
  143. >    Handle: LongWord;
  144. #{ TEmsStream }
  145. #{ TCollection types }
  146. >
  147. >{MemoryStream not supported yet}
  148. >
  149. >{ TCollection types }
  150. #{$IFNDEF Windows}
  151. >
  152. #{$ENDIF}
  153. >
  154. #{ Longint routines }
  155. #inline($59/$58/$5A/$F7/$F9);
  156. >
  157. #{ EMS stream state variables }
  158. #  EmsCurPage: Word = $FFFF;
  159. >
  160. #{ Stream registration records }
  161. #{$ENDIF}
  162. >{ Stream registration records }
  163. >
  164. >var
  165. >  RCollection: TStreamRec;
  166. >  RStringCollection: TStreamRec;
  167. >  RStrCollection: TStreamRec;
  168. >  RStringList: TStreamRec;
  169. >  RStrListMaker: TStreamRec;
  170. #{$IFDEF Windows}
  171. #{$ENDIF}
  172. >
  173. #{$IFDEF Windows}
  174. #{$ENDIF}
  175. >
  176. #{$IFDEF DPMI}
  177. #{$ENDIF}
  178. >
  179. #constructor TObject.Init;
  180. #end;
  181. >constructor TObject.Init;
  182. >type
  183. >  Image = record
  184. >    DmtPtr: POINTER;
  185. >    InfoPtr: POINTER;
  186. >    DataSize: LONGWORD;
  187. >  end;
  188. >  DataImage=record
  189. >    VmtPtr:^Image;
  190. >    Data:Record end;
  191. >  end;
  192. >var p:^Image;
  193. >    s:^DataImage;
  194. >begin
  195. >  s:=@Self;
  196. >  p:=s^.VmtPtr;
  197. >  FillChar(s^.Data, p^.DataSize-4,0);
  198. >end;
  199. #  Dispose(PObject(@Self), Done);
  200. >  Dispose(PObject(@Self), Done);
  201. #  StreamTypes: Word = 0;
  202. >  StreamTypes: PStreamRec = NIL;
  203. #procedure RegisterType(var S: TStreamRec); assembler;
  204. #end;
  205. >procedure RegisterType(var S: TStreamRec);
  206. >var
  207. >  dummy: PStreamRec;
  208. >begin
  209. >  if S.ObjType=0 then RegisterError;
  210. >  dummy := StreamTypes;
  211. >  while dummy<>NIL do
  212. >  begin
  213. >       if dummy^.ObjType=S.ObjType then RegisterError;
  214. >       dummy:=dummy^.Next;
  215. >  end;
  216. >  S.Next:=StreamTypes;
  217. >  StreamTypes:=@S;
  218. >end;
  219. #{ Stream error handler                                  }
  220. #end;
  221. >
  222. #function TStream.Get: PObject; assembler;
  223. #end;
  224. >function TStream.Get: PObject;
  225. >var typ:Integer;
  226. >    dummy:PStreamRec;
  227. >    result:PObject;
  228. >    Vmt:Pointer;
  229. >    LoadAddr:Pointer;
  230. >label l;
  231. >begin
  232. >     Read(typ,2);
  233. >     if typ=0 then
  234. >     begin
  235. >          Get:=NIL;
  236. >          exit;
  237. >     end;
  238. >     dummy:=StreamTypes;
  239. >     while dummy<>NIL do
  240. >     begin
  241. >          if dummy^.ObjType=typ then goto l;
  242. >          dummy:=dummy^.Next;
  243. >     end;
  244. >     //No match found
  245. >     Error(stGetError,typ);
  246. >     Get:=NIL;
  247. >     exit;
  248. >l:
  249. >     Vmt:=dummy^.VmtLink;
  250. >     LoadAddr:=dummy^.Load;
  251. >     {Initialize Object with load constructor=dummy^.Load
  252. >     and VMT table=dummy^.VmtLink and TStream=SELF}
  253. >     asm
  254. >        lea edi,$result
  255. >        push edi
  256. >        mov esi,$Vmt
  257. >        pushl [esi+8]  //object size
  258. >        calln32 system.savegetmem
  259. >        mov esi,[edi]
  260. >        pushl $vmt
  261. >        popd [esi+4]
  262. >        movd [esi],0
  263. >        pushl $self   //Stream param
  264. >        push esi      //self
  265. >        lea eax,$LoadAddr
  266. >        calln32 [eax]
  267. >     end;
  268. >
  269. >     Get:=Result;
  270. >end;
  271. #procedure TStream.Put(P: PObject); assembler;
  272. #end;
  273. >procedure TStream.Put(P: PObject);
  274. >var dummy:PStreamRec;
  275. >    typ:Integer;
  276. >    VmtLink:POINTER;
  277. >    StoreAddr:POINTER;
  278. >label l;
  279. >begin
  280. >     if P=NIL then
  281. >     begin
  282. >          typ:=0;
  283. >          Write(typ,2);
  284. >          exit;
  285. >     end;
  286. >     VmtLink:=POINTER(P)^;
  287. >     VmtLink:=VmtLink^;
  288. >     dummy:=StreamTypes;
  289. >     while dummy<>NIL do
  290. >     begin
  291. >          if dummy^.VmtLink=VmtLink then goto l;
  292. >          dummy:=dummy^.Next;
  293. >     end;
  294. >     //No match found
  295. >     Error(stPutError,typ);
  296. >     exit;
  297. >l:
  298. >     typ:=dummy^.ObjType;
  299. >     Write(typ,2);
  300. >     StoreAddr:=dummy^.Store;
  301. >     {Write Object with save method=dummy^.Store and TStream=SELF}
  302. >     asm
  303. >        pushl $self        //TStream Param
  304. >        mov eax,$p
  305. >        pushl [eax]        //SELF
  306. >        lea eax,$StoreAddr
  307. >        calln32 [eax]
  308. >     end;
  309. >end;
  310. #constructor TDosStream.Init(FileName: FNameStr; Mode: Word); assembler;
  311. #end;
  312. >constructor TDosStream.Init(FileName: FNameStr; Mode: Word);
  313. >var SaveFileMode:LONGWORD;
  314. >    Result,Action:LongWord;
  315. >    c:CSTRING;
  316. >begin
  317. >     Inherited Init;
  318. >     c:=FileName;
  319. >     Result:=1; {Error}
  320. >     case Mode of
  321. >       stCreate:  //create new file
  322. >       begin
  323. >            Result:=DosOpen(c,Handle,action,0,$20,18,fmInOut,NIL);
  324. >       end;
  325. >       stOpenRead: //open file for read
  326. >       begin
  327. >            Result:=DosOpen(c,Handle,action,0,0,1,fmInput,NIL);
  328. >       end;
  329. >       stOpenWrite: //open file for write
  330. >       begin
  331. >            Result:=DosOpen(c,Handle,action,0,0,1,fmOutput,NIL);
  332. >       end;
  333. >       stOpen: //open file for read/write
  334. >       begin
  335. >            Result:=DosOpen(c,Handle,action,0,0,1,fmInOut,NIL);
  336. >       end;
  337. >     end; {case}
  338. >
  339. >     if result<>0 then
  340. >     begin
  341. >          Error(stInitError,result);
  342. >          Status:=stInitError;
  343. >          Handle:=-1;
  344. >     end
  345. >     else Status:=stOk;
  346. >end;
  347. #destructor TDosStream.Done; assembler;
  348. #end;
  349. >destructor TDosStream.Done;
  350. >begin
  351. >     DosClose(Handle);
  352. >     Inherited Done;
  353. >end;
  354. #function TDosStream.GetPos: Longint; assembler;
  355. #end;
  356. >function TDosStream.GetPos: Longint;
  357. >var result:longword;
  358. >begin
  359. >     if Status<>stOk then
  360. >     begin
  361. >          GetPos:=-1;
  362. >          exit;
  363. >     end;
  364. >     if DosSetFilePtr(Handle,0,1,result)<>0 then
  365. >     begin
  366. >          Error(stError,1);
  367. >          Status:=stError;
  368. >          result:=-1;
  369. >     end;
  370. >
  371. >     GetPos:=result;
  372. >end;
  373. #function TDosStream.GetSize: Longint; assembler;
  374. #end;
  375. >function TDosStream.GetSize: Longint;
  376. >var result:LongWord;
  377. >    OldPos:LongInt;
  378. >begin
  379. >     if Status<>stOk then
  380. >     begin
  381. >          GetSize:=-1;
  382. >          exit;
  383. >     end;
  384. >     OldPos:=GetPos;
  385. >     if OldPos<0 then
  386. >     begin
  387. >          GetSize:=-1;
  388. >          exit;
  389. >     end;
  390. >     if DosSetFilePtr(Handle,0,2,result)<>0 then
  391. >     begin
  392. >          Status:=stError;
  393. >          Error(stError,1);
  394. >          result:=-1;
  395. >     end;
  396. >     Seek(OldPos);
  397. >     GetSize:=result;
  398. >end;
  399. #procedure TDosStream.Read(var Buf; Count: Word); assembler;
  400. #end;
  401. >procedure TDosStream.Read(var Buf; Count: Word);
  402. >var result,actual:LongWord;
  403. >begin
  404. >     if Status<>stOk then
  405. >     begin
  406. >          fillchar(Buf,Count,0);
  407. >          exit;
  408. >     end;
  409. >     result:=DosRead(Handle,Buf,Count,actual);
  410. >     if ((result<>0)OR(actual<>Count)) then
  411. >     begin
  412. >          if result<>0 then Status:=stError
  413. >          else Status:=stReadError;
  414. >          Error(Status,result);
  415. >     end;
  416. >end;
  417. #procedure TDosStream.Seek(Pos: Longint); assembler;
  418. #end;
  419. >procedure TDosStream.Seek(Pos: Longint);
  420. >var result:LongWord;
  421. >begin
  422. >     if Status<>stOk then exit;
  423. >     if DosSetFilePtr(Handle,Pos,0,result)<>0 then
  424. >     begin
  425. >          Status:=stError;
  426. >          Error(stError,1);
  427. >     end;
  428. >end;
  429. #procedure TDosStream.Truncate; assembler;
  430. #end;
  431. >procedure TDosStream.Truncate;
  432. >begin
  433. >     if Status<>stOk then exit;
  434. >     if DosSetFileSize(Handle,GetPos)<>0 then
  435. >     begin
  436. >          Status:=stError;
  437. >          Error(stError,1);
  438. >     end;
  439. >end;
  440. #procedure TDosStream.Write(var Buf; Count: Word); assembler;
  441. #end;
  442. >procedure TDosStream.Write(var Buf; Count: Word);
  443. >var actual,Result:LongWord;
  444. >begin
  445. >     if Status<>stOk then exit;
  446. >     Result:=DosWrite(Handle,Buf,Count,Actual);
  447. >     if ((Result<>0)OR(Count<>Actual)) then
  448. >     begin
  449. >          if Result<>0 then Status:=stError
  450. >          else Status:=stWriteError;
  451. >          Error(Status,Result);
  452. >     end;
  453. >end;
  454. #{ In    AL    = Flush mode (0=Read, 1=Write, 2=Both)    }
  455. #{ Out   ZF    = Status test                             }
  456. >
  457. #procedure FlushBuffer; near; assembler;
  458. #end;
  459. >function FlushBuffer(Mode:BYTE;Stream:TBufStream):boolean;
  460. >var result,Actual:LongWord;
  461. >label l;
  462. >begin
  463. >     if Stream.BufPtr=Stream.BufEnd then
  464. >     begin
  465. >l:
  466. >          Stream.BufPtr:=0;
  467. >          Stream.BufEnd:=0;
  468. >          FlushBuffer:=Stream.Status=stOk;
  469. >          exit;
  470. >     end;
  471. >     if Stream.BufPtr<Stream.BufEnd then
  472. >     begin
  473. >          if mode=1 then exit; //if write
  474. >          //Seek from current pos
  475. >          if DosSetFilePtr(Stream.Handle,Stream.Bufptr-Stream.BufEnd,
  476. >                           1,result)<>0 then Stream.Status:=stError
  477. >          else Stream.Status:=stOk;
  478. >          goto l;
  479. >     end;
  480. >     if mode=0 then exit; //if read
  481. >     Result:=DosWrite(Stream.Handle,Stream.Buffer^,
  482. >                      Stream.BufPtr-Stream.BufEnd,Actual);
  483. >     if ((Result<>0)OR(Stream.BufPtr-Stream.BufEnd<>Actual)) then
  484. >     begin
  485. >          if Result<>0 then Stream.Status:=stError
  486. >          else Stream.Status:=stWriteError;
  487. >          Stream.Error(Stream.Status,Result);
  488. >     end;
  489. >     goto l;
  490. >end;
  491. #procedure TBufStream.Flush; assembler;
  492. #end;
  493. >procedure TBufStream.Flush;
  494. >begin
  495. >     if Status<>stOk then exit;
  496. >     FlushBuffer(2,SELF);
  497. >end;
  498. #function TBufStream.GetPos: Longint; assembler;
  499. #end;
  500. >function TBufStream.GetPos: Longint;
  501. >var result:LongInt;
  502. >begin
  503. >     result:=TDosStream.GetPos;
  504. >     if result<0 then
  505. >     begin
  506. >          GetPos:=-1;
  507. >          exit;
  508. >     end;
  509. >     GetPos:=(result-BufEnd)+BufPtr;
  510. >end;
  511. #function TBufStream.GetSize: Longint; assembler;
  512. #end;
  513. >function TBufStream.GetSize: Longint;
  514. >begin
  515. >     Flush;
  516. >     GetSize:=TDosStream.GetSize;
  517. >end;
  518. #procedure TBufStream.Read(var Buf; Count: Word); assembler;
  519. #end;
  520. >procedure DoStreamError(Stream:TStream;Code:LongInt);
  521. >begin
  522. >     Stream.Error(Code,1);
  523. >end;
  524. >
  525. >procedure TBufStream.Read(var Buf; Count: Word);
  526. >var actual:LongWord;
  527. >label l;
  528. >begin
  529. >     if Status<>stOk then
  530. >     begin
  531. >l:
  532. >          fillchar(Buf,Count,0);
  533. >          exit;
  534. >     end;
  535. >     if not FlushBuffer(1,SELF) then goto l;
  536. >
  537. >     asm
  538. >        XOR     EBX,EBX
  539. >!read1:
  540. >        MOV     CX,$Count
  541. >        SUB     CX,BX
  542. >        JE      !read7     //Nothing more to do
  543. >
  544. >        MOV     EDI,$Self
  545. >        MOV     AX,[EDI].TBufStream.BufEnd
  546. >        SUB     AX,[EDI].TBufStream.BufPtr
  547. >        JA      !read2
  548. >
  549. >        PUSH    CX
  550. >        PUSH    BX
  551. >
  552. >        MOV     CX,[EDI].TBufStream.BufSize
  553. >        LEA     EAX,$Actual
  554. >        PUSH    EAX                             //Actual
  555. >        MOVZX   ECX,CX
  556. >        PUSH    ECX                             //BufSize
  557. >        PUSHL   [EDI].TBufStream.Buffer
  558. >        PUSHL   [EDI].TBufStream.Handle
  559. >        MOV     AL,4
  560. >        CALLDLL DosCalls,281                    //DosRead
  561. >        ADD     ESP,16
  562. >
  563. >        POP     BX
  564. >        POP     CX
  565. >
  566. >        MOV     DX,stError
  567. >        CMP     EAX,0
  568. >        JNE     !read5
  569. >
  570. >        MOV     AX,$Actual
  571. >        MOVW    [EDI].TBufStream.BufPtr,0
  572. >        MOV     [EDI].TBufStream.BufEnd,AX
  573. >        OR      AX,AX
  574. >        JE      !read4      //0 bytes written ??
  575. >!read2:
  576. >        CMP     CX,AX
  577. >        JB      !read3
  578. >        MOV     CX,AX
  579. >!read3:
  580. >        MOV     ESI,[EDI].TBufStream.Buffer
  581. >        MOVZXW  EAX,[EDI].TBufStream.BufPtr
  582. >        ADD     ESI,EAX
  583. >        ADD     [EDI].TBufStream.BufPtr,CX
  584. >        MOV     EDI,$Buf
  585. >        MOVZX   EBX,BX
  586. >        MOVZX   ECX,CX
  587. >        ADD     EDI,EBX
  588. >        ADD     BX,CX
  589. >        CLD
  590. >        MOV     EDX,ECX
  591. >        SHR     ECX,2
  592. >        REP
  593. >        MOVSD
  594. >        MOV     ECX,EDX
  595. >        AND     ECX,3
  596. >        REP
  597. >        MOVSB
  598. >        JMP     !read1
  599. >!read4:
  600. >        MOV     DX,stReadError
  601. >!read5:
  602. >        PUSHL   $SELF
  603. >        PUSH    EDX
  604. >        CALLN32 Objects.DoStreamError
  605. >!read6:
  606. >        MOV     EDI,$Buf       //make buf empty
  607. >        MOVZXW  ECX,$Count
  608. >        XOR     AL,AL
  609. >        CLD
  610. >        REP
  611. >        STOSB
  612. >!read7:
  613. >     end;
  614. >end;
  615. #procedure TBufStream.Seek(Pos: Longint); assembler;
  616. #end;
  617. >procedure TBufStream.Seek(Pos: Longint);
  618. >var result:Longint;
  619. >begin
  620. >     result:=TDosStream.GetPos;
  621. >     if result<0 then exit;
  622. >     if ((result=Pos)and(result<>0)) then
  623. >     begin
  624. >          if BufEnd>=result then
  625. >          begin
  626. >               BufPtr:=BufEnd-result;
  627. >               exit;
  628. >          end;
  629. >     end;
  630. >
  631. >     Flush;
  632. >     TDosStream.Seek(Pos);
  633. >end;
  634. #procedure TBufStream.Write(var Buf; Count: Word); assembler;
  635. #end;
  636. >procedure TBufStream.Write(var Buf; Count: Word);
  637. >var actual:LongWord;
  638. >begin
  639. >     if Status<>stOk then exit;
  640. >     if not FlushBuffer(0,SELF) then exit;
  641. >     asm
  642. >        XOR     EDX,EDX
  643. >!Write1:
  644. >        MOV     CX,$Count
  645. >        SUB     CX,DX
  646. >        JE      !write4   //Nothing more to do
  647. >        MOV     EDI,$Self
  648. >        MOV     AX,[EDI].TBufStream.BufSize
  649. >        SUB     AX,[EDI].TBufStream.BufPtr
  650. >        JA      !Write2
  651. >
  652. >        PUSH    CX
  653. >        PUSH    DX
  654. >        PUSHL   1            //Mode for FlushBuffer
  655. >        PUSHL   $SELF
  656. >        CALLN32 Objects.FlushBuffer
  657. >
  658. >        POP     DX
  659. >        POP     CX
  660. >
  661. >        JNE     !Write4
  662. >        MOV     EDI,$SELF
  663. >        MOV     AX,[EDI].TBufStream.BufSize
  664. >!Write2:
  665. >        CMP     CX,AX
  666. >        JB      !Write3
  667. >        MOV     CX,AX
  668. >!Write3:
  669. >        MOV     AX,[EDI].TBufStream.BufPtr
  670. >        ADD     [EDI].TBufStream.BufPtr,CX
  671. >        MOV     EDI,[EDI].TBufStream.Buffer
  672. >        MOVZX   EAX,AX
  673. >        ADD     EDI,EAX
  674. >        MOV     ESI,$Buf
  675. >        MOVZX   EDX,DX
  676. >        ADD     ESI,EDX
  677. >        MOVZX   ECX,CX
  678. >        ADD     DX,CX
  679. >        CLD
  680. >        MOV     EBX,ECX
  681. >        SHR     ECX,2
  682. >        REP
  683. >        MOVSD
  684. >        MOV     ECX,EBX
  685. >        AND     ECX,3
  686. >        REP
  687. >        MOVSB
  688. >        JMP     !Write1
  689. >!Write4:
  690. >     end;
  691. >end;
  692. #{ TEmsStream }
  693. #{ TCollection }
  694. >
  695. >{TMemoryStream not supported yet}
  696. >
  697. >{ TCollection }
  698. #procedure CollectionError; near; assembler;
  699. #end;
  700. >
  701.  
  702. #function TCollection.At(Index: Integer): Pointer; assembler;
  703. #end;
  704. >function TCollection.At(Index: Integer): Pointer;
  705. >label l;
  706. >begin
  707. >     if Index<0 then
  708. >     begin
  709. >l:
  710. >          Error(coIndexError,1);
  711. >          At:=NIL;
  712. >          exit;
  713. >     end;
  714. >     if Index>=Count then goto l;
  715. >     At:=Items^[Index];
  716. >end;
  717. #procedure TCollection.AtDelete(Index: Integer); assembler;
  718. #end;
  719. >procedure TCollection.AtDelete(Index: Integer);
  720. >var Temp:LongWord;
  721. >label l;
  722. >begin
  723. >     if Index<0 then
  724. >     begin
  725. >l:
  726. >          Error(coIndexError,1);
  727. >          exit;
  728. >     end;
  729. >     if Index>=Count then goto l;
  730. >     dec(Count);
  731. >     Temp:=Count-Index;
  732. >     if Temp=0 then exit;
  733. >     move(Items^[Index+1],Items^[Index],Temp*4);
  734. >end;
  735. #procedure TCollection.AtInsert(Index: Integer; Item: Pointer); assembler;
  736. #end;
  737. >procedure TCollection.AtInsert(Index: Integer; Item: Pointer);
  738. >var OldCount:Integer;
  739. >label l;
  740. >begin
  741. >     OldCount:=Count;
  742. >     if Index<0 then
  743. >     begin
  744. >l:
  745. >          Error(CoIndexError,1);
  746. >          exit;
  747. >     end;
  748. >     if Index>Count then goto l;
  749. >     if Count=Limit then
  750. >     begin
  751. >          SetLimit(Count+Delta);
  752. >          if Count=Limit then
  753. >          begin
  754. >               Error(coOverflow,1);
  755. >               exit;
  756. >          end;
  757. >     end;
  758. >     //Move Collection one Index up
  759. >     if Index<OldCount then move(Items^[Index],Items^[Index+1],(OldCount-Index)*4);
  760. >     inc(Count);
  761. >     Items^[Index]:=Item;
  762. >end;
  763. #procedure TCollection.AtPut(Index: Integer; Item: Pointer); assembler;
  764. #end;
  765. >procedure TCollection.AtPut(Index: Integer; Item: Pointer);
  766. >label l;
  767. >begin
  768. >     if Index<0 then
  769. >     begin
  770. >l:
  771. >          Error(CoIndexError,1);
  772. >          exit;
  773. >     end;
  774. >     if Index>=Count then goto l;
  775. >     Items^[Index]:=Item;
  776. >end;
  777. #function TCollection.FirstThat(Test: Pointer): Pointer; assembler;
  778. #end;
  779. >function TCollection.FirstThat(Test: Pointer): Pointer;
  780. >var p:function(Item,EBP:Pointer):Boolean;
  781. >    t:LongInt;
  782. >    _ebp:POINTER;
  783. >begin
  784. >     asm
  785. >        mov eax,[EBP]  //FirstThat Callbacks sind lokal !!
  786. >        mov $_ebp,eax
  787. >     end;
  788. >     if Count=0 then
  789. >     begin
  790. >          FirstThat:=NIL;
  791. >          exit;
  792. >     end;
  793. >     p:=Test;
  794. >     for t:=0 to Count-1 do
  795. >     begin
  796. >          if p(Items^[t],_ebp) then
  797. >          begin
  798. >               FirstThat:=Items^[t];
  799. >               exit;
  800. >          end;
  801. >     end;
  802. >     FirstThat:=NIL;
  803. >end;
  804. #procedure TCollection.ForEach(Action: Pointer); assembler;
  805. #end;
  806. >procedure TCollection.ForEach(Action: Pointer);
  807. >var p:procedure(Item,EBP:Pointer);
  808. >    t:LongInt;
  809. >    _ebp:Pointer;
  810. >begin
  811. >     asm   //ForEach Funktionen sind lokal !!!
  812. >        mov eax,[EBP]
  813. >        mov $_ebp,eax
  814. >     end;
  815. >     if Count=0 then exit;
  816. >     p:=Action;
  817. >     for t:=0 to Count-1 do p(Items^[t],_ebp);
  818. >end;
  819. #function TCollection.IndexOf(Item: Pointer): Integer; assembler;
  820. #end;
  821. >function TCollection.IndexOf(Item: Pointer): Integer;
  822. >var t:LongInt;
  823. >begin
  824. >     if Count=0 then
  825. >     begin
  826. >          IndexOf:=-1;
  827. >          exit;
  828. >     end;
  829. >
  830. >     for t:=0 to Count-1 do
  831. >     begin
  832. >          if Items^[t]=Item then
  833. >          begin
  834. >               IndexOf:=t;
  835. >               exit;
  836. >          end;
  837. >     end;
  838. >     IndexOf:=-1;
  839. >end;
  840. #function TCollection.LastThat(Test: Pointer): Pointer; assembler;
  841. #end;
  842. >function TCollection.LastThat(Test: Pointer): Pointer;
  843. >var p:function(Item,ebp:Pointer):Boolean;
  844. >    t:LongInt;
  845. >    LastResult:Pointer;
  846. >    _ebp:Pointer;
  847. >begin
  848. >     asm
  849. >        mov eax,[ebp]   //LastThat CallBacks sind lokal !!
  850. >        mov $_ebp,eax
  851. >     end;
  852. >     if Count=0 then
  853. >     begin
  854. >          LastThat:=NIL;
  855. >          exit;
  856. >     end;
  857. >     p:=Test;
  858. >     LastResult:=NIL;
  859. >     for t:=0 to Count-1 do if p(Items^[t],_ebp) then LastResult:=Items^[t];
  860. >     LastThat:=LastResult;
  861. >end;
  862. #procedure TCollection.Pack; assembler;
  863. #end;
  864. >procedure TCollection.Pack;
  865. >var t,t1:LongInt;
  866. >begin
  867. >     if Count=0 then exit;
  868. >     t1:=1;
  869. >     for t:=0 to Count-1 do
  870. >     begin
  871. >          if Items^[t]<>nil then
  872. >          begin
  873. >               Items^[t1]:=Items^[t];
  874. >               inc(t1);
  875. >          end;
  876. >     end;
  877. >     Count:=t1;
  878. >end;
  879. #function TStringCollection.Compare(Key1, Key2: Pointer): Integer; assembler;
  880. #end;
  881. >function TStringCollection.Compare(Key1, Key2: Pointer): Integer;
  882. >begin
  883. >    asm
  884. >       cld
  885. >       xor eax,eax
  886. >       xor edx,edx
  887. >       mov esi,$Key1
  888. >       mov edi,$Key2
  889. >       lodsb
  890. >       mov dl,[edi]
  891. >       inc edi
  892. >       mov ecx,eax
  893. >       cmp cl,dl
  894. >       jbe !l1
  895. >       mov cl,dl
  896. >!l1:
  897. >       repe
  898. >       cmpsb
  899. >       je !l2
  900. >       mov al,[esi-1]
  901. >       mov dl,[edi-1]
  902. >!l2:
  903. >       sub eax,edx
  904. >       mov $!FuncResult,eax
  905. >    end;
  906. >end;
  907. #{$IFNDEF Windows }
  908. >
  909. #function TResourceCollection.KeyOf(Item: Pointer): Pointer; assembler;
  910. #end;
  911. >function TResourceCollection.KeyOf(Item: Pointer): Pointer;
  912. >begin
  913. >     inc(Item,8);
  914. >     KeyOf:=Item;
  915. >end;
  916. #{$IFDEF NewExeFormat}
  917. >
  918. #{$ENDIF}
  919. >
  920. #{$IFDEF NewExeFormat}
  921. >
  922. #{$ENDIF}
  923. >
  924. #{$IFDEF NewExeFormat}
  925. #{$ENDIF}
  926. >       $5A4D:                                  { 'MZ' }
  927. >       begin
  928. >            Stream^.Read(ExeHeader, SizeOf(TExeHeader));
  929. >            BasePos := ExeHeader.eNewHeader;
  930. >            Stop := False;
  931. >       end;
  932. >       $584C:                                  { 'LX' }
  933. >       begin
  934. >            BasePos := Stream^.GetSize - 8;
  935. >            Stop := False;
  936. >       end;
  937. >       $4246:                                  { 'FB' }
  938. >       begin
  939. >            Stop := False;
  940. >            case Header.Infotype of
  941. >              $5250:                            {'PR': Found Resource}
  942. >              begin
  943. >                  Found := True;
  944. >                  Stop := True;
  945. >              end;
  946. >              $4C42: Dec(BasePos, Header.InfoSize - 8); {'BL': Found BackLink}
  947. >              $4648: Dec(BasePos, SizeOf(THeader) * 2); {'HF': Found HelpFile}
  948. >              else Stop := True;
  949. >            end;
  950. >       end;
  951. >       $424E:                                  { 'NB' }
  952. >          if Header.InfoType = $3230 then       { '02': Found Debug Info}
  953. >          begin
  954. >            Dec(BasePos, Header.InfoSize);
  955. >            Stop := False;
  956. >          end;
  957. #function TStringList.Get(Key: Word): String; assembler;
  958. #end;
  959. >function TStringList.Get(Key: Word): String;
  960. >var t:LongInt;
  961. >    temp:Word;
  962. >    result:String;
  963. >begin
  964. >     if IndexSize=0 then
  965. >     begin
  966. >          Get:='';
  967. >          exit;
  968. >     end;
  969. >     result:='';
  970. >     for t:=1 to IndexSize do
  971. >     begin
  972. >          Temp:=Key-Index^[t].Key;
  973. >          if Temp<Index^[t].Count then
  974. >          begin
  975. >               ReadStr(Result,Index^[t].Offset,Temp);
  976. >               Get:=Result;
  977. >               exit;
  978. >          end;
  979. >     end;
  980. >     Get:='';
  981. >end;
  982. #procedure CheckEmpty; near; assembler;
  983. #end;
  984. >procedure CheckEmpty(Var r:TRect);
  985. >begin
  986. >     if ((r.A.X>=r.B.X)or(r.A.Y>=r.B.Y)) then fillchar(r,sizeof(TRect),0);
  987. >end;
  988. #procedure TRect.Assign(XA, YA, XB, YB: Integer); assembler;
  989. #end;
  990. >procedure TRect.Assign(XA, YA, XB, YB: Integer);
  991. >begin
  992. >      A.X:=XA;
  993. >      A.Y:=YA;
  994. >      B.X:=XB;
  995. >      B.Y:=YB;
  996. >end;
  997. #procedure TRect.Copy(R: TRect); assembler;
  998. #end;
  999. >procedure TRect.Copy(R: TRect);
  1000. >begin
  1001. >     system.move(R.A,A,2*sizeof(TPoint));
  1002. >end;
  1003. #procedure TRect.Move(ADX, ADY: Integer); assembler;
  1004. #end;
  1005. >procedure TRect.Move(ADX, ADY: Integer);
  1006. >begin
  1007. >      inc(A.X,ADX);
  1008. >      inc(B.X,ADX);
  1009. >      inc(A.Y,ADY);
  1010. >      inc(B.Y,ADY);
  1011. >end;
  1012. #procedure TRect.Grow(ADX, ADY: Integer); assembler;
  1013. #end;
  1014. >procedure TRect.Grow(ADX, ADY: Integer);
  1015. >begin
  1016. >     asm
  1017. >       MOV     EDI,$Self
  1018. >       MOV     AX,$ADX
  1019. >       SUB     [EDI].TRect.A.X,AX
  1020. >       ADD     [EDI].TRect.B.X,AX
  1021. >       MOV     AX,$ADY
  1022. >       SUB     [EDI].TRect.A.Y,AX
  1023. >       ADD     [EDI].TRect.B.Y,AX
  1024. >       PUSHL   $SELF
  1025. >       CALLN32 Objects.CheckEmpty
  1026. >     end;
  1027. >end;
  1028. #procedure TRect.Intersect(R: TRect); assembler;
  1029. #end;
  1030. >procedure TRect.Intersect(R: TRect);
  1031. >begin
  1032. >      asm
  1033. >         LEA ESI,$r
  1034. >         LEA ESI,[ESI].TRect.A.X
  1035. >         MOV EDI,$SELF
  1036. >         LEA EDI,[EDI].TRect.A.X
  1037. >         CLD
  1038. >
  1039. >         //Process TRect.A
  1040. >         LODSW
  1041. >         SCASW
  1042. >         JLE     !l11
  1043. >         DEC     EDI
  1044. >         DEC     EDI
  1045. >         STOSW
  1046. >!l11:
  1047. >         LODSW
  1048. >         SCASW
  1049. >         JLE     !l12
  1050. >         DEC     EDI
  1051. >         DEC     EDI
  1052. >         STOSW
  1053. >!l12:
  1054. >         LEA ESI,$r
  1055. >         LEA ESI,[ESI].TRect.B.X
  1056. >         MOV EDI,$SELF
  1057. >         LEA EDI,[EDI].TRect.B.X
  1058. >
  1059. >         //Process TRect.B
  1060. >         LODSW
  1061. >         SCASW
  1062. >         JGE     !l13
  1063. >         DEC     EDI
  1064. >         DEC     EDI
  1065. >         STOSW
  1066. >!l13:
  1067. >         LODSW
  1068. >         SCASW
  1069. >         JGE     !l14
  1070. >         DEC     EDI
  1071. >         DEC     EDI
  1072. >         STOSW
  1073. >!l14:
  1074. >         PUSHL $SELF
  1075. >         CALLN32 Objects.CheckEmpty
  1076. >      end;
  1077. >end;
  1078. #procedure TRect.Union(R: TRect); assembler;
  1079. #end;
  1080. >procedure TRect.Union(R: TRect);
  1081. >begin
  1082. >    asm
  1083. >        LEA ESI,$r
  1084. >        LEA ESI,[ESI].TRect.A.X
  1085. >        MOV EDI,$SELF
  1086. >        LEA EDI,[EDI].TRect.A.X
  1087. >        CLD
  1088. >
  1089. >        //Process TRect.A
  1090. >        LODSW
  1091. >        SCASW
  1092. >        JGE     !l21
  1093. >        DEC     EDI
  1094. >        DEC     EDI
  1095. >        STOSW
  1096. >!l21:
  1097. >        LODSW
  1098. >        SCASW
  1099. >        JGE     !l22
  1100. >        DEC     EDI
  1101. >        DEC     EDI
  1102. >        STOSW
  1103. >!l22:
  1104. >        LEA ESI,$r
  1105. >        LEA ESI,[ESI].TRect.B.X
  1106. >        MOV EDI,$SELF
  1107. >        LEA EDI,[EDI].TRect.B.X
  1108. >
  1109. >        //Process TRect.B
  1110. >        LODSW
  1111. >        SCASW
  1112. >        JLE     !l23
  1113. >        DEC     EDI
  1114. >        DEC     EDI
  1115. >        STOSW
  1116. >!l23:
  1117. >        LODSW
  1118. >        SCASW
  1119. >        JLE     !l24
  1120. >        DEC     EDI
  1121. >        DEC     EDI
  1122. >        STOSW
  1123. >!l24:
  1124. >     end;
  1125. >end;
  1126. #function TRect.Contains(P: TPoint): Boolean; assembler;
  1127. #end;
  1128. >function TRect.Contains(P: TPoint): Boolean;
  1129. >var result:boolean;
  1130. >label l1;
  1131. >begin
  1132. >      result:=false;
  1133. >      if P.X<A.X then goto l1;
  1134. >      if P.X>=B.X then goto l1;
  1135. >      if P.Y<A.Y then goto l1;
  1136. >      if P.Y>=B.Y then goto l1;
  1137. >      result:=true;
  1138. >l1:
  1139. >      Contains:=result;
  1140. >end;
  1141. #function TRect.Equals(R: TRect): Boolean; assembler;
  1142. #end;
  1143. >function TRect.Equals(R: TRect): Boolean;
  1144. >begin
  1145. >      if R=TRect(A) then Equals:=true
  1146. >      else Equals:=false;
  1147. >end;
  1148. #function TRect.Empty: Boolean; assembler;
  1149. #end;
  1150. >function TRect.Empty: Boolean;
  1151. >var result:boolean;
  1152. >begin
  1153. >      if A.X>=B.X then result:=true
  1154. >      else if A.Y>=B.Y then result:=true
  1155. >      else result:=false;
  1156. >      Empty:=result;
  1157. >end;
  1158. #{$ENDIF}
  1159. >
  1160. #end.
  1161. >begin
  1162. >     RCollection.ObjType:=50;
  1163. >     RCollection.VmtLink:=TypeOf(TCollection);
  1164. >     RCollection.Load:=@TCollection.Load;
  1165. >     RCollection.Store:=@TCollection.Store;
  1166. >     RStringCollection.ObjType:=51;
  1167. >     RStringCollection.VmtLink:=TypeOf(TStringCollection);
  1168. >     RStringCollection.Load:=@TStringCollection.Load;
  1169. >     RStringCollection.Store:=@TStringCollection.Store;
  1170. >     RStrCollection.ObjType:=69;
  1171. >     RStrCollection.VmtLink:=TypeOf(TStrCollection);
  1172. >     RStrCollection.Load:=@TStrCollection.Load;
  1173. >     RStrCollection.Store:=@TStrCollection.Store;
  1174. >     RStringList.ObjType:=52;
  1175. >     RStringList.VmtLink:=TypeOf(TStringList);
  1176. >     RStringList.Load:=@TStringList.Load;
  1177. >     RStringList.Store:=NIL;
  1178. >     RStrListMaker.ObjType:=52;
  1179. >     RStrListMaker.VmtLink:=TypeOf(TStrListMaker);
  1180. >     RStrListMaker.Load:=NIL;
  1181. >     RStrListMaker.Store:=@TStrListMaker.Store;
  1182. >end.
  1183. !DRIVERS.PAS
  1184. #{$X+,I-,S-,P-}
  1185. #{$C FIXED PRELOAD PERMANENT}
  1186. >{$I-,S-}
  1187. #uses Objects;
  1188. >uses Os2Def,BseDos,BseSub,Objects;
  1189. #{ Keyboard state and shift masks }
  1190. > kbAltTab     = $A500; kbAltDel     = $A300;  kbAltIns       = $A200;
  1191. > kbAltPgDn    = $A100; kbAltDown    = $A000;  kbAltEnd       = $9F00;
  1192. > kbAltRight   = $9D00; kbAltLeft    = $9B00;  kbAltPgUp      = $9900;
  1193. > kbAltUp      = $9800; kbAltHome    = $9700;  kbCtrlTab      = $9400;
  1194. > kbCtrlGreyPlus=$9000; kbCtrlCenter = $8F00;  kbCtrlMinus    = $8E00;
  1195. > kbCtrlUp     = $8D00; kbAltF12     = $8C00;  kbAltF11       = $8B00;
  1196. > kbCtrlF12    = $8A00; kbCtrlF11    = $8900;  kbShiftF12     = $8800;
  1197. > kbShiftF11   = $8700; kbF12        = $8600;  kbF11          = $8500;
  1198. > kbAltGrayPlus= $4E00; kbCenter     = $4C00;  kbAltGreyAst   = $3700;
  1199. > kbAltSlash   = $3500; kbAltPeriod  = $3400;  kbAltComma     = $3300;
  1200. > kbAltBackSlash=$2B00; kbAltOpQuote = $2900;  kbAltQuote     = $2800;
  1201. > kbAltSemicolon=$2700; kbAltRgtBrack= $1B00;  kbAltLftBrack  =$1A00;
  1202. > kbAltEsc     = $0100; kbCtrlDown   = $9100;  kbAltShiftBack = $0900;
  1203. >
  1204. > kbCtrlA      = $1E01;  kbCtrlB     = $3002;  kbCtrlC     = $2E03;
  1205. > kbCtrlD      = $2004;  kbCtrlE     = $1205;  kbCtrlF     = $2106;
  1206. > kbCtrlG      = $2207;  kbCtrlH     = $2308;  kbCtrlI     = $1709;
  1207. > kbCtrlJ      = $240A;  kbCtrlK     = $250B;  kbCtrlL     = $260C;
  1208. > kbCtrlM      = $320D;  kbCtrlN     = $310E;  kbCtrlO     = $180F;
  1209. > kbCtrlP      = $1910;  kbCtrlQ     = $1011;  kbCtrlR     = $1312;
  1210. > kbCtrlS      = $1F13;  kbCtrlT     = $1414;  kbCtrlU     = $1615;
  1211. > kbCtrlV      = $2F16;  kbCtrlW     = $1117;  kbCtrlX     = $2D18;
  1212. > kbCtrlY      = $1519;  kbCtrlZ     = $2C1A;
  1213. >
  1214. >
  1215. >{ Keyboard state and shift masks }
  1216. #  kbInsState    = $0080;
  1217. >  kbInsState    = $0080;
  1218. >  kbShift       = kbLeftShift + kbRightShift;
  1219. >
  1220. >{Shift state variable}
  1221. >var
  1222. >   ShiftState:LONGWORD;
  1223. >
  1224. >const
  1225. #function GetShiftState: Byte;
  1226. >function GetShiftState: LONGWORD;
  1227. #function SystemError(ErrorCode: Integer; Drive: Byte): Integer;
  1228. >
  1229. #const
  1230. #  SysErrorFunc: TSysErrorFunc = SystemError;
  1231. >var
  1232. >{ Initialized variables }
  1233. >  SysErrorFunc: TSysErrorFunc;
  1234. >
  1235. >const
  1236. #procedure MoveChar(var Dest; C: Char; Attr: Byte; Count: Word);
  1237. >procedure MoveChar(var Dest; Ch: Char; Attr: Byte; Count: Word);
  1238. #var
  1239. #{ Event manager variables }
  1240. >var
  1241. >
  1242. >{ Event manager variables }
  1243. #  DownTicks: Word;
  1244. #  AutoDelay: Word;
  1245. >  DownTicks: LongWord;
  1246. >  AutoTicks: LongWord;
  1247. >  AutoDelay: LongWord;
  1248. #var
  1249. #  Ticks: Word absolute $40:$6C;
  1250. >
  1251. #procedure DetectMouse; near; assembler;
  1252. #end;
  1253. >{Mouse Handle}
  1254. >var HMouse:HMOU;
  1255. >
  1256. >procedure DetectMouse;
  1257. >var
  1258. >  MouPos: PtrLoc;
  1259. >  MouseButtons: Word;
  1260. >begin
  1261. >  if MouOpen(nil,HMouse) = 0 then
  1262. >  begin
  1263. >      MouGetNumButtons(MouseButtons,HMouse);
  1264. >      ButtonCount := MouseButtons;
  1265. >      {Set mouse position to (0,0)}
  1266. >      MouPos.Row:=0;
  1267. >      MouPos.Col:=0;
  1268. >      MouSetPtrPos(MouPos,HMouse);
  1269. >  end
  1270. >  else ButtonCount:=0;  {No mouse available ??}
  1271. >end;
  1272. #procedure StoreEvent; near; assembler;
  1273. #end;
  1274. >{Stores Mouse event in event}
  1275. >procedure StoreMouseEvent(What: Word;VAR TheEvent:MouEventInfo;
  1276. >                          VAR Dest:TEvent);
  1277. >begin
  1278. >    MouseWhere.X:=TheEvent.Col;
  1279. >    MouseWhere.Y:=TheEvent.Row;
  1280. >    LastButtons:=MouseButtons;
  1281. >    Dest.What:=What;
  1282. >    Dest.Buttons:=LastButtons;
  1283. >    Dest.Double:=LastDouble;
  1284. >    Dest.Where:=MouseWhere;
  1285. >end;
  1286. #{ Get mouse state }
  1287. #end;
  1288. >
  1289. #procedure MouseInt; far; assembler;
  1290. #end;
  1291. >
  1292. #procedure InitEvents; assembler;
  1293. #end;
  1294. >procedure InitEvents;
  1295. >var
  1296. >  MouseEventMask:Word;
  1297. >  MousePos:PtrLoc;
  1298. >begin
  1299. >    if ButtonCount=0 then exit; {No mouse available}
  1300. >    MouGetPtrPos(MousePos,HMouse);  {get current mouse position}
  1301. >    MouseWhere.X:=MousePos.Col;
  1302. >    MouseWhere.Y:=MousePos.Row;
  1303. >    ShowMouse;
  1304. >    MouseEventMask:=$FFFF;  {we want to get all events}
  1305. >    MouSetEventMask(MouseEventMask,HMouse);
  1306. >    DownButtons:=0;
  1307. >    LastDouble:=False;
  1308. >    LastButtons:=0;    {No button pressed ??}
  1309. >    MouseEvents:=True;
  1310. >end;
  1311. #procedure DoneEvents; assembler;
  1312. #end;
  1313. >procedure DoneEvents;
  1314. >var
  1315. >  MouseEventMask:Word;
  1316. >begin
  1317. >    if ButtonCount=0 then exit; {No mouse available}
  1318. >    HideMouse;
  1319. >    MouseEventMask:=0;   {We want to get no events}
  1320. >    MouSetEventMask(MouseEventMask,HMouse);
  1321. >    MouseEvents := False;
  1322. >end;
  1323. #procedure ShowMouse; assembler;
  1324. #end;
  1325. >procedure ShowMouse;
  1326. >begin
  1327. >     if ButtonCount <> 0 then MouDrawPtr(HMouse); {Only if mouse here}
  1328. >end;
  1329. #procedure HideMouse; assembler;
  1330. #end;
  1331. >procedure HideMouse;
  1332. >var Screen:NoPtrRect;
  1333. >begin
  1334. >    if ButtonCount <> 0 then  {only if mouse here}
  1335. >    begin
  1336. >         Screen.Row:=0;
  1337. >         Screen.Col:=0;
  1338. >         Screen.cRow:=ScreenHeight-1;
  1339. >         Screen.cCol:=ScreenWidth-1;
  1340. >         MouRemovePtr(Screen,HMouse);
  1341. >    end;
  1342. >end;
  1343. >
  1344. >
  1345. >var MouseMSec:LONGINT;
  1346. >
  1347. >procedure UpdateMouse;
  1348. >var
  1349. >  MousePos: PtrLoc;
  1350. >  MSec: Longint;
  1351. >begin
  1352. >  DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, MSec,4);
  1353. >  if MSec-MouseMSec>=4 then
  1354. >  begin
  1355. >      MouseMSec := MSec;
  1356. >      MouGetPtrPos(MousePos, HMouse);
  1357. >      MouseWhere.X := MousePos.Col;
  1358. >      MouseWhere.Y := MousePos.Row;
  1359. >  end;
  1360. >end;
  1361. #procedure GetMouseEvent(var Event: TEvent); assembler;
  1362. #end;
  1363. >procedure GetMouseEvent(var Event: TEvent);
  1364. >var
  1365. >  Button1,Button2: Byte;
  1366. >  MouseQueueInfo: MouQueInfo;
  1367. >  MouseEvent: MouEventInfo;
  1368. >const
  1369. >  Button1__Down=MOUSE_MOTION_WITH_BN1_DOWN or MOUSE_BN1_DOWN;
  1370. >  Button2__Down=MOUSE_MOTION_WITH_BN2_DOWN or MOUSE_BN2_DOWN;
  1371. >  WaitFlag:Word=mou_NoWait;
  1372. >begin
  1373. >    if MouseEvents=FALSE then {disabled ??}
  1374. >    begin
  1375. >         Event.What:=evNothing;
  1376. >         exit;
  1377. >    end;
  1378. >
  1379. >    MouGetNumQueEl(MouseQueueInfo,HMouse);  {get Elements in Queue}
  1380. >    if MouseQueueInfo.cEvents=0 then {no events ??}
  1381. >    begin
  1382. >        {Simulate with last event}
  1383. >        MouseButtons := LastButtons;
  1384. >        {Get Time for that event}
  1385. >        DosQuerySysInfo(QSV_MS_COUNT,QSV_MS_COUNT,MouseEvent.Time,
  1386. >                        SizeOf(MouseEvent.Time));
  1387. >        MouseEvent.Col:= MouseWhere.X;
  1388. >        MouseEvent.Row:= MouseWhere.Y;
  1389. >    end
  1390. >    else  {there are entries in the queue}
  1391. >    begin
  1392. >         if MouseReverse then {switch buttons ??}
  1393. >         begin
  1394. >              Button1 := mbRightButton;
  1395. >              Button2 := mbLeftButton;
  1396. >         end
  1397. >         else
  1398. >         begin
  1399. >              Button1 := mbLeftButton;
  1400. >              Button2 := mbRightButton;
  1401. >         end;
  1402. >         MouReadEventQue(MouseEvent,WaitFlag,HMouse);
  1403. >         if (MouseEvent.fs and Button1__Down) <> 0 then MouseButtons := Button1
  1404. >         else MouseButtons := 0;
  1405. >         if (MouseEvent.fs and Button2__Down) <> 0 then MouseButtons:=MouseButtons or Button2;
  1406. >    end;
  1407. >
  1408. >    MouseMSec:=MouseEvent.Time;
  1409. >
  1410. >    if MouseButtons=0 then if LastButtons <> 0 then
  1411. >    begin
  1412. >         StoreMouseEvent(evMouseUp,MouseEvent,Event);
  1413. >         exit;
  1414. >    end;
  1415. >
  1416. >    if  LastButtons=MouseButtons then
  1417. >    begin
  1418. >         if ((MouseEvent.Col<>MouseWhere.X)OR(MouseEvent.Row<>MouseWhere.Y)) then
  1419. >         begin
  1420. >              StoreMouseEvent(evMouseMove,MouseEvent,Event);
  1421. >              exit;
  1422. >         end;
  1423. >
  1424. >        if MouseButtons<>0 then
  1425. >          if ((MouseEvent.Time div 55)-AutoTicks)>=AutoDelay then
  1426. >          begin
  1427. >               AutoDelay:=1;
  1428. >               AutoTicks:=MouseEvent.Time div 55;
  1429. >               StoreMouseEvent(evMouseAuto,MouseEvent,Event);
  1430. >               exit;
  1431. >          end;
  1432. >
  1433. >        StoreMouseEvent(evNothing,MouseEvent,Event);
  1434. >        exit;
  1435. >    end;
  1436. >
  1437. >    LastDouble := False;
  1438. >    if MouseButtons=DownButtons then
  1439. >      if MouseEvent.Col=DownWhere.X then if MouseEvent.Row=DownWhere.Y then
  1440. >        if ((MouseEvent.Time div 55)-DownTicks)<DoubleDelay then
  1441. >          LastDouble:=true;
  1442. >    DownTicks   := MouseEvent.Time div 55;
  1443. >    AutoTicks   := DownTicks;
  1444. >    AutoDelay   := RepeatDelay;
  1445. >    DownWhere.Y := MouseEvent.Row;
  1446. >    DownWhere.X := MouseEvent.Col;
  1447. >    DownButtons := MouseButtons;
  1448. >    StoreMouseEvent(evMouseDown,MouseEvent,Event);
  1449. >end;
  1450. #procedure GetKeyEvent(var Event: TEvent); assembler;
  1451. #end;
  1452. >procedure GetKeyEvent(var Event: TEvent);
  1453. >var
  1454. >  KeyInfo: KbdKeyInfo;
  1455. >begin
  1456. >     KbdCharIn(KeyInfo,IO_NOWAIT,0);
  1457. >     if (KeyInfo.fbStatus and KBDTRF_FINAL_CHAR_IN)=0 then  {invalid}
  1458. >     begin
  1459. >          Event.What:=evNothing;
  1460. >          exit;
  1461. >     end;
  1462. >
  1463. >     Event.What:=evKeyDown;
  1464. >     Event.CharCode:=KeyInfo.chChar;
  1465. >     Event.ScanCode:=KeyInfo.chScan;
  1466. >     ShiftState:=KeyInfo.fsState;
  1467. >
  1468. >     {convert scancodes}
  1469. >     case KeyInfo.chScan of
  1470. >        $39:  //Space
  1471. >        begin
  1472. >             if (KeyInfo.fsState and kbAltShift)=kbAltShift then
  1473. >               Event.KeyCode:=kbAltSpace;
  1474. >        end;
  1475. >        $52: //Ins
  1476. >        begin
  1477. >             if (KeyInfo.fsState and kbCtrlShift)=kbCtrlShift then
  1478. >                Event.KeyCode:=kbCtrlIns
  1479. >             else if (KeyInfo.fsState and kbLeftShift)=kbLeftShift then
  1480. >                Event.KeyCode:=kbShiftIns
  1481. >             else if (KeyInfo.fsState and kbRightShift)=kbRightShift then
  1482. >                Event.KeyCode:=kbShiftIns
  1483. >             else if (KeyInfo.fsState and kbShift)=kbShift then
  1484. >                Event.KeyCode:=kbShiftIns;
  1485. >        end;
  1486. >        $92: //Ctrl-Ins
  1487. >        begin
  1488. >             if (KeyInfo.fsState and kbCtrlShift)=kbCtrlShift then
  1489. >                Event.KeyCode:=kbCtrlIns;
  1490. >        end;
  1491. >        $53: //Del
  1492. >        begin
  1493. >             if (KeyInfo.fsState and kbCtrlShift)=kbCtrlShift then
  1494. >                Event.KeyCode:=kbCtrlDel
  1495. >             else if (KeyInfo.fsState and kbLeftShift)=kbLeftShift then
  1496. >                Event.KeyCode:=kbShiftDel
  1497. >             else if (KeyInfo.fsState and kbRightShift)=kbRightShift then
  1498. >                Event.KeyCode:=kbShiftDel
  1499. >             else if (KeyInfo.fsState and kbShift)=kbShift then
  1500. >                Event.KeyCode:=kbShiftDel;
  1501. >        end;
  1502. >        $93: //Ctrl-Del
  1503. >        begin
  1504. >             if (KeyInfo.fsState and kbCtrlShift)=kbCtrlShift then
  1505. >                Event.KeyCode:=kbCtrlDel;
  1506. >        end;
  1507. >        $0e: //Backspace
  1508. >        begin
  1509. >             if (KeyInfo.fsState and kbAltShift+kbLeftShift)=kbAltShift+kbLeftShift then
  1510. >                Event.KeyCode:=kbAltShiftBack
  1511. >             else if (KeyInfo.fsState and kbAltShift+kbRightShift)=kbAltShift+kbRightShift then
  1512. >                Event.KeyCode:=kbAltShiftBack
  1513. >             else if (KeyInfo.fsState and kbAltShift+kbShift)=kbAltShift+kbShift then
  1514. >                Event.KeyCode:=kbAltShiftBack
  1515. >             else if (KeyInfo.fsState and kbAltShift)=kbAltShift then
  1516. >                Event.KeyCode:=kbAltBack;
  1517. >        end;
  1518. >     end; {case}
  1519. >
  1520. >     if Event.KeyCode=$E00D then Event.KeyCode:=kbEnter;
  1521. >
  1522. >     if Event.CharCode=#$E0 then
  1523. >       if Event.ScanCode IN [$48{up},$50{down},$4b{left},$4d{right},
  1524. >                             $51{Pg dwn},$49{Pg up},$47{Home},$4f{End},
  1525. >                             $52{Ins},$53{Del},$8d{Ctrl up},$91{Ctrl dwn},
  1526. >                             Hi(kbCtrlLeft),Hi(kbCtrlRight),
  1527. >                             Hi(kbCtrlHome),Hi(kbCtrlEnd),
  1528. >                             Hi(kbCtrlPgUp), Hi(kbCtrlPgDn)]
  1529. >         then Event.CharCode:=#0; {not printable}
  1530. >end;
  1531. >
  1532. >procedure InitKeyboard;
  1533. >var
  1534. >  KeyInfo: KbdInfo;
  1535. >begin
  1536. >    KeyInfo.cb := SizeOf(KbdInfo);
  1537. >    KbdGetStatus(KeyInfo,0);
  1538. >    KeyInfo.fsMask:=(KeyInfo.fsMask and (not KEYBOARD_ASCII_MODE)) or KEYBOARD_BINARY_MODE;
  1539. >    KbdSetStatus(KeyInfo,0);
  1540. >end;
  1541. #function GetShiftState: Byte; assembler;
  1542. #end;
  1543. >function GetShiftState: LONGWORD;
  1544. >var
  1545. >  KeyInfo: KbdInfo;
  1546. >begin
  1547. >    KeyInfo.cb := SizeOf(KbdInfo);
  1548. >    KbdGetStatus(KeyInfo, 0);
  1549. >    ShiftState:=KeyInfo.fsState;
  1550. >    GetShiftState:=ShiftState;
  1551. >end;
  1552. #{ ******** SCREEN MANAGER ******** }
  1553. #end;
  1554. >{ ******** SCREEN MANAGER ******** }
  1555. >
  1556. >{Internal mode info}
  1557. >var VideoMode: VioModeInfo;
  1558. >
  1559. #{ Return CRT mode in AX and dimensions in DX }
  1560. #end;
  1561. >function GetCrtMode: Word;
  1562. >var
  1563. >  Mode: Word;
  1564. >begin
  1565. >     VideoMode.cb:=SizeOf(VioModeInfo);
  1566. >     VioGetMode(VideoMode,0);
  1567. >     IF (VideoMode.fbType and VGMT_DISABLEBURST)=0 then Mode:=smCO80
  1568. >     else Mode :=smBW80;
  1569. >     if VideoMode.Color=0 then Mode:=smMono;
  1570. >     if VideoMode.Row > 25 then Inc(Mode,smFont8x8);
  1571. >     if ((VideoMode.fbType and VGMT_Graphics) <> 0)or(VideoMode.Col <> 80) then
  1572. >       GetCrtMode := 0
  1573. >     else GetCrtMode := Mode;
  1574. >end;
  1575. #{ Set CRT mode to value in AX }
  1576. #end;
  1577. >procedure SetCrtMode(Mode: Word);
  1578. >var
  1579. >  VideoConfigInfo:VioConfigInfo;
  1580. >  BiosMode:Byte;
  1581. >begin
  1582. >     BiosMode := Lo(Mode);
  1583. >     VideoConfigInfo.cb:=SizeOf(VioConfigInfo);
  1584. >     VioGetConfig(0, VideoConfigInfo,0);
  1585. >
  1586. >     VideoMode.cb:=SizeOf(VioModeInfo);
  1587. >     VideoMode.Row:=25;
  1588. >     VideoMode.Col:=80;
  1589. >     VideoMode.VRes:=400;
  1590. >     VideoMode.HRes:=720;
  1591. >     VideoMode.fbType:=VGMT_OTHER;
  1592. >     VideoMode.Color:=COLORS_16;
  1593. >
  1594. >     if (Mode and smFont8x8) <> 0 then
  1595. >     begin
  1596. >          case VideoConfigInfo.Adapter of
  1597. >             DISPLAY_MONOCHROME..DISPLAY_CGA: ;
  1598. >             DISPLAY_EGA:
  1599. >             begin
  1600. >                  VideoMode.Row:=43;
  1601. >                  VideoMode.VRes:=350;
  1602. >                  VideoMode.HRes:=640;
  1603. >             end;
  1604. >             else
  1605. >             begin
  1606. >                  VideoMode.Row:=50;
  1607. >                  VideoMode.VRes:=400;
  1608. >                  VideoMode.HRes:=720;
  1609. >             end;
  1610. >          end; {case}
  1611. >     end;
  1612. >
  1613. >     case BiosMode of
  1614. >         smMono:
  1615. >         begin
  1616. >              VideoMode.HRes:=720;
  1617. >              VideoMode.VRes:=350;
  1618. >              VideoMode.Color:=0;
  1619. >              VideoMode.fbType:=0;
  1620. >         end;
  1621. >         smBW80: VideoMode.fbType := VGMT_OTHER + VGMT_DISABLEBURST;
  1622. >     end; {case}
  1623. >
  1624. >     VioSetMode(VideoMode,0);
  1625. >end;
  1626. #{ Fix CRT mode in AX if required }
  1627. #end;
  1628. >function FixCrtMode(Mode: Word): Word;
  1629. >var BiosMode:Byte;
  1630. >begin
  1631. >     BiosMode:=Lo(Mode);
  1632. >     case BiosMode of
  1633. >         smMono,smBW80,smCO80:FixCrtMode:=Mode;
  1634. >         else FixCrtMode := smCO80;
  1635. >     end; {case}
  1636. >end;
  1637. #procedure SetCrtData; near; assembler;
  1638. #end;
  1639. >procedure SetCrtData;
  1640. >var
  1641. >  VideoConfigInfo:VioConfigInfo;
  1642. >  BufSize:Word;
  1643. >  CursorData:VioCursorInfo;
  1644. >begin
  1645. >    ScreenMode := GetCrtMode;
  1646. >    HiResScreen  := False;
  1647. >
  1648. >    {Get physical screen buffer}
  1649. >    VioGetBuf(ScreenBuffer,BufSize,0);
  1650. >    {we need a flat pointer !}
  1651. >    asm
  1652. >       mov eax,drivers.ScreenBuffer
  1653. >       ror eax,16
  1654. >       shr ax,3
  1655. >       rol eax,16
  1656. >       mov drivers.ScreenBuffer,eax
  1657. >    end;
  1658. >
  1659. >    ScreenHeight := VideoMode.Row;
  1660. >    ScreenWidth := VideoMode.Col;
  1661. >
  1662. >    ShowMouse;
  1663. >
  1664. >    VideoConfigInfo.cb:=SizeOf(VioConfigInfo);
  1665. >    if VioGetConfig(0,VideoConfigInfo,0)=0 then
  1666. >    begin
  1667. >        if VideoConfigInfo.Adapter>=DISPLAY_EGA then
  1668. >           HiResScreen := True;
  1669. >    end;
  1670. >
  1671. >    VioGetCurType(CursorData, 0);
  1672. >    WordRec(CursorLines).Hi := CursorData.yStart;
  1673. >    WordRec(CursorLines).Lo := CursorData.cEnd;
  1674. >    CursorData.attr:=$FFFF;  {Mask}
  1675. >    VioSetCurType(CursorData,0); {Hide Cursor}
  1676. >end;
  1677. #procedure DetectVideo; assembler;
  1678. #end;
  1679. >procedure DetectVideo;
  1680. >begin
  1681. >  ScreenMode := FixCrtMode(GetCrtMode);
  1682. >end;
  1683. #procedure InitVideo; assembler;
  1684. #end;
  1685. >procedure InitVideo;
  1686. >begin
  1687. >    StartupMode := GetCrtMode;
  1688. >    if StartupMode <> ScreenMode then SetCrtMode(ScreenMode);
  1689. >    SetCrtData;
  1690. >end;
  1691. #procedure DoneVideo; assembler;
  1692. #end;
  1693. >procedure DoneVideo;
  1694. >begin
  1695. >    if (StartupMode <> $FFFF) and (StartupMode <> ScreenMode) then
  1696. >      SetCrtMode(StartupMode);
  1697. >    ClearScreen;
  1698. >end;
  1699. #procedure SetVideoMode(Mode: Word); assembler;
  1700. #end;
  1701. >procedure SetVideoMode(Mode: Word);
  1702. >begin
  1703. >    SetCrtMode(FixCrtMode(Mode));
  1704. >    SetCrtData;
  1705. >end;
  1706. #procedure ClearScreen; assembler;
  1707. #end;
  1708. >procedure ClearScreen;
  1709. >const
  1710. >    VioCell:Word=$0720; //Space white foreground, black back
  1711. >begin
  1712. >     VioScrollUp(0,0,65535,65535,65535,VioCell,0);
  1713. >     VioSetCurPos(0,0,0);
  1714. >end;
  1715. #{$IFDEF DPMI}
  1716. #{$ENDIF}
  1717. >
  1718. #const
  1719. #{ System error handler routines }
  1720. >{ System error handler routines }
  1721. #procedure InitSysError; external;
  1722. >procedure InitSysError;
  1723. >begin
  1724. >    {not supported yet}
  1725. >end;
  1726. #procedure DoneSysError; external;
  1727. >procedure DoneSysError;
  1728. >begin
  1729. >    {not supported yet}
  1730. >end;
  1731. #procedure SwapStatusLine(var Buffer); near; assembler;
  1732. #end;
  1733. >
  1734. #function SelectKey: Integer; near; assembler;
  1735. #end;
  1736. >
  1737. #{$V-}
  1738. #{$V+}
  1739. >
  1740. #{$L FORMAT.OBJ}
  1741. #external {FORMAT};
  1742. >{global variables used for FormatStr}
  1743. >var ParOfs,ParamsPtr:Pointer;
  1744. >    Buffer:array[1..12] of byte;
  1745. >
  1746. >const
  1747. >    HexDigits: array [0..15] of Char = '0123456789ABCDEF';
  1748. >
  1749. >{ Convert next parameter to string  }
  1750. >{ In : al = Conversion character    }
  1751. >{ Out: esi   = Pointer to string    }
  1752. >{      ecx   = String length        }
  1753. >procedure Convert;ASSEMBLER;
  1754. >asm
  1755. >   MOV   EDX,EAX
  1756. >   MOV   ESI,Drivers.ParamsPtr
  1757. >   LODSD
  1758. >   MOV   Drivers.ParamsPtr,ESI
  1759. >   XOR   ECX,ECX
  1760. >   MOV   ESI,Offset(Drivers.Buffer)
  1761. >   ADD   ESI,12
  1762. >   AND   DL,$DF
  1763. >   CMP   DL,'C'
  1764. >   JE    !ConvertChar
  1765. >   CMP   DL,'S'
  1766. >   JE    !ConvertStr
  1767. >   CMP   DL,'D'
  1768. >   JE    !ConvertDec
  1769. >   CMP   DL,'X'
  1770. >   JE    !ConvertHex
  1771. >   JMP   !Done
  1772. >!ConvertStr:
  1773. >   TEST  EAX,EAX
  1774. >   JZ    !Done
  1775. >   MOV   ESI,EAX
  1776. >   LODSB
  1777. >   MOV   CL,AL
  1778. >   JMP !Done
  1779. >!ConvertHex:
  1780. >   MOV   EDX,EAX
  1781. >   AND   EDX,$0F
  1782. >   ADD   EDX,Offset(Drivers.HexDigits)
  1783. >   MOV   DL,[EDX]
  1784. >   DEC   ESI
  1785. >   INC   ECX
  1786. >   MOV   [ESI],DL
  1787. >   SHR   EAX,4
  1788. >   JNZ   !ConvertHex
  1789. >   JMP   !Done
  1790. >!ConvertDec:
  1791. >   PUSH  ESI
  1792. >   MOV   EBX,EAX
  1793. >   MOV   ECX,10
  1794. >   TEST  EAX,EAX
  1795. >   JNS   !l2
  1796. >   NEG   EAX
  1797. >!l2:
  1798. >   XOR   EDX,EDX
  1799. >   DEC   ESI
  1800. >   DIV   ECX
  1801. >   ADD   DL,'0'
  1802. >   MOV   [ESI],DL
  1803. >   TEST  EAX,EAX
  1804. >   JNZ   !l2
  1805. >   POP   ECX
  1806. >   SUB   ECX,ESI
  1807. >   TEST  EBX,EBX
  1808. >   JNS   !Done
  1809. >   MOV   AL,'-'
  1810. >!ConvertChar:
  1811. >   INC   ECX
  1812. >   DEC   ESI
  1813. >   MOV   [ESI],AL
  1814. >!Done:
  1815. >end;
  1816. >
  1817. >procedure FormatStr(var Result: String; const Format: String; var Params);
  1818. >begin
  1819. >     asm
  1820. >        MOV     EAX,$Params
  1821. >        MOV     Drivers.ParOfs,EAX
  1822. >        MOV     Drivers.ParamsPtr,EAX
  1823. >        XOR     EAX,EAX
  1824. >        MOV     ESI,$Format
  1825. >        MOV     EDI,$Result
  1826. >        INC     EDI
  1827. >        CLD
  1828. >        LODSB
  1829. >        MOV     ECX,EAX
  1830. >!ll1:
  1831. >        CMP     ECX,0
  1832. >        JE      !ll9
  1833. >        LODSB
  1834. >        DEC     ECX
  1835. >        CMP     AL,'%'
  1836. >        JE      !ll3
  1837. >!ll2:
  1838. >        STOSB
  1839. >        JMP     !ll1
  1840. >!ll3:
  1841. >        CMP     ECX,0
  1842. >        JE      !ll9
  1843. >        LODSB
  1844. >        DEC     ECX
  1845. >        CMP     AL,'%'
  1846. >        JE      !ll2
  1847. >        MOV     BL,' '
  1848. >        MOVZX   EBX,BL
  1849. >        XOR     EDX,EDX
  1850. >        CMP     AL,'0'
  1851. >        JNE     !ll4
  1852. >        MOV     BL,AL
  1853. >!ll4:
  1854. >        CMP     AL,'-'
  1855. >        JNE     !ll5
  1856. >        INC     BH
  1857. >        CMP     ECX,0
  1858. >        JE      !ll9
  1859. >        LODSB
  1860. >        DEC     ECX
  1861. >!ll5:
  1862. >        CMP     AL,'0'
  1863. >        JB      !ll6
  1864. >        CMP     AL,'9'
  1865. >        JA      !ll6
  1866. >        SUB     AL,'0'
  1867. >        XCHG    EAX,EDX
  1868. >        MOV     AH,10
  1869. >        MUL     AH
  1870. >        ADD     AL,DL
  1871. >        XCHG    EAX,EDX
  1872. >        CMP     ECX,0
  1873. >        JE      !ll9
  1874. >        LODSB
  1875. >        DEC     ECX
  1876. >        JMP     !ll5
  1877. >!ll6:
  1878. >        CMP     AL,'#'
  1879. >        JNE     !ll10
  1880. >        SHL     EDX,2
  1881. >        ADD     EDX,Drivers.ParOfs
  1882. >        MOV     Drivers.ParamsPtr,EDX
  1883. >        JMP     !ll1
  1884. >!ll9:
  1885. >        MOV     EAX,$Result
  1886. >        MOV     ECX,EDI
  1887. >        SUB     ECX,EAX
  1888. >        DEC     ECX
  1889. >        MOV     [EAX],CL
  1890. >        JMP     !!Done
  1891. >!ll10:
  1892. >        PUSH    ESI
  1893. >        PUSH    ECX
  1894. >        PUSH    EDX
  1895. >        PUSH    EBX
  1896. >        CALLN32 Drivers.Convert
  1897. >        POP     EBX
  1898. >        POP     EDX
  1899. >        TEST    EDX,EDX
  1900. >        JZ      !ll12
  1901. >        SUB     EDX,ECX
  1902. >        JAE     !ll12
  1903. >        TEST    BH,BH
  1904. >        JNZ     !ll11
  1905. >        SUB     ESI,EDX
  1906. >!ll11:
  1907. >        ADD     ECX,EDX
  1908. >        XOR     EDX,EDX
  1909. >!ll12:
  1910. >        TEST    BH,BH
  1911. >        JZ      !ll13
  1912. >        REP
  1913. >        MOVSB
  1914. >!ll13:
  1915. >        XCHG    ECX,EDX
  1916. >        MOV     AL,BL
  1917. >        REP
  1918. >        STOSB
  1919. >        XCHG    ECX,EDX
  1920. >        REP
  1921. >        MOVSB
  1922. >        POP     ECX
  1923. >        POP     ESI
  1924. >        JMP     !ll1
  1925. >!!Done:
  1926. >     end;
  1927. >end;
  1928. #procedure PrintStr(const S: String); assembler;
  1929. #end;
  1930. >procedure PrintStr(const S: String);
  1931. >var
  1932. >   Actual:LongWord;
  1933. >   ps:POINTER;
  1934. >begin
  1935. >     ps:=@s[1];
  1936. >     DosWrite(1,ps^,Length(S),Actual);
  1937. >end;
  1938. #procedure MoveBuf(var Dest; var Source; Attr: Byte; Count: Word); assembler;
  1939. #end;
  1940. >procedure MoveBuf(var Dest; var Source; Attr: Byte; Count: Word);
  1941. >begin
  1942. >    asm
  1943. >       MOVZXW   ECX,$Count
  1944. >       CMP      ECX,0
  1945. >       JE       !l4_1
  1946. >       MOV      ESI,$Source
  1947. >       MOV      EDI,$Dest
  1948. >       MOV      AH,$Attr
  1949. >       CLD
  1950. >       TEST     AH,AH
  1951. >       JZ       !l3_1
  1952. >!l1_1:
  1953. >       LODSB
  1954. >       STOSW
  1955. >       LOOP     !l1_1
  1956. >       JMP      !l4_1
  1957. >!l2_1:
  1958. >       INC      EDI
  1959. >!l3_1:
  1960. >       MOVSB
  1961. >       LOOP     !l2_1
  1962. >!l4_1:
  1963. >    end;
  1964. >end;
  1965. #procedure MoveChar(var Dest; C: Char; Attr: Byte; Count: Word); assembler;
  1966. #end;
  1967. >procedure MoveChar(var Dest; Ch: Char; Attr: Byte; Count: Word);
  1968. >begin
  1969. >     asm
  1970. >        MOVZXW     ECX,$Count
  1971. >        CMP        ECX,0
  1972. >        JE         !l4_2
  1973. >        MOV        EDI,$Dest
  1974. >        MOV        AL,$Ch
  1975. >        MOV        AH,$Attr
  1976. >        CLD
  1977. >        TEST       AL,AL
  1978. >        JZ         !l1_2
  1979. >        TEST       AH,AH
  1980. >        JZ         !l3_2
  1981. >        MOV        EDX,EAX
  1982. >        SHL        EAX,16
  1983. >        MOV        AX,DX
  1984. >        SHR        ECX,1
  1985. >        REP
  1986. >        STOSD
  1987. >        ADC        ECX,ECX
  1988. >        REP
  1989. >        STOSW
  1990. >        JMP        !l4_2
  1991. >!l1_2:
  1992. >        MOV        AL,AH
  1993. >!l2_2:
  1994. >        INC        EDI
  1995. >!l3_2:
  1996. >        STOSB
  1997. >        LOOP       !l2_2
  1998. >!l4_2:
  1999. >     end;
  2000. >end;
  2001. #procedure MoveCStr(var Dest; const Str: String; Attrs: Word); assembler;
  2002. #end;
  2003. >procedure MoveCStr(var Dest; const Str: String; Attrs: Word);
  2004. >begin
  2005. >     asm
  2006. >        XOR     ECX,ECX
  2007. >        MOV     ESI,$Str
  2008. >        CLD
  2009. >        LODSB
  2010. >        MOV     CL,AL
  2011. >        CMP     ECX,0
  2012. >        JE      !l3_3
  2013. >        MOV     EDI,$Dest
  2014. >        MOV     DX,$Attrs
  2015. >        MOV     AH,DL
  2016. >!l1_3:
  2017. >        LODSB
  2018. >        CMP     AL,'~'
  2019. >        JE      !l2_3
  2020. >        STOSW
  2021. >        LOOP    !l1_3
  2022. >        JMP     !l3_3
  2023. >!l2_3:
  2024. >        XCHG    AH,DH
  2025. >        LOOP    !l1_3
  2026. >!l3_3:
  2027. >     end;
  2028. >end;
  2029. #procedure MoveStr(var Dest; const Str: String; Attr: Byte); assembler;
  2030. #end;
  2031. >procedure MoveStr(var Dest; const Str: String; Attr: Byte);
  2032. >begin
  2033. >     asm
  2034. >        XOR     ECX,ECX
  2035. >        MOV     ESI,$Str
  2036. >        CLD
  2037. >        LODSB
  2038. >        MOV     CL,AL
  2039. >        CMP     ECX,0
  2040. >        JE      !l4_4
  2041. >        MOV     EDI,$Dest
  2042. >        MOV     AH,$Attr
  2043. >        TEST    AH,AH
  2044. >        JZ      !l3_4
  2045. >!l1_4:
  2046. >        LODSB
  2047. >        STOSW
  2048. >        LOOP    !l1_4
  2049. >        JMP     !l4_4
  2050. >!l2_4:
  2051. >        INC     EDI
  2052. >!l3_4:
  2053. >        MOVSB
  2054. >        LOOP    !l2_4
  2055. >!l4_4:
  2056. >     end;
  2057. >end;
  2058. #function CStrLen(const S: String): Integer; assembler;
  2059. #end;
  2060. >function CStrLen(const S: String): Integer;
  2061. >begin
  2062. >     asm
  2063. >        XOR     ECX,ECX
  2064. >        MOV     EDI,$S
  2065. >        MOV     CL,[EDI]
  2066. >        INC     EDI
  2067. >        MOV     EDX,ECX
  2068. >        CMP     ECX,0
  2069. >        JE      !l2_5
  2070. >        MOV     AL,'~'
  2071. >        CLD
  2072. >!l1_5:
  2073. >        REPNE
  2074. >        SCASB
  2075. >        JNE     !l2_5
  2076. >        DEC     EDX
  2077. >        TEST    ESP,ESP
  2078. >        JMP     !l1_5
  2079. >!l2_5:
  2080. >        MOV     EAX,EDX
  2081. >        MOV     $!FuncResult,EAX
  2082. >     end;
  2083. >end;
  2084. #procedure ExitDrivers; far;
  2085. #end;
  2086. >procedure ExitDrivers;
  2087. >begin
  2088. >  DoneSysError;
  2089. >  DoneEvents;
  2090. >  MouClose(HMouse);
  2091. >  ExitProc := SaveExit;
  2092. >end;
  2093. #begin
  2094. #end.
  2095. >begin
  2096. >  SysErrorFunc:=NIL; {not implemented yet}
  2097. >  InitKeyboard;
  2098. >  DetectMouse;
  2099. >  DetectVideo;
  2100. >  SaveExit := ExitProc;
  2101. >  ExitProc := @ExitDrivers;
  2102. >end.
  2103. !VIEWS.PAS
  2104. #{$O+,F+,X+,I-,S-}
  2105. >{$I-,S-}
  2106. #uses Objects, Drivers, Memory;
  2107. >uses Os2Def,BseDos,BseSub,Objects, Drivers, Memory;
  2108. #    procedure WriteChar(X, Y: Integer; C: Char; Color: Byte;
  2109. >    procedure WriteChar(X, Y: Integer; Ch: Char; Color: Byte;
  2110. #  RView: TStreamRec = (
  2111. #  );
  2112. >  RView: TStreamRec = (
  2113. >     ObjType: 1;
  2114. >     VmtLink: TypeOf(TView);
  2115. >     Load:    @TView.Load;
  2116. >     Store:   @TView.Store
  2117. >  );
  2118. #  RFrame: TStreamRec = (
  2119. #  );
  2120. >  RFrame: TStreamRec = (
  2121. >     ObjType: 2;
  2122. >     VmtLink: TypeOf(TFrame);
  2123. >     Load:    @TFrame.Load;
  2124. >     Store:   @TFrame.Store
  2125. >  );
  2126. #  RScrollBar: TStreamRec = (
  2127. #  );
  2128. >  RScrollBar: TStreamRec = (
  2129. >     ObjType: 3;
  2130. >     VmtLink: TypeOf(TScrollBar);
  2131. >     Load:    @TScrollBar.Load;
  2132. >     Store:   @TScrollBar.Store
  2133. >  );
  2134. #  RScroller: TStreamRec = (
  2135. #  );
  2136. >  RScroller: TStreamRec = (
  2137. >     ObjType: 4;
  2138. >     VmtLink: TypeOf(TScroller);
  2139. >     Load:    @TScroller.Load;
  2140. >     Store:   @TScroller.Store
  2141. >  );
  2142. #  RListViewer: TStreamRec = (
  2143. #  );
  2144. >  RListViewer: TStreamRec = (
  2145. >     ObjType: 5;
  2146. >     VmtLink: TypeOf(TListViewer);
  2147. >     Load:    @TListViewer.Load;
  2148. >     Store:   @TLIstViewer.Store
  2149. >  );
  2150. #  RGroup: TStreamRec = (
  2151. #  );
  2152. >  RGroup: TStreamRec = (
  2153. >     ObjType: 6;
  2154. >     VmtLink: TypeOf(TGroup);
  2155. >     Load:    @TGroup.Load;
  2156. >     Store:   @TGroup.Store
  2157. >  );
  2158. #  RWindow: TStreamRec = (
  2159. #  );
  2160. >  RWindow: TStreamRec = (
  2161. >     ObjType: 7;
  2162. >     VmtLink: TypeOf(TWindow);
  2163. >     Load:    @TWindow.Load;
  2164. >     Store:   @TWindow.Store
  2165. >  );
  2166. #procedure MapColor; near; assembler;
  2167. #end;
  2168. >procedure MapColor(SelfPtr:PView;VAR al:BYTE);
  2169. >VAR Palette:PPalette;
  2170. >    Owner:PView;
  2171. >label l,err,l1;
  2172. >begin
  2173. >     if al=0 then
  2174. >     begin
  2175. >err:
  2176. >          al:=ErrorAttr;
  2177. >          exit;
  2178. >     end;
  2179. >
  2180. >l:
  2181. >     Palette:=SelfPtr^.GetPalette;
  2182. >     if Palette=nil then
  2183. >     begin
  2184. >l1:
  2185. >          Owner:=SelfPtr^.Owner;
  2186. >          if Owner<>nil then
  2187. >          begin
  2188. >               SelfPtr:=Owner;
  2189. >               goto l;
  2190. >          end
  2191. >          else exit;
  2192. >     end;
  2193. >
  2194. >     if al>ord(Palette^[0]) then goto err;
  2195. >
  2196. >     asm
  2197. >        MOV EDI,$al
  2198. >        MOV AL,[EDI]
  2199. >        MOV EBX,$Palette
  2200. >        XLAT
  2201. >        MOV [EDI],AL
  2202. >     end;
  2203. >
  2204. >     if al=0 then goto err;
  2205. >     goto l1;
  2206. >end;
  2207. #procedure MapCPair; near; assembler;
  2208. #end;
  2209. >procedure MapCPair(SelfPtr:PView;VAR AX:WORD);
  2210. >begin
  2211. >     asm
  2212. >        MOV EDI,$AX
  2213. >        MOV AX,[EDI]
  2214. >        TEST AH,AH
  2215. >        JZ  !l1
  2216. >        XCHG AL,AH
  2217. >        MOV [EDI],AX
  2218. >        PUSHL $SelfPtr
  2219. >        PUSH EDI
  2220. >        CALLN32 Views.MapColor
  2221. >        MOV EDI,$AX
  2222. >        MOV AX,[EDI]
  2223. >        XCHG AL,AH
  2224. >        MOV [EDI],AX
  2225. >!l1:
  2226. >        PUSHL $SelfPtr
  2227. >        PUSH EDI
  2228. >        CALLN32 Views.MapColor
  2229. >     end;
  2230. >end;
  2231. #procedure WriteView; near; assembler;
  2232. #end;
  2233. >
  2234. >var Help30Addr:POINTER;
  2235. >    Help20Addr:POINTER;
  2236. >    Help50Addr:POINTER;
  2237. >
  2238. >
  2239. >ASSEMBLER
  2240. >
  2241. >
  2242. >Views.WriteView PROC NEAR32
  2243. >$SELF    EQU [EBP+8]
  2244. >$Target  EQU [EBP-8]
  2245. >$Buffer  EQU [EBP-12]
  2246. >$BufOfs  EQU [EBP-16]
  2247. >        MOV    $BufOfs,EBX
  2248. >        MOV    $Buffer,EDI
  2249. >        MOV    EDI,*!Help30
  2250. >        MOV    Views.Help30Addr,EDI
  2251. >        MOV    EDI,*!Help20
  2252. >        MOV    Views.Help20Addr,EDI
  2253. >        MOV    EDI,*!Help50
  2254. >        MOV    Views.Help50Addr,EDI
  2255. >        ADD    CX,BX
  2256. >        XOR    EDX,EDX
  2257. >        MOV    EDI,$Self
  2258. >        OR     AX,AX
  2259. >        JL     !l3_1
  2260. >        CMP    AX,[EDI].TView.Size.Y
  2261. >        JGE    !l3_1
  2262. >        OR     BX,BX
  2263. >        JGE    !l1_1
  2264. >        XOR    EBX,EBX
  2265. >!l1_1:
  2266. >        CMP    CX,[EDI].TView.Size.X
  2267. >        JLE    !l2_1
  2268. >        MOVZXW ECX,[EDI].TView.Size.X
  2269. >!l2_1:
  2270. >        CMP    BX,CX
  2271. >        JL     !l10_1
  2272. >!l3_1:
  2273. >        RETN32
  2274. >!l10_1:
  2275. >        TESTW  [EDI].TView.State,sfVisible
  2276. >        JZ     !l3_1
  2277. >        CMPD   [EDI].TView.Owner,0
  2278. >        JZ     !l3_1
  2279. >        MOV    $Target,EDI
  2280. >        ADD    AX,[EDI].TView.Origin.Y
  2281. >        MOVSXW ESI,[EDI].TView.Origin.X
  2282. >        ADD    BX,SI
  2283. >        ADD    CX,SI
  2284. >        ADD    $BufOfs,ESI
  2285. >        MOV    EDI,[EDI].TView.Owner
  2286. >        CMP    AX,[EDI].TGroup.Clip.A.Y
  2287. >        JL     !l3_1
  2288. >        CMP    AX,[EDI].TGroup.Clip.B.Y
  2289. >        JGE    !l3_1
  2290. >        CMP    BX,[EDI].TGroup.Clip.A.X
  2291. >        JGE    !l11_1
  2292. >        MOV    BX,[EDI].TGroup.Clip.A.X
  2293. >!l11_1:
  2294. >        CMP    CX,[EDI].TGroup.Clip.B.X
  2295. >        JLE    !l12_1
  2296. >        MOV    CX,[EDI].TGroup.Clip.B.X
  2297. >!l12_1:
  2298. >        CMP    BX,CX
  2299. >        JGE    !l3_1
  2300. >        MOV    EDI,[EDI].TGroup.Last
  2301. >        JMP !l20_1
  2302. >!l23_1:
  2303. >        MOV    SI,[EDI].TView.Origin.X
  2304. >        CMP    BX,SI
  2305. >        JGE    !l24_1
  2306. >        CMP    CX,SI
  2307. >        JLE    !l20_1
  2308. >        CALLN32 [Views.Help30Addr]
  2309. >!l24_1:
  2310. >        ADD    SI,[EDI].TView.Size.X
  2311. >        MOVZX  ESI,SI
  2312. >        CMP    BX,SI
  2313. >        JGE    !l25_1
  2314. >        CMP    CX,SI
  2315. >        JLE    !l31_1
  2316. >        MOV    EBX,ESI
  2317. >!l25_1:
  2318. >        TESTW  [EDI].TView.State,sfShadow
  2319. >        JE     !l20_1
  2320. >        PUSH   SI
  2321. >        MOV    SI,[EDI].TView.Origin.Y
  2322. >        ADD    SI,Views.ShadowSize+6  //Y
  2323. >        CMP    AX,SI
  2324. >        POP    SI
  2325. >        JL     !l27_1
  2326. >        ADD    SI,Views.ShadowSize+4  //X
  2327. >!l26_1:
  2328. >        CMP    BX,SI
  2329. >        JGE    !l27_1
  2330. >        INC    EDX
  2331. >        CMP    CX,SI
  2332. >        JLE    !l27_1
  2333. >        CALLN32 [Views.Help30Addr]
  2334. >        DEC    EDX
  2335. >!l27_1:
  2336. >        JMP    !l20_1
  2337. >!l40_1:
  2338. >        MOV    EDI,[EDI].TView.Owner
  2339. >        MOV    ESI,[EDI].TGroup.Buffer
  2340. >        TEST   ESI,ESI
  2341. >        JZ     !l44_1
  2342. >        CMP    ESI,Drivers.ScreenBuffer
  2343. >        JNE    !l43_1
  2344. >        PUSHAD
  2345. >        CALLN32 Drivers.UpdateMouse
  2346. >        POPAD
  2347. >        CMP    AX,Drivers.MouseWhere+2
  2348. >        JNE    !l43_1
  2349. >        CMP    BX,Drivers.MouseWhere
  2350. >        JA     !l43_1
  2351. >        CMP    CX,Drivers.MouseWhere
  2352. >        JBE    !l43_1
  2353. >        CALLN32 [Views.Help50Addr]
  2354. >        JMP    !l44_1
  2355. >!l43_1:
  2356. >        CALLN32 [Views.Help50Addr]
  2357. >!l44_1:
  2358. >        CMPB    [EDI].TGroup.LockFlag,0
  2359. >        JNE     !l31_1
  2360. >        JMP     !l10_1
  2361. >!Help20:
  2362. >!l20_1:
  2363. >        MOV    EDI,[EDI].TView.Next
  2364. >        CMP    EDI,$Target
  2365. >        JE     !l40_1
  2366. >        TESTW  [EDI].TView.State,sfVisible
  2367. >        JZ     !l20_1
  2368. >        MOV    SI,[EDI].TView.Origin.Y
  2369. >        CMP    AX,SI
  2370. >        JL     !l20_1
  2371. >        ADD    SI,[EDI].TView.Size.Y
  2372. >        CMP    AX,SI
  2373. >        JL     !l23_1
  2374. >        TESTW  [EDI].TView.State,sfShadow
  2375. >        JZ     !l20_1
  2376. >        ADD    SI,Views.ShadowSize+6  //Y
  2377. >        CMP    AX,SI
  2378. >        JGE    !l20_1
  2379. >        MOV    SI,[EDI].TView.Origin.X
  2380. >        ADD    SI,Views.ShadowSize+4  //X
  2381. >        CMP    BX,SI
  2382. >        JGE    !l22_1
  2383. >        CMP    CX,SI
  2384. >        JLE    !l20_1
  2385. >        CALLN32 [Views.Help30Addr]
  2386. >!l22_1:
  2387. >        ADD    SI,[EDI].TView.Size.X
  2388. >        JMP    !l26_1
  2389. >!Help30:
  2390. >!l30_1:
  2391. >        PUSHL   $Target
  2392. >        PUSHL   $BufOfs
  2393. >        PUSHAD
  2394. >        MOV     ECX,ESI
  2395. >        CALLN32 [Views.Help20Addr]
  2396. >        POPAD
  2397. >        POPD    $BufOfs
  2398. >        POPD    $Target
  2399. >        MOV     EBX,ESI
  2400. >!l31_1:
  2401. >        RETN32
  2402. >!Help50:
  2403. >!l50_1:
  2404. >        PUSH    EDI
  2405. >        PUSH    ECX
  2406. >        PUSH    EBX
  2407. >        PUSH    EAX
  2408. >        MULB    [EDI].TView.Size.X
  2409. >        ADD     AX,BX
  2410. >        MOVSX   EAX,AX
  2411. >        LEA     EDI,[ESI+EAX*2]
  2412. >        XOR     AL,AL
  2413. >        MOV     AH,Views.ShadowAttr
  2414. >        MOVSX   EBX,BX
  2415. >        MOVSX   ECX,CX
  2416. >        SUB     ECX,EBX
  2417. >        XCHG    ESI,EBX
  2418. >        SUB     ESI,$BufOfs
  2419. >        SHL     ESI,1
  2420. >        ADD     ESI,$Buffer
  2421. >        PUSH    EDI
  2422. >        PUSH    ECX
  2423. >        CLD
  2424. >        TEST    EDX,EDX
  2425. >        JNZ     !l52_1
  2426. >        SHR     ECX,1
  2427. >        REP
  2428. >        MOVSD
  2429. >        ADC     ECX,ECX
  2430. >        REP
  2431. >        MOVSW
  2432. >        JMP     !l70_1
  2433. >!l52_1:
  2434. >        LODSB
  2435. >        INC     ESI
  2436. >        STOSW
  2437. >        LOOP    !l52_1
  2438. >!l70_1:
  2439. >        POP     ECX
  2440. >        POP     EDI
  2441. >        MOV     EAX,Drivers.ScreenBuffer
  2442. >        CMP     EBX,EAX
  2443. >        JNE     !l54_1
  2444. >        SHL     ECX,1
  2445. >        SUB     EDI,EAX
  2446. >        PUSHAD
  2447. >        CALLN32 Drivers.HideMouse
  2448. >        POPAD
  2449. >        PUSHL   0        //Handle
  2450. >        PUSH    ECX      //Len
  2451. >        PUSH    EDI      //Ofs
  2452. >        MOV     AL,3
  2453. >        CALLDLL KbdVio32,50   //VioShowBuf
  2454. >        ADD     ESP,12
  2455. >        PUSHAD
  2456. >        CALLN32 Drivers.ShowMouse
  2457. >        POPAD
  2458. >!l54_1:
  2459. >        POP     EAX
  2460. >        POP     EBX
  2461. >        POP     ECX
  2462. >        POP     EDI
  2463. >        RETN32
  2464. >Views.WriteView ENDP
  2465. >
  2466. >end; {assembler}
  2467. #procedure TView.EndModal(Command: Word);
  2468. #end;
  2469. >procedure TView.EndModal(Command: Word);
  2470. >var
  2471. >  P: PView;
  2472. >begin
  2473. >  P := TopView;
  2474. >  if P <> nil then P^.EndModal(Command);
  2475. >end;
  2476. #procedure TView.GetBounds(var Bounds: TRect); assembler;
  2477. #end;
  2478. >procedure TView.GetBounds(var Bounds: TRect);
  2479. >begin
  2480. >     asm
  2481. >        MOV    ESI,$Self
  2482. >        LEA    ESI,[ESI].TView.Origin.X
  2483. >        MOV    EDI,$Bounds
  2484. >        LEA    EDI,[EDI].TRect.A.X
  2485. >
  2486. >        //Process TRect.A
  2487. >        CLD
  2488. >        LODSW
  2489. >        MOV    CX,AX
  2490. >        STOSW
  2491. >        LODSW
  2492. >        MOV    DX,AX
  2493. >        STOSW
  2494. >
  2495. >        MOV    ESI,$Self
  2496. >        LEA    ESI,[ESI].TView.Size.X
  2497. >        MOV    EDI,$Bounds
  2498. >        LEA    EDI,[EDI].TRect.B.X
  2499. >
  2500. >        //Process TRect.B
  2501. >        LODSW
  2502. >        ADD    AX,CX
  2503. >        STOSW
  2504. >        LODSW
  2505. >        ADD    AX,DX
  2506. >        STOSW
  2507. >     end;
  2508. >end;
  2509. #function TView.Exposed: Boolean; assembler;
  2510. #end;
  2511. >
  2512. >var Help_11Addr:POINTER;
  2513. >    Help_20Addr:POINTER;
  2514. >    ExposedTarget:POINTER;
  2515. >
  2516. >function TView.Exposed: Boolean;
  2517. >begin
  2518. >     asm
  2519. >        MOV     EAX,*!l11_2
  2520. >        MOV     Views.Help_11Addr,EAX
  2521. >        MOV     EAX,*!l20_2
  2522. >        MOV     Views.Help_20Addr,EAX
  2523. >        MOV     EDI,$Self
  2524. >        TESTW   [EDI].TView.State,sfExposed
  2525. >        JE      !l2_2
  2526. >        XOR     AX,AX
  2527. >        CMP     AX,[EDI].TView.Size.X
  2528. >        JGE     !l2_2
  2529. >        CMP     AX,[EDI].TView.Size.Y
  2530. >        JGE     !l2_2
  2531. >!l1_2:
  2532. >        XOR     BX,BX
  2533. >        MOV     CX,[EDI].TView.Size.X
  2534. >        PUSH    AX
  2535. >        CALLN32 [Views.Help_11Addr]
  2536. >        POP     AX
  2537. >        JNC     !l3_2
  2538. >        MOV     EDI,$Self
  2539. >        INC     AX
  2540. >        CMP     AX,[EDI].TView.Size.Y
  2541. >        JL      !l1_2
  2542. >!l2_2:
  2543. >        MOV     AL,0
  2544. >        JMP     !l30_2
  2545. >!l3_2:
  2546. >        MOV     AL,1
  2547. >        JMP     !l30_2
  2548. >!l8_2:
  2549. >        STC
  2550. >!l9_2:
  2551. >        RETN32
  2552. >!l10_2:
  2553. >        MOV     EDI,[EDI].TView.Owner
  2554. >        CMPD    [EDI].TGroup.Buffer,0
  2555. >        JNE     !l9_2
  2556. >!l11_2:
  2557. >        MOV     Views.ExposedTarget,EDI
  2558. >        ADD     AX,[EDI].TView.Origin.Y
  2559. >        MOV     SI,[EDI].TView.Origin.X
  2560. >        ADD     BX,SI
  2561. >        ADD     CX,SI
  2562. >        MOV     EDI,[EDI].TView.Owner
  2563. >        TEST    EDI,EDI
  2564. >        JZ      !l9_2
  2565. >        CMP     AX,[EDI].TGroup.Clip.A.Y
  2566. >        JL      !l8_2
  2567. >        CMP     AX,[EDI].TGroup.Clip.B.Y
  2568. >        JGE     !l8_2
  2569. >        CMP     BX,[EDI].TGroup.Clip.A.X
  2570. >        JGE     !l12_2
  2571. >        MOV     BX,[EDI].TGroup.Clip.A.X
  2572. >!l12_2:
  2573. >        CMP     CX,[EDI].TGroup.Clip.B.X
  2574. >        JLE     !l13_2
  2575. >        MOV     CX,[EDI].TGroup.Clip.B.X
  2576. >!l13_2:
  2577. >        CMP     BX,CX
  2578. >        JGE     !l8_2
  2579. >        MOV     EDI,[EDI].TGroup.Last
  2580. >!l20_2:
  2581. >        MOV     EDI,[EDI].TView.Next
  2582. >        CMP     EDI,Views.ExposedTarget
  2583. >        JE      !l10_2
  2584. >        TESTW   [EDI].TView.State,sfVisible
  2585. >        JZ      !l20_2
  2586. >        MOV     SI,[EDI].TView.Origin.Y
  2587. >        CMP     AX,SI
  2588. >        JL      !l20_2
  2589. >        ADD     SI,[EDI].TView.Size.Y
  2590. >        CMP     AX,SI
  2591. >        JGE     !l20_2
  2592. >        MOV     SI,[EDI].TView.Origin.X
  2593. >        CMP     BX,SI
  2594. >        JL      !l22_2
  2595. >        ADD     SI,[EDI].TView.Size.X
  2596. >        CMP     BX,SI
  2597. >        JGE     !l20_2
  2598. >        MOV     BX,SI
  2599. >        CMP     BX,CX
  2600. >        JL      !l20_2
  2601. >        STC
  2602. >        RETN32
  2603. >!l22_2:
  2604. >        CMP     CX,SI
  2605. >        JLE     !l20_2
  2606. >        ADD     SI,[EDI].TView.Size.X
  2607. >        CMP     CX,SI
  2608. >        JG      !l23_2
  2609. >        MOV     CX,[EDI].TView.Origin.X
  2610. >        JMP     !l20_2
  2611. >!l23_2:
  2612. >        PUSHL   Views.ExposedTarget
  2613. >        PUSH    EDI
  2614. >        PUSH    ESI
  2615. >        PUSH    ECX
  2616. >        PUSH    EAX
  2617. >        MOV     CX,[EDI].TView.Origin.X
  2618. >        CALLN32 [Views.Help_20Addr]
  2619. >        POP     EAX
  2620. >        POP     ECX
  2621. >        POP     EBX
  2622. >        POP     EDI
  2623. >        POPD    Views.ExposedTarget
  2624. >        JC      !l20_2
  2625. >        RETN32
  2626. >!l30_2:
  2627. >        LEAVE
  2628. >        RETN32 4
  2629. >    end;
  2630. >end;
  2631. #function TView.GetColor(Color: Word): Word; assembler;
  2632. #end;
  2633. >function TView.GetColor(Color: Word): Word;
  2634. >begin
  2635. >     MapCPair(@SELF,Color);
  2636. >     GetColor:=Color;
  2637. >end;
  2638. #procedure TView.GetExtent(var Extent: TRect); assembler;
  2639. #end;
  2640. >procedure TView.GetExtent(var Extent: TRect);
  2641. >begin
  2642. >     asm
  2643. >        MOV     ESI,$Self
  2644. >        LEA     ESI,[ESI].TView.Size.X
  2645. >        MOV     EDI,$Extent
  2646. >        LEA     EDI,[EDI].TRect.A.X
  2647. >        CLD
  2648. >        XOR     AX,AX
  2649. >        STOSW
  2650. >        STOSW
  2651. >        MOV     EDI,$Extent
  2652. >        LEA     EDI,[EDI].TRect.B.X
  2653. >        MOVSW
  2654. >        MOVSW
  2655. >     end;
  2656. >end;
  2657. #procedure TView.MakeGlobal(Source: TPoint; var Dest: TPoint); assembler;
  2658. #end;
  2659. >procedure TView.MakeGlobal(Source: TPoint; var Dest: TPoint);
  2660. >begin
  2661. >     asm
  2662. >        MOV     EDI,$Self
  2663. >        XOR     AX,AX
  2664. >        MOV     DX,AX
  2665. >!l1_3:
  2666. >        ADD     AX,[EDI].TView.Origin.X
  2667. >        ADD     DX,[EDI].TView.Origin.Y
  2668. >        MOV     EDI,[EDI].TView.Owner
  2669. >        OR      EDI,EDI
  2670. >        JNE     !l1_3
  2671. >        LEA     ESI,$Source
  2672. >        LEA     ESI,[ESI].TPoint.X
  2673. >        ADD     AX,[ESI+0] //X
  2674. >        ADD     DX,[ESI+2] //Y
  2675. >        MOV     EDI,$Dest
  2676. >        LEA     EDI,[EDI].TPoint.X
  2677. >        CLD
  2678. >        STOSW
  2679. >        XCHG    AX,DX
  2680. >        STOSW
  2681. >     end;
  2682. >end;
  2683. #procedure TView.MakeLocal(Source: TPoint; var Dest: TPoint); assembler;
  2684. #end;
  2685. >procedure TView.MakeLocal(Source: TPoint; var Dest: TPoint);
  2686. >begin
  2687. >     asm
  2688. >        MOV     EDI,$Self
  2689. >        XOR     AX,AX
  2690. >        MOV     DX,AX
  2691. >!l1_4:
  2692. >        ADD     AX,[EDI].TView.Origin.X
  2693. >        ADD     DX,[EDI].TView.Origin.Y
  2694. >        MOV     EDI,[EDI].TView.Owner
  2695. >        OR      EDI,EDI
  2696. >        JNE     !l1_4
  2697. >        NEG     AX
  2698. >        NEG     DX
  2699. >        LEA     ESI,$Source
  2700. >        LEA     ESI,[ESI].TPoint.X
  2701. >        ADD     AX,[ESI+0]   //Source.X
  2702. >        ADD     DX,[ESI+2]   //Source.Y
  2703. >        MOV     EDI,$Dest
  2704. >        LEA     EDI,[EDI].TPoint.X
  2705. >        CLD
  2706. >        STOSW
  2707. >        XCHG    AX,DX
  2708. >        STOSW
  2709. >     end;
  2710. >end;
  2711. #function TView.Prev: PView; assembler;
  2712. #end;
  2713. >function TView.Prev: PView;
  2714. >begin
  2715. >     asm
  2716. >        MOV     EDI,$Self
  2717. >        MOV     ECX,EDI
  2718. >!l1_5:
  2719. >        MOV     EAX,EDI
  2720. >        MOV     EDI,[EDI].TView.Next
  2721. >        CMP     EDI,ECX
  2722. >        JNE     !l1_5
  2723. >        LEAVE
  2724. >        RETN32  4
  2725. >     end;
  2726. >end;
  2727. #procedure TView.ResetCursor; assembler;
  2728. #end;
  2729. >procedure TView.ResetCursor;
  2730. >var
  2731. >    CursorData: VioCursorInfo;
  2732. >const
  2733. >    Vis=sfVisible+sfCursorVis+sfFocused;
  2734. >begin
  2735. >     asm
  2736. >        MOV     EDI,$Self
  2737. >        MOV     AX,[EDI].TView.State
  2738. >        NOT     AX
  2739. >        TEST    AX,Vis
  2740. >        JNE     !l4_61
  2741. >        MOV     AX,[EDI].TView.Cursor.Y
  2742. >        MOV     DX,[EDI].TView.Cursor.X
  2743. >!l1_6:
  2744. >        TEST    AX,AX
  2745. >        JL      !l4_61
  2746. >        CMP     AX,[EDI].TView.Size.Y
  2747. >        JGE     !l4_61
  2748. >        TEST    DX,DX
  2749. >        JL      !l4_61
  2750. >        CMP     DX,[EDI].TView.Size.X
  2751. >        JGE     !l4_61
  2752. >        ADD     AX,[EDI].TView.Origin.Y
  2753. >        ADD     DX,[EDI].TView.Origin.X
  2754. >        MOV     ECX,EDI
  2755. >        MOV     EDI,[EDI].TView.Owner
  2756. >        TEST    EDI,EDI
  2757. >        JZ      !l4_62
  2758. >        TESTW   [EDI].TView.State,sfVisible
  2759. >        JE      !l4_61
  2760. >        MOV     EDI,[EDI].TGroup.Last
  2761. >!l2_6:
  2762. >        MOV     EDI,[EDI].TView.Next
  2763. >        CMP     ECX,EDI
  2764. >        JNE     !l3_6
  2765. >        MOV     EDI,[EDI].TView.Owner
  2766. >        JMP     !l1_6
  2767. >!l3_6:
  2768. >        TESTW   [EDI].TView.State,sfVisible
  2769. >        JE      !l2_6
  2770. >        MOV     SI,[EDI].TView.Origin.Y
  2771. >        CMP     AX,SI
  2772. >        JL      !l2_6
  2773. >        ADD     SI,[EDI].TView.Size.Y
  2774. >        CMP     AX,SI
  2775. >        JGE     !l2_6
  2776. >        MOV     SI,[EDI].TView.Origin.X
  2777. >        CMP     DX,SI
  2778. >        JL      !l2_6
  2779. >        ADD     SI,[EDI].TView.Size.X
  2780. >        CMP     DX,SI
  2781. >        JGE     !l2_6
  2782. >!l4_61:   //Hide Cursor
  2783. >        MOV     EAX,$ffffffff  //-1
  2784. >        XOR     ECX,ECX
  2785. >        JMP     !l4_6
  2786. >!l4_62:
  2787. >        PUSHL   0       //Handle
  2788. >        MOVZX   EDX,DX
  2789. >        PUSH    EDX     //Column
  2790. >        MOVZX   EAX,AX
  2791. >        PUSH    EAX     //Row
  2792. >        MOV     AL,3
  2793. >        CALLDLL KbdVio32,30  //VioSetCurPos
  2794. >        ADD     ESP,12
  2795. >
  2796. >        XOR     EAX,EAX
  2797. >        MOV     CX,Drivers.CursorLines
  2798. >        MOV     EDI,$Self
  2799. >        TESTW   [EDI].TView.State,sfCursorIns
  2800. >        JZ      !l4_6
  2801. >        MOV     CH,1
  2802. >        TEST    CL,CL
  2803. >        JNE     !l4_6
  2804. >        MOV     CL,7
  2805. >!l4_6:
  2806. >        PUSHL   0   //Handle
  2807. >        LEA     EDI,$CursorData
  2808. >        MOV     [EDI].VioCursorInfo.attr,AX
  2809. >        MOVZX   DX,CH
  2810. >        MOVZX   CX,CL
  2811. >        MOV     [EDI].VioCursorInfo.yStart,DX
  2812. >        MOV     [EDI].VioCursorInfo.cEnd,CX
  2813. >        MOVW    [EDI].VioCursorInfo.cx,1
  2814. >        PUSH    EDI
  2815. >        MOV AL,2
  2816. >        CALLDLL KbdVio32,32  //VioSetCurType
  2817. >        ADD     ESP,8
  2818. >     end;
  2819. >end;
  2820. #procedure TView.Select;
  2821. #end;
  2822. >procedure TView.Select;
  2823. >begin
  2824. >  if Options and ofSelectable <> 0 then
  2825. >    if Options and ofTopSelect <> 0 then MakeFirst else
  2826. >      if Owner <> nil then Owner^.SetCurrent(POINTER(SELF), NormalSelect);
  2827. >end;
  2828. #procedure TView.SetBounds(var Bounds: TRect); assembler;
  2829. #end;
  2830. >procedure TView.SetBounds(var Bounds: TRect);
  2831. >begin
  2832. >     asm
  2833. >        MOV     EDI,$Self
  2834. >        MOV     ESI,$Bounds
  2835. >        MOV     AX,[ESI].TRect.A.X
  2836. >        MOV     [EDI].TView.Origin.X,AX
  2837. >        MOV     AX,[ESI].TRect.A.Y
  2838. >        MOV     [EDI].TView.Origin.Y,AX
  2839. >        MOV     AX,[ESI].TRect.B.X
  2840. >        SUB     AX,[ESI].TRect.A.X
  2841. >        MOV     [EDI].TView.Size.X,AX
  2842. >        MOV     AX,[ESI].TRect.B.Y
  2843. >        SUB     AX,[ESI].TRect.A.Y
  2844. >        MOV     [EDI].TView.Size.Y,AX
  2845. >     end;
  2846. >end;
  2847. #procedure TView.SizeLimits(var Min, Max: TPoint);
  2848. #end;
  2849. >procedure TView.SizeLimits(var Min, Max: TPoint);
  2850. >begin
  2851. >  Longint(Min.X) := 0;
  2852. >  if Owner <> nil then
  2853. >    Max := Owner^.Size else
  2854. >    Longint(Max.X) := $7FFF7FFF;
  2855. >end;
  2856. #procedure TView.WriteBuf(X, Y, W, H: Integer; var Buf); assembler;
  2857. #end;
  2858. >procedure TView.WriteBuf(X, Y, W, H: Integer; var Buf);
  2859. >var
  2860. >  Target: Pointer; {Variables used by WriteView}
  2861. >  Buffer: Pointer;
  2862. >  Offset: LongWord;
  2863. >begin
  2864. >     asm
  2865. >        CMPW    $H,0
  2866. >        JLE     !l2_7
  2867. >!l1_7:
  2868. >        MOVZXW  EAX,$Y
  2869. >        MOVZXW  EBX,$X
  2870. >        MOVZXW  ECX,$W
  2871. >        MOV     EDI,$Buf
  2872. >        CALLN32 Views.WriteView
  2873. >        MOVZXW  EAX,$W
  2874. >        SHL     EAX,1
  2875. >        ADD     $Buf,EAX
  2876. >        INCW    $Y
  2877. >        DECW    $H
  2878. >        JNE     !l1_7
  2879. >!l2_7:
  2880. >     end;
  2881. >end;
  2882. #procedure TView.WriteChar(X, Y: Integer; C: Char; Color: Byte;
  2883. #end;
  2884. >procedure TView.WriteChar(X, Y: Integer; Ch: Char; Color: Byte;
  2885. >                          Count: Integer);
  2886. >var
  2887. >  Target: Pointer; {Variables used by WriteView}
  2888. >  Buffer: Pointer;
  2889. >  Offset: LongWord;
  2890. >begin
  2891. >     MapColor(@SELF,Color);
  2892. >     asm
  2893. >        MOV     AH,$Color
  2894. >        MOV     AL,$Ch
  2895. >        MOV     CX,$Count
  2896. >        OR      CX,CX
  2897. >        JLE     !l2_8
  2898. >        CMP     CX,256
  2899. >        JLE     !l1_8
  2900. >        MOV     CX,256
  2901. >!l1_8:
  2902. >        MOVZX   ECX,CX
  2903. >        MOV     EDI,ECX
  2904. >        SHL     EDI,1
  2905. >        SUB     ESP,EDI
  2906. >        MOV     EDI,ESP
  2907. >        MOV     DX,CX
  2908. >        CLD
  2909. >        REP
  2910. >        STOSW
  2911. >        MOVZX   ECX,DX
  2912. >        MOV     EDI,ESP
  2913. >        MOVZXW  EAX,$Y
  2914. >        MOVZXW  EBX,$X
  2915. >        CALLN32 Views.WriteView
  2916. >!l2_8:
  2917. >     end;
  2918. >end;
  2919. #procedure TView.WriteLine(X, Y, W, H: Integer; var Buf); assembler;
  2920. #end;
  2921. >procedure TView.WriteLine(X, Y, W, H: Integer; var Buf);
  2922. >var
  2923. >  Target: Pointer; {Variables used by WriteView}
  2924. >  Buffer: Pointer;
  2925. >  Offset: LongWord;
  2926. >begin
  2927. >     asm
  2928. >        CMPW    $H,0
  2929. >        JLE     !l2_9
  2930. >!l1_9:
  2931. >        MOVZXW  EAX,$Y
  2932. >        MOVZXW  EBX,$X
  2933. >        MOVZXW  ECX,$W
  2934. >        MOV     EDI,$Buf
  2935. >        CALLN32 Views.WriteView
  2936. >        INCW    $Y
  2937. >        DECW    $H
  2938. >        JNE     !l1_9
  2939. >!l2_9:
  2940. >     end;
  2941. >end;
  2942. #procedure TView.WriteStr(X, Y: Integer; Str: String; Color: Byte); assembler;
  2943. #end;
  2944. >procedure TView.WriteStr(X, Y: Integer; Str: String; Color: Byte);
  2945. >var
  2946. >  Target: Pointer; {Variables used by WriteView}
  2947. >  Buffer: Pointer;
  2948. >  Offset: LongWord;
  2949. >begin
  2950. >     MapColor(@SELF,Color);
  2951. >     asm
  2952. >        MOV     AH,$Color
  2953. >        LEA     ESI,$Str
  2954. >        CLD
  2955. >        LODSB
  2956. >        MOV     CL,AL
  2957. >        XOR     CH,CH
  2958. >        CMP     CX,0
  2959. >        JE      !l3_10
  2960. >        MOVZX   ECX,CX
  2961. >        MOV     EDI,ECX
  2962. >        SHL     EDI,1
  2963. >        SUB     ESP,EDI
  2964. >        MOV     EDI,ESP
  2965. >        MOV     DX,CX
  2966. >!l1_10:
  2967. >        LODSB
  2968. >        STOSW
  2969. >        LOOP    !l1_10
  2970. >        MOVZX   ECX,DX
  2971. >        MOV     EDI,ESP
  2972. >        MOVZXW  EAX,$Y
  2973. >        MOVZXW  EBX,$X
  2974. >        CALLN32 Views.WriteView
  2975. >!l3_10:
  2976. >     end;
  2977. >end;
  2978. #procedure TFrame.FrameLine(var FrameBuf; Y, N: Integer;
  2979. #end;
  2980. >const
  2981. >  InitFrame: array[0..17] of Byte =
  2982. >    ($06, $0A, $0C, $05, $00, $05, $03, $0A, $09,
  2983. >     $16, $1A, $1C, $15, $00, $15, $13, $1A, $19);
  2984. >  FrameChars: array[0..31] of Char =
  2985. >    '   └ │┌├ ┘─┴┐┤┬┼   ╚ ║╔╟ ╝═╧╗╢╤ ';
  2986. >procedure TFrame.FrameLine(var FrameBuf; Y, N: Integer;
  2987. >                           Color: Byte);
  2988. >var
  2989. >  FrameMask: array[0..MaxViewWidth-1] of Byte;
  2990. >begin
  2991. >     asm
  2992. >        MOV     EBX,$Self
  2993. >        MOV     DX,[EBX].TFrame.Size.X
  2994. >        MOV     CX,DX
  2995. >        DEC     CX
  2996. >        DEC     CX
  2997. >        MOV     ESI,OFFSET(Views.InitFrame)
  2998. >        MOVZXW  EAX,$N
  2999. >        ADD     ESI,EAX
  3000. >        LEA     EDI,$FrameMask
  3001. >        MOVZX   ECX,CX
  3002. >        CLD
  3003. >        MOVSB
  3004. >        LODSB
  3005. >        REP
  3006. >        STOSB
  3007. >        MOVSB
  3008. >        MOV     EBX,$Self
  3009. >        MOV     EBX,[EBX].TFrame.Owner
  3010. >        MOV     EBX,[EBX].TGroup.Last
  3011. >        DEC     DX
  3012. >!l1_11:
  3013. >        MOV     EBX,[EBX].TView.Next
  3014. >        CMP     EBX,$Self
  3015. >        JE      !l10_11
  3016. >!l2_11:
  3017. >        TESTW   [EBX].TView.Options,ofFramed
  3018. >        JE      !l1_11
  3019. >        TESTW   [EBX].TView.State,sfVisible
  3020. >        JE      !l1_11
  3021. >        MOV     AX,$Y
  3022. >        SUB     AX,[EBX].TView.Origin.Y
  3023. >        JL      !l3_11
  3024. >        CMP     AX,[EBX].TView.Size.Y
  3025. >        JG      !l1_11
  3026. >        MOV     AX,$0005
  3027. >        JL      !l4_11
  3028. >        MOV     AX,$0A03
  3029. >        JMP     !l4_11
  3030. >!l3_11:
  3031. >        INC     AX
  3032. >        JNE     !l1_11
  3033. >        MOV     AX,$0A06
  3034. >!l4_11:
  3035. >        MOV     SI,[EBX].TView.Origin.X
  3036. >        MOV     DI,[EBX].TView.Size.X
  3037. >        ADD     DI,SI
  3038. >        CMP     SI,1
  3039. >        JG      !l5_11
  3040. >        MOV     SI,1
  3041. >!l5_11:
  3042. >        CMP     DI,DX
  3043. >        JL      !l6_11
  3044. >        MOV     DI,DX
  3045. >!l6_11:
  3046. >        CMP     SI,DI
  3047. >        JGE     !l1_11
  3048. >        PUSH    EDI
  3049. >        LEA     EDI,$FrameMask
  3050. >        MOVZX   ESI,SI
  3051. >        ADD     EDI,ESI
  3052. >        OR      [EDI-1],AL
  3053. >        POP     EDI
  3054. >        XOR     AL,AH
  3055. >        PUSH    ESI
  3056. >        LEA     ESI,$FrameMask
  3057. >        MOVZX   EDI,DI
  3058. >        ADD     ESI,EDI
  3059. >        OR      [ESI],AL
  3060. >        POP     ESI
  3061. >        OR      AH,AH
  3062. >        JE      !l1_11
  3063. >        MOV     CX,DI
  3064. >        SUB     CX,SI
  3065. >        MOVZX   ECX,CX
  3066. >!l8_11:
  3067. >        PUSH    EDI
  3068. >        LEA     EDI,$FrameMask
  3069. >        MOVZX   ESI,SI
  3070. >        ADD     EDI,ESI
  3071. >        OR      [EDI],AH
  3072. >        POP     EDI
  3073. >        INC     SI
  3074. >        LOOP    !l8_11
  3075. >        JMP     !l1_11
  3076. >!l10_11:
  3077. >        INC     DX
  3078. >        MOV     AH,$Color
  3079. >        MOV     EBX,OFFSET(Views.FrameChars)
  3080. >        MOV     CX,DX
  3081. >        LEA     ESI,$FrameMask
  3082. >        MOV     EDI,$FrameBuf
  3083. >        MOVZX   ECX,CX
  3084. >!l11_11:
  3085. >        LODSB
  3086. >        XLAT
  3087. >        STOSW
  3088. >        LOOP    !l11_11
  3089. >     end;
  3090. >end;
  3091. #      else if Longint(Owner^.Size) = Longint(Max) then
  3092. >      else if Longint(Owner^.Size.X) = Longint(Max.X) then
  3093. #function TScrollBar.GetPos: Integer;
  3094. #end;
  3095. >function TScrollBar.GetPos: Integer;
  3096. >var
  3097. >  R: Integer;
  3098. >begin
  3099. >  R := Max - Min;
  3100. >  if R = 0 then
  3101. >    GetPos := 1 else
  3102. >    GetPos := ((Value - Min) * (GetSize - 3) + R shr 1) div R + 1;
  3103. >end;
  3104. #            SetValue(LongDiv(LongMul(P - 1, Max - Min) + S shr 1, S) + Min);
  3105. >            SetValue(((P - 1) * (Max - Min) + S shr 1) div S + Min);
  3106. #constructor TGroup.Load(var S: TStream);
  3107. #end;
  3108. >constructor TGroup.Load(var S: TStream);
  3109. >var
  3110. >  FixupSave: PFixupList;
  3111. >  Count, I: Integer;
  3112. >  P, Q: ^Pointer;
  3113. >  V: PView;
  3114. >  OwnerSave: PGroup;
  3115. >begin
  3116. >  TView.Load(S);
  3117. >  GetExtent(Clip);
  3118. >  OwnerSave := OwnerGroup;
  3119. >  OwnerGroup := @Self;
  3120. >  FixupSave := FixupList;
  3121. >  S.Read(Count, SizeOf(Word));
  3122. >  asm
  3123. >        MOVZXW  ECX,$Count
  3124. >        SHL     ECX,1
  3125. >        SHL     ECX,1
  3126. >        SUB     ESP,ECX
  3127. >        MOV     Views.FixupList,ESP
  3128. >        MOV     EDI,ESP
  3129. >        XOR     AL,AL
  3130. >        CLD
  3131. >        REP
  3132. >        STOSB
  3133. >  end;
  3134. >  for I := 1 to Count do
  3135. >  begin
  3136. >    V := PView(S.Get);
  3137. >    if V <> nil then InsertView(V, nil);
  3138. >  end;
  3139. >  V := Last;
  3140. >  for I := 1 to Count do
  3141. >  begin
  3142. >    V := V^.Next;
  3143. >    P := FixupList^[I];
  3144. >    while P <> nil do
  3145. >    begin
  3146. >      Q := P;
  3147. >      P := P^;
  3148. >      Q^ := V;
  3149. >    end;
  3150. >  end;
  3151. >  OwnerGroup := OwnerSave;
  3152. >  FixupList := FixupSave;
  3153. >  GetSubViewPtr(S, V);
  3154. >  SetCurrent(V, NormalSelect);
  3155. >  if OwnerGroup = nil then Awaken;
  3156. >end;
  3157. #function TGroup.At(Index: Integer): PView; assembler;
  3158. #end;
  3159. >function TGroup.At(Index: Integer): PView;
  3160. >begin
  3161. >     asm
  3162. >        MOV     EDI,$Self
  3163. >        MOV     EDI,[EDI].TGroup.Last
  3164. >        MOVZXW  ECX,$Index
  3165. >!l1_12:
  3166. >        MOV     EDI,[EDI].TView.Next
  3167. >        LOOP    !l1_12
  3168. >        MOV     EAX,EDI
  3169. >        MOV     $!FuncResult,EAX
  3170. >     end;
  3171. >end;
  3172. #procedure DoCalcChange(P: PView); far;
  3173. #end;
  3174. >procedure DoCalcChange(P: PView);
  3175. >var
  3176. >  R: TRect;
  3177. >begin
  3178. >  P^.CalcBounds(R, D);
  3179. >  P^.ChangeBounds(R);
  3180. >end;
  3181. #begin
  3182. #end;
  3183. >begin
  3184. >  D.X := Bounds.B.X - Bounds.A.X - Size.X;
  3185. >  D.Y := Bounds.B.Y - Bounds.A.Y - Size.Y;
  3186. >  if Longint(D.X) = 0 then
  3187. >  begin
  3188. >    SetBounds(Bounds);
  3189. >    DrawView;
  3190. >  end else
  3191. >  begin
  3192. >    FreeBuffer;
  3193. >    SetBounds(Bounds);
  3194. >    GetExtent(Clip);
  3195. >    GetBuffer;
  3196. >    Lock;
  3197. >    ForEach(@DoCalcChange);
  3198. >    Unlock;
  3199. >  end;
  3200. >end;
  3201. #function TGroup.FirstThat(P: Pointer): PView; assembler;
  3202. #end;
  3203. >function TGroup.FirstThat(P: Pointer): PView;
  3204. >var
  3205. >  ALast: Pointer;
  3206. >  dummy: PView;
  3207. >type
  3208. >  FirstThatFunc=FUNCTION(View:PView;EBP:POINTER):BOOLEAN;
  3209. >var
  3210. >  pf:FirstThatFunc;
  3211. >  _ebp:POINTER;
  3212. >label l;
  3213. >begin
  3214. >     asm
  3215. >        mov eax,[ebp]  //FirstThat CallBacks sind lokal !!
  3216. >        mov $_ebp,eax
  3217. >     end;
  3218. >     if Last=NIL THEN exit;
  3219. >     ALast:=Last;
  3220. >     dummy:=Last;
  3221. >     pf:=P;
  3222. >l:
  3223. >     dummy:=dummy^.Next;
  3224. >     if pf(dummy,_ebp) then
  3225. >     begin
  3226. >          FirstThat:=dummy;
  3227. >          exit;
  3228. >     end;
  3229. >     if dummy<>ALast then goto l;
  3230. >     FirstThat:=NIL;
  3231. >end;
  3232. #procedure TGroup.ForEach(P: Pointer); assembler;
  3233. #end;
  3234. >procedure TGroup.ForEach(P: Pointer);
  3235. >var
  3236. >  ALast: Pointer;
  3237. >  dummy: PView;
  3238. >type
  3239. >  ForEachProc=PROCEDURE(View:PView;EBP:POINTER);
  3240. >var
  3241. >   pf:ForEachProc;
  3242. >   _ebp:POINTER;
  3243. >label l;
  3244. >begin
  3245. >     asm
  3246. >        mov eax,[ebp]  //ForEach Callbacks sind lokal !!
  3247. >        mov $_ebp,eax
  3248. >     end;
  3249. >     if Last=NIL THEN exit;
  3250. >     ALast:=Last;
  3251. >     dummy:=Last;
  3252. >     pf:=P;
  3253. >l:
  3254. >     dummy:=dummy^.Next;
  3255. >     pf(dummy,_ebp);
  3256. >     if dummy<>ALast then goto l;
  3257. >end;
  3258. #procedure TGroup.GetBuffer; assembler;
  3259. #end;
  3260. >procedure TGroup.GetBuffer;
  3261. >begin
  3262. >     asm
  3263. >     MOV    EDI,$Self
  3264. >        TESTW    [EDI].TView.State,sfExposed
  3265. >        JZ    !l1_14
  3266. >        TESTW    [EDI].TView.Options,ofBuffered
  3267. >        JZ    !l1_14
  3268. >        MOV    EAX,[EDI].TGroup.Buffer
  3269. >        CMP    EAX,0
  3270. >        JNE    !l1_14
  3271. >        MOV    AX,[EDI].TView.Size.X
  3272. >     MULW    [EDI].TView.Size.Y
  3273. >        JO    !l1_14
  3274. >        SHL    AX,1
  3275. >        JC    !l1_14
  3276. >        JS    !l1_14
  3277. >        LEA    EDI,[EDI].TGroup.Buffer
  3278. >        PUSH    EDI
  3279. >        PUSH    EAX
  3280. >        CALLN32 Memory.NewCache
  3281. >!l1_14:
  3282. >     end;
  3283. >end;
  3284. #function TGroup.IndexOf(P: PView): Integer; assembler;
  3285. #end;
  3286. >function TGroup.IndexOf(P: PView): Integer;
  3287. >begin
  3288. >     asm
  3289. >        MOV     ECX,$Self
  3290. >        MOV     ECX,[ECX].TGroup.Last
  3291. >        CMP     ECX,0
  3292. >        JE      !l2_15
  3293. >        MOV     EDX,ECX
  3294. >        XOR     EAX,EAX
  3295. >!l1_15:
  3296. >        INC     EAX
  3297. >        MOV     ECX,[ECX].TView.Next
  3298. >        CMP     ECX,$P
  3299. >        JE      !l3_15
  3300. >        CMP     ECX,EDX
  3301. >        JNE     !l1_15
  3302. >!l2_15:
  3303. >        XOR     EAX,EAX
  3304. >!l3_15:
  3305. >        MOV     $!FuncResult,EAX
  3306. >     end;
  3307. >end;
  3308. #procedure TGroup.RemoveView(P: PView); assembler;
  3309. #end;
  3310. >procedure TGroup.RemoveView(P: PView);
  3311. >begin
  3312. >     asm
  3313. >        MOV     EDX,$Self
  3314. >        MOV     EDI,$P
  3315. >        MOV     EDX,[EDX].TGroup.Last
  3316. >        TEST    EDX,EDX
  3317. >        JZ      !l4_16
  3318. >        MOV     EAX,EDX
  3319. >!l1_16:
  3320. >        MOV     ECX,[EDX].TGroup.Next
  3321. >        CMP     ECX,EDI
  3322. >        JE      !l2_16
  3323. >        CMP     ECX,EAX
  3324. >        JE      !l4_16
  3325. >        MOV     EDX,ECX
  3326. >        JMP     !l1_16
  3327. >!l2_16:
  3328. >        MOV     ECX,[EDI].TGroup.Next
  3329. >        MOV     [EDX].TGroup.Next,ECX
  3330. >        CMP     EAX,EDI
  3331. >        JNE     !l4_16
  3332. >        CMP     ECX,EDI
  3333. >        JNE     !l3_16
  3334. >        XOR     EDX,EDX
  3335. >!l3_16:
  3336. >        MOV     EDI,$Self
  3337. >        MOV     [EDI].TGroup.Last,EDX
  3338. >!l4_16:
  3339. >     end;
  3340. >end;
  3341. #procedure TWindow.Zoom;
  3342. #end;
  3343. >procedure TWindow.Zoom;
  3344. >var
  3345. >  R: TRect;
  3346. >  Max, Min: TPoint;
  3347. >begin
  3348. >  SizeLimits(Min, Max);
  3349. >  if Longint(Size.X) <> Longint(Max.X) then
  3350. >  begin
  3351. >    GetBounds(ZoomRect);
  3352. >    Longint(R.A.X) := 0;
  3353. >    R.B := Max;
  3354. >    Locate(R);
  3355. >  end else Locate(ZoomRect);
  3356. >end;
  3357. #end.
  3358. >begin
  3359. >end.
  3360. !HISTLIST.PAS
  3361. #{$O+,F+,X+,I-,S-}
  3362. >{$I-,S-}
  3363. #  HistorySize: Word = 1024;
  3364. >  HistorySize: LongWord = 1024;
  3365. #  HistoryUsed: Word = 0;
  3366. >  HistoryUsed: LongWord = 0;
  3367. #procedure AdvanceStringPointer; near; assembler;
  3368. #end;
  3369. >procedure AdvanceStringPointer;
  3370. >begin
  3371. >     asm
  3372. >        MOV     ECX,HistList.HistoryUsed
  3373. >        MOV     BL,HistList.CurId
  3374. >     MOV     ESI,HistList.CurString
  3375. >        CMP     ESI,0
  3376. >        JE      !l3
  3377. >        CLD
  3378. >        JMP     !l2
  3379. >!l1:
  3380. >        LODSW
  3381. >     CMP    AH,BL   { BL = CurId }
  3382. >        JE    !l3
  3383. >!l2:
  3384. >        LODSB
  3385. >        MOVZX  EAX,AL
  3386. >        ADD    ESI,EAX
  3387. >     CMP    ESI,ECX { CX = HistoryUsed }
  3388. >        JB    !l1
  3389. >        XOR    ESI,ESI
  3390. >!l3:
  3391. >     MOV    HistList.CurString,ESI
  3392. >     end;
  3393. >end;
  3394. #procedure DeleteString; near; assembler;
  3395. #end;
  3396. >procedure DeleteString;
  3397. >begin
  3398. >   asm
  3399. >        MOV    ECX,HistList.HistoryUsed
  3400. >        CLD
  3401. >        MOV    EDI,HistList.CurString
  3402. >        MOV    ESI,EDI
  3403. >        DEC    EDI
  3404. >        DEC    EDI
  3405. >        MOV    AL,[ESI]
  3406. >        MOVZX  EAX,AL
  3407. >        INC    EAX
  3408. >     ADD    ESI,EAX
  3409. >        SUB    ECX,ESI
  3410. >        REP
  3411. >        MOVSB
  3412. >     MOV    HistList.HistoryUsed,EDI
  3413. >    end;
  3414. >end;
  3415. #procedure InsertString(Id: Byte; const Str: String); near; assembler;
  3416. #end;
  3417. >procedure InsertString(Id: Byte; const Str: String);
  3418. >begin
  3419. >    asm
  3420. >        STD
  3421. >
  3422. >        { Position ES:DI to the end the buffer  }
  3423. >        {          ES:DX to beginning of buffer }
  3424. >        MOV    EDX,HistList.HistoryBlock
  3425. >        MOV    EDI,HistList.HistoryUsed
  3426. >     MOV    ESI,$Str
  3427. >     MOV    BL,[ESI]
  3428. >        INC    BL
  3429. >        INC    BL
  3430. >        INC    BL
  3431. >        MOVZX  EBX,BL
  3432. >!l1_1:
  3433. >        MOV    EAX,EDI
  3434. >        ADD    EAX,EBX
  3435. >     SUB    EAX,EDX { EDX = HistoryBlock }
  3436. >        CMP    EAX,HistList.HistorySize
  3437. >        JB    !l2_1
  3438. >
  3439. >        { Drop the last string off the end of the list }
  3440. >        DEC     EDI
  3441. >        XOR    AL,AL
  3442. >        MOV    ECX,$FFFFFFFF
  3443. >        REPNE
  3444. >        SCASB
  3445. >        INC    EDI
  3446. >        JMP    !l1_1
  3447. >
  3448. >        { Move the table down the size of the string }
  3449. >!l2_1:
  3450. >        MOV    ESI,EDI
  3451. >     ADD    EDI,EBX
  3452. >        MOV    HistList.HistoryUsed,EDI
  3453. >        MOV    ECX,ESI
  3454. >        SUB    ECX,EDX { EDX = HistoryBlock }
  3455. >     REP
  3456. >        MOVSB
  3457. >
  3458. >        { Copy the string into the position }
  3459. >        CLD
  3460. >        MOV     EDI,EDX { EDX = HistoryBlock }
  3461. >        INC     EDI
  3462. >        MOV     AH,$Id
  3463. >        XOR     AL,AL
  3464. >     STOSW
  3465. >        MOV     ESI,$Str
  3466. >        LODSB
  3467. >        STOSB
  3468. >        MOV    CL,AL
  3469. >        MOVZX  ECX,CL
  3470. >        REP
  3471. >        MOVSB
  3472. >    end;
  3473. >end;
  3474. #procedure StartId(Id: Byte); near;
  3475. #end;
  3476. >procedure StartId(Id: Byte);
  3477. >begin
  3478. >  CurId := Id;
  3479. >  CurString := HistoryBlock;
  3480. >end;
  3481. #procedure ClearHistory;
  3482. #end;
  3483. >procedure ClearHistory;
  3484. >begin
  3485. >  PChar(HistoryBlock)^ := #0;
  3486. >  HistoryUsed := PtrRec(HistoryBlock).Ofs + 1;
  3487. >end;
  3488. #end.
  3489. >begin
  3490. >end.
  3491. !MENUS.PAS
  3492. #{$O+,F+,X+,I-,S-}
  3493. >{$I-,S-}
  3494. #{ Stream registration records }
  3495. >{ Stream registration records }
  3496. #  RMenuBar: TStreamRec = (
  3497. #  );
  3498. >  RMenuBar: TStreamRec = (
  3499. >     ObjType: 40;
  3500. >     VmtLink: TypeOf(TMenuBar);
  3501. >     Load:    @TMenuBar.Load;
  3502. >     Store:   @TMenuBar.Store
  3503. >  );
  3504. #  RMenuBox: TStreamRec = (
  3505. #  );
  3506. >  RMenuBox: TStreamRec = (
  3507. >     ObjType: 41;
  3508. >     VmtLink: TypeOf(TMenuBox);
  3509. >     Load:    @TMenuBox.Load;
  3510. >     Store:   @TMenuBox.Store
  3511. >  );
  3512. #  RStatusLine: TStreamRec = (
  3513. #  );
  3514. >  RStatusLine: TStreamRec = (
  3515. >     ObjType: 42;
  3516. >     VmtLink: TypeOf(TStatusLine);
  3517. >     Load:    @TStatusLine.Load;
  3518. >     Store:   @TStatusLine.Store
  3519. >  );
  3520. #  RMenuPopup: TStreamRec = (
  3521. #  );
  3522. >  RMenuPopup: TStreamRec = (
  3523. >     ObjType: 43;
  3524. >     VmtLink: TypeOf(TMenuPopup);
  3525. >     Load:    @TMenuPopup.Load;
  3526. >     Store:   @TMenuPopup.Store
  3527. >  );
  3528. #implementation
  3529. >implementation
  3530. #  MouseActive: Boolean;
  3531. >  MouseActive: Boolean;
  3532. >  dummy:PMenuView;
  3533. #function TopMenu: PMenuView;
  3534. #end;
  3535. >function TopMenu(SelfPtr:PMenuView): PMenuView;
  3536. >var
  3537. >  P: PMenuView;
  3538. >begin
  3539. >  P := SelfPtr;
  3540. >  while P^.ParentMenu <> nil do P := P^.ParentMenu;
  3541. >  TopMenu := P;
  3542. >end;
  3543. #begin
  3544. #end;
  3545. >begin
  3546. >  AutoSelect := False;
  3547. >  Result := 0;
  3548. >  ItemShown := nil;
  3549. >  Current := Menu^.Default;
  3550. >  MouseActive := False;
  3551. >  repeat
  3552. >    Action := DoNothing;
  3553. >    GetEvent(E);
  3554. >    case E.What of
  3555. >      evMouseDown:
  3556. >        if MouseInView(E.Where) or MouseInOwner then
  3557. >        begin
  3558. >          TrackMouse;
  3559. >          if Size.Y = 1 then AutoSelect := True;
  3560. >        end else Action := DoReturn;
  3561. >      evMouseUp:
  3562. >        begin
  3563. >          TrackMouse;
  3564. >          if MouseInOwner then
  3565. >            Current := Menu^.Default
  3566. >          else
  3567. >            if (Current <> nil) and (Current^.Name <> nil) then
  3568. >              Action := DoSelect
  3569. >            else
  3570. >              if MouseActive or MouseInView(E.Where) then Action := DoReturn
  3571. >              else
  3572. >              begin
  3573. >                Current := Menu^.Default;
  3574. >                if Current = nil then Current := Menu^.Items;
  3575. >                Action := DoNothing;
  3576. >              end;
  3577. >        end;
  3578. >      evMouseMove:
  3579. >        if E.Buttons <> 0 then
  3580. >        begin
  3581. >          TrackMouse;
  3582. >          if not (MouseInView(E.Where) or MouseInOwner) and
  3583. >            MouseInMenus then Action := DoReturn;
  3584. >        end;
  3585. >      evKeyDown:
  3586. >        case CtrlToArrow(E.KeyCode) of
  3587. >          kbUp, kbDown:
  3588. >            if Size.Y <> 1 then
  3589. >              TrackKey(CtrlToArrow(E.KeyCode) = kbDown) else
  3590. >              if E.KeyCode = kbDown then AutoSelect := True;
  3591. >          kbLeft, kbRight:
  3592. >            if ParentMenu = nil then
  3593. >              TrackKey(CtrlToArrow(E.KeyCode) = kbRight) else
  3594. >              Action := DoReturn;
  3595. >          kbHome, kbEnd:
  3596. >            if Size.Y <> 1 then
  3597. >            begin
  3598. >              Current := Menu^.Items;
  3599. >              if E.KeyCode = kbEnd then TrackKey(False);
  3600. >            end;
  3601. >          kbEnter:
  3602. >            begin
  3603. >              if Size.Y = 1 then AutoSelect := True;
  3604. >              Action := DoSelect;
  3605. >            end;
  3606. >          kbEsc:
  3607. >            begin
  3608. >              Action := DoReturn;
  3609. >              if (ParentMenu = nil) or (ParentMenu^.Size.Y <> 1) then
  3610. >                ClearEvent(E);
  3611. >            end;
  3612. >        else begin
  3613. >          Target := @Self;
  3614. >          Ch := GetAltChar(E.KeyCode);
  3615. >          if Ch = #0 then Ch := E.CharCode else Target := TopMenu(POINTER(SELF));
  3616. >          P := Target^.FindItem(Ch);
  3617. >          if P = nil then
  3618. >          begin
  3619. >            dummy:=TopMenu(POINTER(SELF));
  3620. >            P := dummy^.HotKey(E.KeyCode);
  3621. >            if (P <> nil) and CommandEnabled(P^.Command) then
  3622. >            begin
  3623. >              Result := P^.Command;
  3624. >              Action := DoReturn;
  3625. >            end
  3626. >          end else
  3627. >            if Target = @Self then
  3628. >            begin
  3629. >              if Size.Y = 1 then AutoSelect := True;
  3630. >              Action := DoSelect;
  3631. >              Current := P;
  3632. >            end else
  3633. >              if (ParentMenu <> Target) or (ParentMenu^.Current <> P) then
  3634. >                Action := DoReturn; end;
  3635. >        end; {case}
  3636. >      evCommand:
  3637. >        if E.Command = cmMenu then
  3638. >        begin
  3639. >          AutoSelect := False;
  3640. >          if ParentMenu <> nil then Action := DoReturn;
  3641. >        end else Action := DoReturn;
  3642. >    end;
  3643. >    if ItemShown <> Current then
  3644. >    begin
  3645. >      ItemShown := Current;
  3646. >      DrawView;
  3647. >    end;
  3648. >    if (Action = DoSelect) or ((Action = DoNothing) and AutoSelect) then
  3649. >      if Current <> nil then with Current^ do if Name <> nil then
  3650. >        if Command = 0 then
  3651. >        begin
  3652. >          if E.What and (evMouseDown + evMouseMove) <> 0 then PutEvent(E);
  3653. >          GetItemRect(Current, R);
  3654. >          R.A.X := R.A.X + Origin.X;
  3655. >          R.A.Y := R.B.Y + Origin.Y;
  3656. >          R.B := Owner^.Size;
  3657. >          if Size.Y = 1 then Dec(R.A.X);
  3658. >          dummy:=TopMenu(POINTER(SELF));
  3659. >          Target := dummy^.NewSubView(R, SubMenu, @Self);
  3660. >          Result := Owner^.ExecView(Target);
  3661. >          Dispose(Target, Done);
  3662. >        end else if Action = DoSelect then Result := Command;
  3663. >    if (Result <> 0) and CommandEnabled(Result) then
  3664. >    begin
  3665. >      Action := DoReturn;
  3666. >      ClearEvent(E);
  3667. >    end
  3668. >    else
  3669. >      Result := 0;
  3670. >  until Action = DoReturn;
  3671. >  if E.What <> evNothing then
  3672. >    if (ParentMenu <> nil) or (E.What = evCommand) then PutEvent(E);
  3673. >  if Current <> nil then
  3674. >  begin
  3675. >    Menu^.Default := Current;
  3676. >    Current := nil;
  3677. >    DrawView;
  3678. >  end;
  3679. >  Execute := Result;
  3680. >end;
  3681. #      if (I <> 0) and (Ch = UpCase(P^.Name^[I + 1])) then
  3682. >      if (I <> 0) and (length(P^.Name^)>I) and (Ch = UpCase(P^.Name^[I + 1])) then
  3683. #end.
  3684. >begin
  3685. >end.
  3686. !VALIDATE.PAS
  3687. #{$O+,F+,X+,I-,S-}
  3688. >{$I-,S-}
  3689. #  RPXPictureValidator: TStreamRec = (
  3690. #  );
  3691. >  RPXPictureValidator: TStreamRec = (
  3692. >    ObjType: 80;
  3693. >    VmtLink: TypeOf(TPXPictureValidator);
  3694. >    Load: @TPXPictureValidator.Load;
  3695. >    Store: @TPXPictureValidator.Store
  3696. >  );
  3697. #  RFilterValidator: TStreamRec = (
  3698. #  );
  3699. >  RFilterValidator: TStreamRec = (
  3700. >    ObjType: 81;
  3701. >    VmtLink: TypeOf(TFilterValidator);
  3702. >    Load: @TFilterValidator.Load;
  3703. >    Store: @TFilterValidator.Store
  3704. >  );
  3705. #  RRangeValidator: TStreamRec = (
  3706. #  );
  3707. >  RRangeValidator: TStreamRec = (
  3708. >    ObjType: 82;
  3709. >    VmtLink: TypeOf(TRangeValidator);
  3710. >    Load: @TRangeValidator.Load;
  3711. >    Store: @TRangeValidator.Store
  3712. >  );
  3713. #  RStringLookupValidator: TStreamRec = (
  3714. #  );
  3715. >  RStringLookupValidator: TStreamRec = (
  3716. >    ObjType: 83;
  3717. >    VmtLink: TypeOf(TStringLookupValidator);
  3718. >    Load: @TStringLookupValidator.Load;
  3719. >    Store: @TStringLookupValidator.Store
  3720. >  );
  3721. #{$IFDEF Windows}
  3722. #{$ENDIF Windows}
  3723. >uses Strings;
  3724. #{$IFDEF Windows}
  3725. #{$ELSE}
  3726. >
  3727. #procedure TPXPictureValidator.Error;
  3728. #{$ENDIF Windows}
  3729. >procedure TPXPictureValidator.Error;
  3730. >begin
  3731. >  {MessageBox('Input does not conform to picture:'#13' %s', @Pic,
  3732. >    mfError + mfOKButton);}  {kreuzverbunden mit MSGBOX}
  3733. >end;
  3734. #function IsNumber(Chr: Char): Boolean; near; assembler;
  3735. #end;
  3736. >function IsNumber(Chr: Char): Boolean;
  3737. >begin
  3738. >     asm
  3739. >        XOR     AL,AL
  3740. >        MOV     Ch,$Chr
  3741. >        CMP     Ch,'0'
  3742. >        JB      !l1
  3743. >        CMP     Ch,'9'
  3744. >        JA      !l1
  3745. >        INC     AL
  3746. >!l1:
  3747. >        MOV     $!FUNCRESULT,AL
  3748. >    end;
  3749. >end;
  3750. #function IsLetter(Chr: Char): Boolean; near; assembler;
  3751. #end;
  3752. >function IsLetter(Chr: Char): Boolean;
  3753. >begin
  3754. >     asm
  3755. >        XOR     AL,AL
  3756. >        MOV     Cl,$Chr
  3757. >        AND     Cl,$DF
  3758. >        CMP     Cl,'A'
  3759. >        JB      !l2_1
  3760. >        CMP     Cl,'Z'
  3761. >        JA      !l2_1
  3762. >!l1_1:
  3763. >        INC     AL
  3764. >!l2_1:
  3765. >        MOV     $!FUNCRESULT,AL
  3766. >     end;
  3767. >end;
  3768. #function IsSpecial(Chr: Char; const Special: string): Boolean; near;
  3769. #end;
  3770. >function IsSpecial(Chr: Char; const Special: string): Boolean;
  3771. >begin
  3772. >     asm
  3773. >        XOR     AH,AH
  3774. >        MOV     EDI,$Special
  3775. >        MOV     AL,[EDI]
  3776. >        INC     EDI
  3777. >        MOV     CH,AH
  3778. >        MOV     CL,AL
  3779. >        MOV     AL,$Chr
  3780. >        MOVZX   ECX,CX
  3781. >        CLD
  3782. >        REPNE
  3783. >        SCASB
  3784. >        CMP     CX,0
  3785. >        JE      !l1_3
  3786. >        INC     AH
  3787. >!l1_3:
  3788. >        MOV     AL,AH
  3789. >        MOV     $!FUNCRESULT,AL
  3790. >     end;
  3791. >end;
  3792. #function NumChar(Chr: Char; const S: string): Byte; near; assembler;
  3793. #end;
  3794. >function NumChar(Chr: Char; const S: string): Byte;
  3795. >begin
  3796. >     asm
  3797. >        XOR     AH,AH
  3798. >        MOV     EDI,$S
  3799. >        MOV     AL,[EDI]
  3800. >        INC     EDI
  3801. >        MOV     CH,AH
  3802. >        MOV     CL,AL
  3803. >        MOV     AL,$Chr
  3804. >        MOVZX   ECX,CX
  3805. >        CLD
  3806. >!l1_4:
  3807. >        REPNE
  3808. >        SCASB
  3809. >        CMP     CX,0
  3810. >        JE      !l2_4
  3811. >        INC     AH
  3812. >        JMP     !l1_4
  3813. >!l2_4:
  3814. >        MOV     AL,AH
  3815. >        MOV     $!FUNCRESULT,AL
  3816. >    end;
  3817. >end;
  3818. #          if Pic^[I] = ';' then Inc(I);
  3819. #        end;
  3820. >        begin
  3821. >          if Pic^[I] = ';' then Inc(I);
  3822. >          if UpCase(Pic^[I]) <> UpCase(Ch) then
  3823. >            if Ch = ' ' then Ch := Pic^[I]
  3824. >            else Exit;
  3825. >          Consume(Pic^[I]); end;
  3826. >        end;
  3827. #{$IFDEF Windows}
  3828. #{$ELSE}
  3829. >
  3830. #procedure TFilterValidator.Error;
  3831. #{$ENDIF Windows}
  3832. >procedure TFilterValidator.Error;
  3833. >begin
  3834. >  {MessageBox('Invalid character in input', nil, mfError + mfOKButton);}
  3835. >  {kreuzverbunden mit MSGBOX}
  3836. >end;
  3837. #constructor TRangeValidator.Init(AMin, AMax: LongInt);
  3838. #end;
  3839. >constructor TRangeValidator.Init(AMin, AMax: LongInt);
  3840. >var c:TCharSet;
  3841. >begin
  3842. >  c:=['0'..'9','+','-'];
  3843. >  inherited Init(c);
  3844. >  if AMin >= 0 then ValidChars := ValidChars - ['-'];
  3845. >  Min := AMin;
  3846. >  Max := AMax;
  3847. >end;
  3848. #{$IFDEF Windows}
  3849. #{$ELSE}
  3850. >
  3851. #procedure TRangeValidator.Error;
  3852. #{$ENDIF Windows}
  3853. >procedure TRangeValidator.Error;
  3854. >var
  3855. >  Params: array[0..1] of Longint;
  3856. >begin
  3857. >  Params[0] := Min;
  3858. >  Params[1] := Max;
  3859. >  {MessageBox('Value not in the range %d to %d', @Params,
  3860. >    mfError + mfOKButton);}
  3861. >  {kreuzverbunden mit MSGBOX}
  3862. >end;
  3863. #{$IFDEF Windows}
  3864. #{$ELSE}
  3865. >
  3866. #procedure TStringLookupValidator.Error;
  3867. #{$ENDIF Windows}
  3868. >procedure TStringLookupValidator.Error;
  3869. >begin
  3870. >  {MessageBox('Input not in valid-list', nil, mfError + mfOKButton);}
  3871. >  {kreuzverbunden mit MSGBOX}
  3872. >end;
  3873. #function TStringLookupValidator.Lookup(const S: string): Boolean;
  3874. #end;
  3875. >function TStringLookupValidator.Lookup(const S: string): Boolean;
  3876. >var
  3877. >  Index: Integer;
  3878. >  Str: PString;
  3879. >begin
  3880. >  asm
  3881. >        MOV     EDI,$S
  3882. >        MOV     $Str,EDI
  3883. >  end;
  3884. >  Lookup := False;
  3885. >  if Strings <> nil then
  3886. >    Lookup := Strings^.Search(Str, Index);
  3887. >end;
  3888. #end.
  3889. >begin
  3890. >end.
  3891. !DIALOGS.PAS
  3892. #{$O+,F+,X+,I-,S-}
  3893. >{$I-,S-}
  3894. #  RDialog: TStreamRec = (
  3895. #  );
  3896. >  RDialog: TStreamRec = (
  3897. >     ObjType: 10;
  3898. >     VmtLink: TypeOf(TDialog);
  3899. >     Load:    @TDialog.Load;
  3900. >     Store:   @TDialog.Store
  3901. >  );
  3902. #  RInputLine: TStreamRec = (
  3903. #  );
  3904. >  RInputLine: TStreamRec = (
  3905. >     ObjType: 11;
  3906. >     VmtLink: TypeOf(TInputLine);
  3907. >     Load:    @TInputLine.Load;
  3908. >     Store:   @TInputLine.Store
  3909. >  );
  3910. #  RButton: TStreamRec = (
  3911. #  );
  3912. >  RButton: TStreamRec = (
  3913. >     ObjType: 12;
  3914. >     VmtLink: TypeOf(TButton);
  3915. >     Load:    @TButton.Load;
  3916. >     Store:   @TButton.Store
  3917. >  );
  3918. #  RCluster: TStreamRec = (
  3919. #  );
  3920. >  RCluster: TStreamRec = (
  3921. >     ObjType: 13;
  3922. >     VmtLink: TypeOf(TCluster);
  3923. >     Load:    @TCluster.Load;
  3924. >     Store:   @TCluster.Store
  3925. >  );
  3926. #  RRadioButtons: TStreamRec = (
  3927. #  );
  3928. >  RRadioButtons: TStreamRec = (
  3929. >     ObjType: 14;
  3930. >     VmtLink: TypeOf(TRadioButtons);
  3931. >     Load:    @TRadioButtons.Load;
  3932. >     Store:   @TRadioButtons.Store
  3933. >  );
  3934. #  RCheckBoxes: TStreamRec = (
  3935. #  );
  3936. >  RCheckBoxes: TStreamRec = (
  3937. >     ObjType: 15;
  3938. >     VmtLink: TypeOf(TCheckBoxes);
  3939. >     Load:    @TCheckBoxes.Load;
  3940. >     Store:   @TCheckBoxes.Store
  3941. >  );
  3942. #  RMultiCheckBoxes: TStreamRec = (
  3943. #  );
  3944. >  RMultiCheckBoxes: TStreamRec = (
  3945. >     ObjType: 27;
  3946. >     VmtLink: TypeOf(TMultiCheckBoxes);
  3947. >     Load:    @TMultiCheckBoxes.Load;
  3948. >     Store:   @TMultiCheckBoxes.Store
  3949. >  );
  3950. #  RListBox: TStreamRec = (
  3951. #  );
  3952. >  RListBox: TStreamRec = (
  3953. >     ObjType: 16;
  3954. >     VmtLink: TypeOf(TListBox);
  3955. >     Load:    @TListBox.Load;
  3956. >     Store:   @TListBox.Store
  3957. >  );
  3958. #  RStaticText: TStreamRec = (
  3959. #  );
  3960. >  RStaticText: TStreamRec = (
  3961. >     ObjType: 17;
  3962. >     VmtLink: TypeOf(TStaticText);
  3963. >     Load:    @TStaticText.Load;
  3964. >     Store:   @TStaticText.Store
  3965. >  );
  3966. #  RLabel: TStreamRec = (
  3967. #  );
  3968. >  RLabel: TStreamRec = (
  3969. >     ObjType: 18;
  3970. >     VmtLink: TypeOf(TLabel);
  3971. >     Load:    @TLabel.Load;
  3972. >     Store:   @TLabel.Store
  3973. >  );
  3974. #  RHistory: TStreamRec = (
  3975. #  );
  3976. >  RHistory: TStreamRec = (
  3977. >     ObjType: 19;
  3978. >     VmtLink: TypeOf(THistory);
  3979. >     Load:    @THistory.Load;
  3980. >     Store:   @THistory.Store
  3981. >  );
  3982. #  RParamText: TStreamRec = (
  3983. #  );
  3984. >  RParamText: TStreamRec = (
  3985. >     ObjType: 20;
  3986. >     VmtLink: TypeOf(TParamText);
  3987. >     Load:    @TParamText.Load;
  3988. >     Store:   @TParamText.Store
  3989. >  );
  3990. #function Max(A, B: Integer): Integer;
  3991. #       {@@1:            }
  3992. >function Max(A, B: Integer): Integer;
  3993. >begin
  3994. >     if A>B then Max:=A
  3995. >     else Max:=B;
  3996. >end;
  3997. #function TCluster.ButtonState(Item: Integer): Boolean; assembler;
  3998. #end;
  3999. >function TCluster.ButtonState(Item: Integer): Boolean;
  4000. >begin
  4001. >     asm
  4002. >        XOR     AL,AL
  4003. >        MOV     CX,$Item
  4004. >        CMP     CX,31
  4005. >        JA      !l3
  4006. >        MOV     AX,1
  4007. >        XOR     DX,DX
  4008. >        CMP     CX,0
  4009. >        JE      !l2
  4010. >        MOVZX   ECX,CX
  4011. >!l1:
  4012. >        SHL     AX,1
  4013. >        RCL     DX,1
  4014. >        LOOP    !l1
  4015. >!l2:
  4016. >        MOV     EDI,$Self
  4017. >        AND     AX,[EDI].TCluster.EnableMask
  4018. >        AND     DX,[EDI+2].TCluster.EnableMask
  4019. >        OR      AX,DX
  4020. >        JZ      !l3
  4021. >        MOV     AL,1
  4022. >!l3:
  4023. >        MOV     $!FUNCRESULT,AL
  4024. >     end;
  4025. >end;
  4026. #procedure TCluster.SetButtonState(AMask: Longint; Enable: Boolean); assembler;
  4027. #end;
  4028. >procedure TCluster.SetButtonState(AMask: Longint; Enable: Boolean);
  4029. >begin
  4030. >     asm
  4031. >        MOV     EDI,$Self
  4032. >        MOV     AX,$AMask
  4033. >        MOV     DX,$AMask+2
  4034. >        TESTB   $Enable,$FF
  4035. >        JNZ     !l1_1
  4036. >        NOT     AX
  4037. >        NOT     DX
  4038. >        AND     [EDI].TCluster.EnableMask,AX
  4039. >        AND     [EDI+2].TCluster.EnableMask,DX
  4040. >        JMP     !l2_1
  4041. >!l1_1:
  4042. >        OR      [EDI].TCluster.EnableMask,AX
  4043. >        OR      [EDI+2].TCluster.EnableMask,DX
  4044. >!l2_1:
  4045. >        PUSH    EDI
  4046. >        LEA     EDI,[EDI].TCluster.Strings
  4047. >        MOV     CX,[EDI].TCollection.Count
  4048. >        POP     EDI
  4049. >        MOVZX   ECX,CX
  4050. >        CMP     ECX,32
  4051. >        JA      !l6_1
  4052. >        MOV     BX,[EDI].TCluster.Options
  4053. >        MOV     AX,ofSelectable
  4054. >        NOT     AX
  4055. >        AND     BX,AX
  4056. >        MOV     AX,[EDI].TCluster.EnableMask
  4057. >        MOV     DX,[EDI+2].TCluster.EnableMask
  4058. >!l3_1:
  4059. >        SHR     DX,1
  4060. >        RCR     AX,1
  4061. >        JC      !l4_1
  4062. >        LOOP    !l3_1
  4063. >        JMP     !l5_1
  4064. >!l4_1:
  4065. >        OR      BX,ofSelectable
  4066. >!l5_1:
  4067. >        MOV     [EDI].TCluster.Options,BX
  4068. >!l6_1:
  4069. >    end;
  4070. >end;
  4071. #end.
  4072. >begin
  4073. >end.
  4074. !APP.PAS
  4075. #{$O+,F+,X+,I-,S-}
  4076. >{$I-,S-}
  4077. #  RBackground: TStreamRec = (
  4078. #    Store: @TBackground.Store);
  4079. >  RBackground: TStreamRec = (
  4080. >    ObjType: 30;
  4081. >    VmtLink: TypeOf(TBackground);
  4082. >    Load: @TBackground.Load;
  4083. >    Store: @TBackground.Store);
  4084. #  RDesktop: TStreamRec = (
  4085. #    Store: @TDesktop.Store);
  4086. >  RDesktop: TStreamRec = (
  4087. >    ObjType: 31;
  4088. >    VmtLink: TypeOf(TDesktop);
  4089. >    Load: @TDesktop.Load;
  4090. >    Store: @TDesktop.Store);
  4091. #function ISqr(X: Integer): Integer; assembler;
  4092. #end;
  4093. >function ISqr(X: Integer): Integer;
  4094. >begin
  4095. >    asm
  4096. >    MOV    CX,$X
  4097. >       MOV    BX,0
  4098. >!l1:
  4099. >       INC     BX
  4100. >    MOV    AX,BX
  4101. >    IMUL    AX
  4102. >       CMP    AX,CX
  4103. >       JLE    !l1
  4104. >    MOV    AX,BX
  4105. >       DEC     AX
  4106. >       MOV     $!FUNCRESULT,AX
  4107. >   end;
  4108. >end;
  4109. #function DividerLoc(Lo, Hi, Num, Pos: Integer): Integer;
  4110. #end;
  4111. >function DividerLoc(Lo, Hi, Num, Pos: Integer): Integer;
  4112. >begin
  4113. >  DividerLoc := (((Hi - Lo)*Pos) DIV Num) + Lo;
  4114. >end;
  4115. #end.
  4116. >begin
  4117. >end.
  4118. !STDDLG.PAS
  4119. #{$O+,F+,V-,X+,I-,S-}
  4120. >{$I-,S-}
  4121. #    Name: string[12];
  4122. >    Name: string;
  4123. #  RFileInputLine: TStreamRec = (
  4124. #  );
  4125. >  RFileInputLine: TStreamRec = (
  4126. >     ObjType: 60;
  4127. >     VmtLink: TypeOf(TFileInputLine);
  4128. >     Load:    @TFileInputLine.Load;
  4129. >     Store:   @TFileInputLine.Store
  4130. >  );
  4131. #  RFileCollection: TStreamRec = (
  4132. #  );
  4133. >  RFileCollection: TStreamRec = (
  4134. >     ObjType: 61;
  4135. >     VmtLink: TypeOf(TFileCollection);
  4136. >     Load:    @TFileCollection.Load;
  4137. >     Store:   @TFileCollection.Store
  4138. >  );
  4139. #  RFileList: TStreamRec = (
  4140. #  );
  4141. >  RFileList: TStreamRec = (
  4142. >     ObjType: 62;
  4143. >     VmtLink: TypeOf(TFileList);
  4144. >     Load:    @TFileList.Load;
  4145. >     Store:   @TFileList.Store
  4146. >  );
  4147. #  RFileInfoPane: TStreamRec = (
  4148. #  );
  4149. >  RFileInfoPane: TStreamRec = (
  4150. >     ObjType: 63;
  4151. >     VmtLink: TypeOf(TFileInfoPane);
  4152. >     Load:    @TFileInfoPane.Load;
  4153. >     Store:   @TFileInfoPane.Store
  4154. >  );
  4155. #  RFileDialog: TStreamRec = (
  4156. #  );
  4157. >  RFileDialog: TStreamRec = (
  4158. >     ObjType: 64;
  4159. >     VmtLink: TypeOf(TFileDialog);
  4160. >     Load:    @TFileDialog.Load;
  4161. >     Store:   @TFileDialog.Store
  4162. >  );
  4163. #  RDirCollection: TStreamRec = (
  4164. #  );
  4165. >  RDirCollection: TStreamRec = (
  4166. >     ObjType: 65;
  4167. >     VmtLink: TypeOf(TDirCollection);
  4168. >     Load:    @TDirCollection.Load;
  4169. >     Store:   @TDirCollection.Store
  4170. >  );
  4171. #  RDirListBox: TStreamRec = (
  4172. #  );
  4173. >  RDirListBox: TStreamRec = (
  4174. >     ObjType: 66;
  4175. >     VmtLink: TypeOf(TDirListBox);
  4176. >     Load:    @TDirListBox.Load;
  4177. >     Store:   @TDirListBox.Store
  4178. >  );
  4179. #  RChDirDialog: TStreamRec = (
  4180. #  );
  4181. >  RChDirDialog: TStreamRec = (
  4182. >     ObjType: 67;
  4183. >     VmtLink: TypeOf(TChDirDialog);
  4184. >     Load:    @TChDirDialog.Load;
  4185. >     Store:   @TChDirDialog.Store
  4186. >  );
  4187. #  RSortedListBox: TStreamRec = (
  4188. #  );
  4189. >  RSortedListBox: TStreamRec = (
  4190. >     ObjType: 68;
  4191. >     VmtLink: TypeOf(TSortedListBox);
  4192. >     Load:    @TSortedListBox.Load;
  4193. >     Store:   @TSortedListBox.Store
  4194. >  );
  4195. #uses App, Memory, HistList, MsgBox;
  4196. >uses App, Memory, HistList, MsgBox,BseDos,Os2Def;
  4197. #function DriveValid(Drive: Char): Boolean; near; assembler;
  4198. #end;
  4199. >function DriveValid(Drive: Char): Boolean;
  4200. >var
  4201. >  DriveNumber,DriveMap:LongWord;
  4202. >begin
  4203. >    if DosQueryCurrentDisk(DriveNumber,DriveMap)<>0 then DriveValid:=FALSE
  4204. >    else DriveValid:=((1 shl (Ord(Drive) - Ord('A'))) and DriveMap) <> 0;
  4205. >end;
  4206. #function PathValid(var Path: PathStr): Boolean;
  4207. #end;
  4208. >function PathValid(var Path: PathStr): Boolean;
  4209. >var
  4210. >  ExpPath: PathStr;
  4211. >  SR: SearchRec;
  4212. >begin
  4213. >  ExpPath := FExpand(Path);
  4214. >  if Length(ExpPath) <= 3 then PathValid := DriveValid(ExpPath[1])
  4215. >  else
  4216. >  begin
  4217. >    if ExpPath[Length(ExpPath)] = '\' then Dec(ExpPath[0]);
  4218. >    FindFirst(ExpPath, Directory, SR);
  4219. >    DosFindClose(SR.HDir);
  4220. >    PathValid := (DosError = 0) and (SR.Attr and Directory <> 0);
  4221. >  end;
  4222. >end;
  4223. #function Contains(S1, S2: String): Boolean; near; assembler;
  4224. #end;
  4225. >function Contains(CONST S1, S2: String): Boolean;
  4226. >begin
  4227. >     asm
  4228. >        CLD
  4229. >        MOV    ESI,$S1
  4230. >        MOV    EDI,$S2
  4231. >        MOV    EDX,EDI
  4232. >        XOR    AH,AH
  4233. >        LODSB
  4234. >        MOV    BX,AX
  4235. >        OR     BX,BX
  4236. >        JZ     !l2
  4237. >        MOV    AL,[EDI]
  4238. >        XCHG    AX,CX
  4239. >        MOVZX  ECX,CX
  4240. >!l1:
  4241. >        PUSH    ECX
  4242. >     MOV    EDI,EDX
  4243. >     LODSB
  4244. >        REPNE
  4245. >        SCASB
  4246. >        POP    ECX
  4247. >        JE    !l3
  4248. >     DEC    BX
  4249. >        JNZ    !l1
  4250. >!l2:
  4251. >        XOR    AL,AL
  4252. >     JMP    !l4
  4253. >!l3:
  4254. >        MOV    AL,1
  4255. >!l4:
  4256. >        MOV $!FUNCRESULT,AL
  4257. >     end;
  4258. >end;
  4259. #function IsDir(const S: String): Boolean;
  4260. #end;
  4261. >function IsDir(const S: String): Boolean;
  4262. >var
  4263. >  SR: SearchRec;
  4264. >begin
  4265. >  FindFirst(S, Directory, SR);
  4266. >  DosFindClose(SR.HDir);
  4267. >  if DosError = 0 then
  4268. >    IsDir := SR.Attr and Directory <> 0
  4269. >  else IsDir := False;
  4270. >end;
  4271. #procedure TFileList.ReadDirectory(AWildCard: PathStr);
  4272. #end;
  4273. >procedure TFileList.ReadDirectory(AWildCard: PathStr);
  4274. >const
  4275. >  FindAttr = ReadOnly + Archive;
  4276. >  AllFiles = '*.*';
  4277. >  PrevDir  = '..';
  4278. >var
  4279. >  S: SearchRec;
  4280. >  P: PSearchRec;
  4281. >  FileList: PFileCollection;
  4282. >  NumFiles: Word;
  4283. >  CurPath: PathStr;
  4284. >  Dir: DirStr;
  4285. >  Name: NameStr;
  4286. >  Ext: ExtStr;
  4287. >  Event: TEvent;
  4288. >  Tmp: PathStr;
  4289. >  Flag: Integer;
  4290. >begin
  4291. >  NumFiles := 0;
  4292. >  AWildCard := FExpand(AWildCard);
  4293. >  FSplit(AWildCard, Dir, Name, Ext);
  4294. >  {$i-}
  4295. >  ChDir(Dir);
  4296. >  {$i+}
  4297. >  FileList := New(PFileCollection, Init(5, 5));
  4298. >  FindFirst(AWildCard, FindAttr, S);
  4299. >  P := @P;
  4300. >  while (P <> nil) and (DosError = 0) do
  4301. >  begin
  4302. >    if (S.Attr and Directory = 0) then
  4303. >    begin
  4304. >      P := MemAlloc(SizeOf(P^));
  4305. >      if P <> nil then
  4306. >      begin
  4307. >        Move(S.Attr, P^, SizeOf(P^));
  4308. >        FileList^.Insert(P);
  4309. >      end;
  4310. >    end;
  4311. >    FindNext(S);
  4312. >  end;
  4313. >  FindClose(S);
  4314. >  Tmp := Dir + AllFiles;
  4315. >  FindFirst(Tmp, Directory, S);
  4316. >  while (P <> nil) and (DosError = 0) do
  4317. >  begin
  4318. >    if (S.Attr and Directory <> 0) and (S.Name[1] <> '.') then
  4319. >    begin
  4320. >      P := MemAlloc(SizeOf(P^));
  4321. >      if P <> nil then
  4322. >      begin
  4323. >        Move(S.Attr, P^, SizeOf(P^));
  4324. >        FileList^.Insert(PObject(P));
  4325. >      end;
  4326. >    end;
  4327. >    FindNext(S);
  4328. >  end;
  4329. >  FindClose(S);
  4330. >  if Length(Dir) > 4 then
  4331. >  begin
  4332. >    P := MemAlloc(SizeOf(P^));
  4333. >    if P <> nil then
  4334. >    begin
  4335. >      FindFirst(Tmp, Directory, S);
  4336. >      FindNext(S);
  4337. >      if (DosError = 0) and (S.Name = PrevDir) then
  4338. >        Move(S.Attr, P^, SizeOf(P^))
  4339. >      else
  4340. >      begin
  4341. >        P^.Name := PrevDir;
  4342. >        P^.Size := 0;
  4343. >        P^.Time := $210000;
  4344. >        P^.Attr := Directory;
  4345. >      end;
  4346. >      FileList^.Insert(PObject(P));
  4347. >    end;
  4348. >  end;
  4349. >  FindClose(S);
  4350. >  if P = nil then MessageBox('Too many files.', nil, mfOkButton + mfWarning);
  4351. >  NewList(FileList);
  4352. >  if List^.Count > 0 then
  4353. >  begin
  4354. >    Event.What := evBroadcast;
  4355. >    Event.Command := cmFileFocused;
  4356. >    Event.InfoPtr := List^.At(0);
  4357. >    Owner^.HandleEvent(Event);
  4358. >  end;
  4359. >end;
  4360. #  M := Month[Time.Month];
  4361. >  IF Time.Month=0 THEN Time.Month:=1;
  4362. >  M := Month[Time.Month];
  4363. #{ TFileDialog }
  4364. >
  4365. >VAR OldFileDlgDir:STRING;
  4366. >
  4367. >{ TFileDialog }
  4368. #  R.Assign(15,1,64,20);
  4369. >  {$i-}
  4370. >  GetDir(0,OldFileDlgDir);
  4371. >  {$i+}
  4372. >  R.Assign(15,1,64,20);
  4373. #  TDialog.Done;
  4374. >  {$i-}
  4375. >  ChDir(OldFileDlgDir);
  4376. >  {$i+}
  4377. >  TDialog.Done;
  4378. #function NoWildChars(S: String): String; near; assembler;
  4379. #end;
  4380. >function NoWildChars(S: String): String;
  4381. >begin
  4382. >     asm
  4383. >     MOV    ESI,$S
  4384. >        XOR    AX,AX
  4385. >     LODSB
  4386. >     XCHG    AX,CX
  4387. >        MOVZX  ECX,CX
  4388. >        MOV    EDI,$!FuncResult
  4389. >        INC    EDI
  4390. >        CMP    ECX,0
  4391. >        JE     !l3_1
  4392. >!l1_1:
  4393. >        LODSB
  4394. >     CMP    AL,'?'
  4395. >     JE    !l2_1
  4396. >     CMP    AL,'*'
  4397. >     JE    !l2_1
  4398. >     STOSB
  4399. >!l2_1:
  4400. >        LOOP    !l1_1
  4401. >!l3_1:
  4402. >        XCHG    EAX,EDI
  4403. >     MOV    EDI,$!FuncResult
  4404. >     SUB    EAX,EDI
  4405. >        DEC    EAX
  4406. >        STOSB
  4407. >    end;
  4408. >end;
  4409. #function GetCurDrive: Char; near; assembler;
  4410. #end;
  4411. >function GetCurDrive: Char;
  4412. >var
  4413. >   DriveNumber,DriveMap:LongWord;
  4414. >begin
  4415. >     DosQueryCurrentDisk(DriveNumber,DriveMap);
  4416. >     GetCurDrive := Chr(DriveNumber+Ord('A')-1);
  4417. >end;
  4418. #end.
  4419. >begin
  4420. >end.
  4421. !EDITORS.PAS
  4422. #{$I-,O+,F+,V-,X+,S-}
  4423. >{$I-,S-}
  4424. #  EditorDialog: TEditorDialog = DefEditorDialog;
  4425. >  EditorDialog: TEditorDialog = @DefEditorDialog;
  4426. #  REditor: TStreamRec = (
  4427. #  );
  4428. >  REditor: TStreamRec = (
  4429. >    ObjType: 70;
  4430. >    VmtLink: TypeOf(TEditor);
  4431. >    Load: @TEditor.Load;
  4432. >    Store: @TEditor.Store
  4433. >  );
  4434. #  RMemo: TStreamRec = (
  4435. #  );
  4436. >  RMemo: TStreamRec = (
  4437. >    ObjType: 71;
  4438. >    VmtLink: TypeOf(TMemo);
  4439. >    Load: @TMemo.Load;
  4440. >    Store: @TMemo.Store
  4441. >  );
  4442. #  RFileEditor: TStreamRec = (
  4443. #  );
  4444. >  RFileEditor: TStreamRec = (
  4445. >    ObjType: 72;
  4446. >    VmtLink: TypeOf(TFileEditor);
  4447. >    Load: @TFileEditor.Load;
  4448. >    Store: @TFileEditor.Store
  4449. >  );
  4450. #  RIndicator: TStreamRec = (
  4451. #  );
  4452. >  RIndicator: TStreamRec = (
  4453. >    ObjType: 73;
  4454. >    VmtLink: TypeOf(TIndicator);
  4455. >    Load: @TIndicator.Load;
  4456. >    Store: @TIndicator.Store
  4457. >  );
  4458. #  REditWindow: TStreamRec = (
  4459. #  );
  4460. >  REditWindow: TStreamRec = (
  4461. >    ObjType: 74;
  4462. >    VmtLink: TypeOf(TEditWindow);
  4463. >    Load: @TEditWindow.Load;
  4464. >    Store: @TEditWindow.Store
  4465. >  );
  4466. #function Min(X, Y: Integer): Integer; near; assembler;
  4467. #end;
  4468. >function Min(X, Y: Integer): Integer;
  4469. >begin
  4470. >     if X<Y then Min:=X
  4471. >     else Min:=Y;
  4472. >end;
  4473. #function Max(X, Y: Integer): Integer; near; assembler;
  4474. #end;
  4475. >function Max(X, Y: Integer): Integer;
  4476. >begin
  4477. >     if X>Y then Max:=X
  4478. >     else Max:=Y;
  4479. >end;
  4480. #function MinWord(X, Y: Word): Word; near; assembler;
  4481. #end;
  4482. >function MinWord(X, Y: Word): Word;
  4483. >begin
  4484. >     if X<Y then MinWord:=X
  4485. >     else MinWord:=Y;
  4486. >end;
  4487. #function MaxWord(X, Y: Word): Word; near; assembler;
  4488. #end;
  4489. >function MaxWord(X, Y: Word): Word;
  4490. >begin
  4491. >     if X>Y then MaxWord:=X
  4492. >     else MaxWord:=Y;
  4493. >end;
  4494. #function CountLines(var Buf; Count: Word): Integer; near; assembler;
  4495. #end;
  4496. >function CountLines(var Buf; Count: Word): Integer;
  4497. >begin
  4498. >     asm
  4499. >        MOV     EDI,$Buf
  4500. >        MOVZXW  ECX,$Count
  4501. >        XOR     EDX,EDX
  4502. >        MOV     AL,$0D
  4503. >        CLD
  4504. >!l1:
  4505. >        CMP     ECX,0
  4506. >        JE      !l2
  4507. >        REPNE
  4508. >        SCASB
  4509. >        JNE     !l2
  4510. >        INC     EDX
  4511. >        JMP     !l1
  4512. >!l2:
  4513. >        MOV     $!FuncResult,EDX
  4514. >    end;
  4515. >end;
  4516. #function ScanKeyMap(KeyMap: Pointer; KeyCode: Word): Word; near; assembler;
  4517. #end;
  4518. >function ScanKeyMap(KeyMap: Pointer; KeyCode: Word): Word;
  4519. >begin
  4520. >     asm
  4521. >        MOV     ESI,$KeyMap
  4522. >        MOV     DX,$KeyCode
  4523. >        CLD
  4524. >        LODSW
  4525. >        MOVZX   ECX,AX
  4526. >!l1_1:
  4527. >        LODSW
  4528. >        MOV     BX,AX
  4529. >        LODSW
  4530. >        CMP     BL,DL
  4531. >        JNE     !l3_1
  4532. >        OR      BH,BH
  4533. >        JE      !l4_1
  4534. >        CMP     BH,DH
  4535. >        JE      !l4_1
  4536. >!l3_1:
  4537. >        LOOP    !l1_1
  4538. >        XOR     AX,AX
  4539. >!l4_1:
  4540. >        MOV     $!FuncResult,AX
  4541. >     end;
  4542. >end;
  4543. #function Scan(var Block; Size: Word; Str: String): Word; near; assembler;
  4544. #end;
  4545. >function Scan(var Block; Size: Word;CONST Str: String): Word;
  4546. >begin
  4547. >    asm
  4548. >        MOV     EDI,$Block
  4549. >        MOV     ESI,$Str
  4550. >        MOVZXW  ECX,$Size
  4551. >        CMP     ECX,0
  4552. >        JE      !l3_2
  4553. >        CLD
  4554. >        LODSB
  4555. >        CMP     AL,1
  4556. >        JB      !l5_2
  4557. >        JA      !l1_2
  4558. >        LODSB
  4559. >        REPNE
  4560. >        SCASB
  4561. >        JNE     !l3_2
  4562. >        JMP     !l5_2
  4563. >!l1_2:
  4564. >        XOR     AH,AH
  4565. >        MOV     BX,AX
  4566. >        DEC     BX
  4567. >        MOV     DX,CX
  4568. >        SUB     DX,AX
  4569. >        JB      !l3_2
  4570. >        LODSB
  4571. >        INC     DX
  4572. >        INC     DX
  4573. >!l2_2:
  4574. >        DEC     DX
  4575. >        MOVZX   ECX,DX
  4576. >        REPNE
  4577. >        SCASB
  4578. >        JNE     !l3_2
  4579. >        MOV     DX,CX
  4580. >        MOVZX   ECX,BX
  4581. >        REP
  4582. >        CMPSB
  4583. >        JE      !l4_2
  4584. >        SUB     CX,BX
  4585. >        MOVZX   ECX,CX
  4586. >        ADD     ESI,ECX
  4587. >        ADD     EDI,ECX
  4588. >        INC     EDI
  4589. >        OR      DX,DX
  4590. >        JNE     !l2_2
  4591. >!l3_2:
  4592. >        XOR     AX,AX
  4593. >        JMP     !l6_2
  4594. >!l4_2:
  4595. >        MOVZX   EBX,BX
  4596. >        SUB     EDI,EBX
  4597. >!l5_2:
  4598. >        MOV     EAX,EDI
  4599. >        SUB     EAX,$Block
  4600. >!l6_2:
  4601. >        DEC     AX
  4602. >        MOV     $!FuncResult,AX
  4603. >    end;
  4604. >end;
  4605. #function IScan(var Block; Size: Word; Str: String): Word; near; assembler;
  4606. #end;
  4607. >function IScan(var Block; Size: Word;CONST Str: String): Word;
  4608. >var
  4609. >  S: String;
  4610. >begin
  4611. >     asm
  4612. >        LEA     EDI,$S
  4613. >        MOV     ESI,$Str
  4614. >        XOR     AH,AH
  4615. >        LODSB
  4616. >        STOSB
  4617. >        MOVZX   ECX,AX
  4618. >        MOVZX   EBX,AX
  4619. >        CMP     ECX,0
  4620. >        JE      !l9_3
  4621. >!l1_3:
  4622. >        LODSB
  4623. >        CMP     AL,'a'
  4624. >        JB      !l2_3
  4625. >        CMP     AL,'z'
  4626. >        JA      !l2_3
  4627. >        SUB     AL,$20
  4628. >!l2_3:
  4629. >        STOSB
  4630. >        LOOP    !l1_3
  4631. >        SUB     EDI,EBX
  4632. >        MOV     ESI,$Block
  4633. >        MOVZXW  ECX,$Size
  4634. >        CMP     ECX,0
  4635. >        JE      !l8_3
  4636. >        CLD
  4637. >        SUB     ECX,EBX
  4638. >        JB      !l8_3
  4639. >        INC     ECX
  4640. >!l4_3:
  4641. >        MOV     AH,[EDI]
  4642. >        AND     AH,$DF
  4643. >!l5_3:
  4644. >        LODSB
  4645. >        AND     AL,$DF
  4646. >        CMP     AL,AH
  4647. >        LOOPNE  !l5_3
  4648. >        JNE     !l8_3
  4649. >        DEC     ESI
  4650. >        MOV     EDX,ECX
  4651. >        MOV     ECX,EBX
  4652. >!l6_3:
  4653. >        REPE
  4654. >        CMPSB
  4655. >        JE      !l10_3
  4656. >        MOV     AL,[ESI-1]
  4657. >        CMP     AL,'a'
  4658. >        JB      !l7_3
  4659. >        CMP     AL,'z'
  4660. >        JA      !l7_3
  4661. >        SUB     AL,$20
  4662. >!l7_3:
  4663. >        CMP     AL,[EDI-1]
  4664. >        JE      !l6_3
  4665. >        SUB     ECX,EBX
  4666. >        ADD     ESI,ECX
  4667. >        ADD     EDI,ECX
  4668. >        INC     ESI
  4669. >        MOV     ECX,EDX
  4670. >        OR      ECX,ECX
  4671. >        JNE     !l4_3
  4672. >!l8_3:
  4673. >        XOR     AX,AX
  4674. >        JMP     !l11_3
  4675. >!l9_3:
  4676. >        MOV     AX, 1
  4677. >        JMP     !l11_3
  4678. >!l10_3:
  4679. >        SUB     ESI,EBX
  4680. >        MOV     EAX,ESI
  4681. >        SUB     EAX,$Block
  4682. >        INC     EAX
  4683. >!l11_3:
  4684. >        DEC     EAX
  4685. >        MOV     $!FuncResult,AX
  4686. >     end;
  4687. >end;
  4688. #procedure TIndicator.SetValue(ALocation: TPoint; AModified: Boolean);
  4689. #end;
  4690. >procedure TIndicator.SetValue(ALocation: TPoint; AModified: Boolean);
  4691. >begin
  4692. >  if (Longint(Location.X) <> Longint(ALocation.X)) or
  4693. >    (Modified <> AModified) then
  4694. >  begin
  4695. >    Location := ALocation;
  4696. >    Modified := AModified;
  4697. >    DrawView;
  4698. >  end;
  4699. >end;
  4700. #function TEditor.BufChar(P: Word): Char; assembler;
  4701. #end;
  4702. >function TEditor.BufChar(P: Word): Char;
  4703. >begin
  4704. >     asm
  4705. >        MOV     EDI,$Self
  4706. >        MOV     BX,$P
  4707. >        CMP     BX,[EDI].TEditor.CurPtr
  4708. >        JB      !l1_4
  4709. >        ADD     BX,[EDI].TEditor.GapLen
  4710. >!l1_4:
  4711. >        MOVZX   EBX,BX
  4712. >        MOV     EDI,[EDI].TEditor.Buffer
  4713. >        MOV     AL,[EDI+EBX]
  4714. >        MOV     $!FuncResult,AL
  4715. >     end;
  4716. >end;
  4717. #function TEditor.BufPtr(P: Word): Word; assembler;
  4718. #end;
  4719. >function TEditor.BufPtr(P: Word): Word;
  4720. >begin
  4721. >     asm
  4722. >        MOV     EDI,$Self
  4723. >        MOV     AX,$P
  4724. >        CMP     AX,[EDI].TEditor.CurPtr
  4725. >        JB      !l1_5
  4726. >        ADD     AX,[EDI].TEditor.GapLen
  4727. >!l1_5:
  4728. >        MOV     $!FuncResult,AX
  4729. >     end;
  4730. >end;
  4731. #  ShiftState: Byte absolute $40:$17;
  4732. >
  4733. #procedure TEditor.FormatLine(var DrawBuf; LinePtr: Word;
  4734. #end;
  4735. >
  4736. >var Help10Adr:POINTER;
  4737. >
  4738. >procedure TEditor.FormatLine(var DrawBuf; LinePtr: Word;
  4739. >  Width: Integer; Colors: Word);
  4740. >begin
  4741. >     asm
  4742. >        MOV     EAX,*!l10_6
  4743. >        MOV     Editors.Help10Adr,EAX
  4744. >        MOV     EBX,$Self
  4745. >        MOV     EDI,$DrawBuf
  4746. >        MOVZXW  ESI,$LinePtr
  4747. >        XOR     EDX,EDX
  4748. >        CLD
  4749. >        MOV     AH,$Colors
  4750. >        MOVZXW  ECX,[EBX].TEditor.SelStart
  4751. >        CALLN32 [Editors.Help10Adr]
  4752. >        MOV     AH,$Colors+1
  4753. >        MOVZXW  ECX,[EBX].TEditor.CurPtr
  4754. >        CALLN32 [Editors.Help10Adr]
  4755. >        MOVZXW  ECX,[EBX].TEditor.GapLen
  4756. >        ADD     ESI,ECX
  4757. >        MOVZXW  ECX,[EBX].TEditor.SelEnd
  4758. >        ADD     CX,[EBX].TEditor.GapLen
  4759. >        CALLN32 [Editors.Help10Adr]
  4760. >        MOV     AH,$Colors
  4761. >        MOVZXW  ECX,[EBX].TEditor.BufSize
  4762. >        CALLN32 [Editors.Help10Adr]
  4763. >        JMP     !l31_6
  4764. >!l10_6:
  4765. >        SUB     ECX,ESI
  4766. >        JA      !l11_6
  4767. >        RETN32
  4768. >!l11_6:
  4769. >        MOV     EBX,[EBX].TEditor.Buffer
  4770. >        ADD     ESI,EBX
  4771. >        MOVZXW  EBX,$Width
  4772. >!l12_6:
  4773. >        LODSB
  4774. >        CMP     AL,' '
  4775. >        JB      !l20_6
  4776. >!l13_6:
  4777. >        STOSW
  4778. >        INC     EDX
  4779. >!l14_6:
  4780. >        CMP     EDX,EBX
  4781. >        JAE     !l30_6
  4782. >        LOOP    !l12_6
  4783. >        MOV     EBX,$Self
  4784. >        SUB     ESI,[EBX].TEditor.Buffer
  4785. >        RETN32
  4786. >!l20_6:
  4787. >        CMP     AL,$0D
  4788. >        JE      !l30_6
  4789. >        CMP     AL,$09
  4790. >        JNE     !l13_6
  4791. >        MOV     AL,' '
  4792. >!l21_6:
  4793. >        STOSW
  4794. >        INC     EDX
  4795. >        TEST    DL,7
  4796. >        JNE     !l21_6
  4797. >        JMP     !l14_6
  4798. >!l30_6:
  4799. >        POP     ECX
  4800. >!l31_6:
  4801. >        MOV     AL,' '
  4802. >        MOVZXW  ECX,$Width
  4803. >        SUB     ECX,EDX
  4804. >        JBE     !l32_6
  4805. >        REP
  4806. >        STOSW
  4807. >!l32_6:
  4808. >    end;
  4809. >end;
  4810. #  ShiftState: Byte absolute $40:$17;
  4811. >
  4812. #function TEditor.LineEnd(P: Word): Word; assembler;
  4813. #end;
  4814. >function TEditor.LineEnd(P: Word): Word;
  4815. >begin
  4816. >     asm
  4817. >        MOV     ESI,$Self
  4818. >        MOV     EBX,[ESI].TEditor.Buffer
  4819. >        MOVZXW  EDI,$P
  4820. >        MOV     AL,$0D
  4821. >        CLD
  4822. >        MOVZXW  ECX,[ESI].TEditor.CurPtr
  4823. >        SUB     ECX,EDI
  4824. >        JBE     !l1_7
  4825. >        ADD     EDI,EBX
  4826. >        REPNE
  4827. >        SCASB
  4828. >        JE      !l2_7
  4829. >        MOVZXW  EDI,[ESI].TEditor.CurPtr
  4830. >!l1_7:
  4831. >        MOVZXW  ECX,[ESI].TEditor.BufLen
  4832. >        SUB     ECX,EDI
  4833. >        CMP     ECX,0
  4834. >        JE      !l4_7
  4835. >        MOVZXW  EDX,[ESI].TEditor.GapLen
  4836. >        ADD     EBX,EDX
  4837. >        ADD     EDI,EBX
  4838. >        REPNE
  4839. >        SCASB
  4840. >        JNE     !l3_7
  4841. >!l2_7:
  4842. >        DEC     EDI
  4843. >!l3_7:
  4844. >        SUB     EDI,EBX
  4845. >!l4_7:
  4846. >        MOV     $!FuncResult,EDI
  4847. >     end;
  4848. >end;
  4849. #function TEditor.LineStart(P: Word): Word; assembler;
  4850. #end;
  4851. >function TEditor.LineStart(P: Word): Word;
  4852. >begin
  4853. >     asm
  4854. >        MOV     ESI,$Self
  4855. >        MOV     EBX,[ESI].TEditor.Buffer
  4856. >        MOVZXW  EDI,$P
  4857. >        MOV     AL,$0D
  4858. >        STD
  4859. >        MOV     ECX,EDI
  4860. >        MOVZXW  EDX,[ESI].TEditor.CurPtr
  4861. >        SUB     ECX,EDX
  4862. >        JBE     !l1_8
  4863. >        MOVZXW  EDX,[ESI].TEditor.GapLen
  4864. >        ADD     EBX,EDX
  4865. >        ADD     EDI,EBX
  4866. >        DEC     EDI
  4867. >        REPNE
  4868. >        SCASB
  4869. >        JE      !l2_8
  4870. >        MOVZXW  EDX,[ESI].TEditor.GapLen
  4871. >        SUB     EBX,EDX
  4872. >        MOVZXW  EDI,[ESI].TEditor.CurPtr
  4873. >!l1_8:
  4874. >        MOV     ECX,EDI
  4875. >        CMP     ECX,0
  4876. >        JE      !l4_8
  4877. >        ADD     EDI,EBX
  4878. >        DEC     EDI
  4879. >        REPNE
  4880. >        SCASB
  4881. >        JNE     !l3_8
  4882. >!l2_8:
  4883. >        INC     EDI
  4884. >        INC     EDI
  4885. >        SUB     EDI,EBX
  4886. >        CMP     DI,[ESI].TEditor.CurPtr
  4887. >        JE      !l4_8
  4888. >        CMP     DI,[ESI].TEditor.BufLen
  4889. >        JE      !l4_8
  4890. >        CMPB    [EBX+EDI],$0A
  4891. >        JNE     !l4_8
  4892. >        INC     EDI
  4893. >        JMP     !l4_8
  4894. >!l3_8:
  4895. >        XOR     EDI,EDI
  4896. >!l4_8:
  4897. >        MOV     $!FuncResult,EDI
  4898. >     end;
  4899. >end;
  4900. #function TEditor.NextChar(P: Word): Word; assembler;
  4901. #end;
  4902. >function TEditor.NextChar(P: Word): Word;
  4903. >begin
  4904. >     asm
  4905. >        MOV     ESI,$Self
  4906. >        MOVZXW  EDI,$P
  4907. >        CMP     DI,[ESI].TEditor.BufLen
  4908. >        JE      !l2_9
  4909. >        INC     EDI
  4910. >        CMP     DI,[ESI].TEditor.BufLen
  4911. >        JE      !l2_9
  4912. >        MOV     EBX,[ESI].TEditor.Buffer
  4913. >        CMP     DI,[ESI].TEditor.CurPtr
  4914. >        JB      !l1_9
  4915. >        MOVZXW  EDX,[ESI].TEditor.GapLen
  4916. >        ADD     EBX,EDX
  4917. >!l1_9:
  4918. >        DEC     EBX
  4919. >        CMPW    [EBX+EDI],$0A0D
  4920. >        JNE     !l2_9
  4921. >        INC     EDI
  4922. >!l2_9:
  4923. >        MOV     $!FuncResult,EDI
  4924. >     end;
  4925. >end;
  4926. #function TEditor.PrevChar(P: Word): Word; assembler;
  4927. #end;
  4928. >function TEditor.PrevChar(P: Word): Word;
  4929. >begin
  4930. >    asm
  4931. >        MOV     ESI,$Self
  4932. >        MOVZXW  EDI,$P
  4933. >        OR      EDI,EDI
  4934. >        JE      !l2_10
  4935. >        DEC     EDI
  4936. >        JE      !l2_10
  4937. >        MOV     EBX,[ESI].TEditor.Buffer
  4938. >        CMP     DI,[ESI].TEditor.CurPtr
  4939. >        JB      !l1_10
  4940. >        MOVZXW  EDX,[ESI].TEditor.GapLen
  4941. >        ADD     EBX,EDX
  4942. >!l1_10:
  4943. >        DEC     EBX
  4944. >        CMPW    [EBX+EDI],$0A0D
  4945. >        JNE     !l2_10
  4946. >        DEC     EDI
  4947. >!l2_10:
  4948. >        MOV     $!FuncResult,EDI
  4949. >     end;
  4950. >end;
  4951. #    InOutRes := 0;
  4952. >    IOResult := 0;
  4953. #function TFileEditor.SetBufSize(NewSize: Word): Boolean;
  4954. #end;
  4955. >function TFileEditor.SetBufSize(NewSize: Word): Boolean;
  4956. >var
  4957. >  N: Word;
  4958. >  P: Pointer;
  4959. >begin
  4960. >  SetBufSize := False;
  4961. >  if NewSize = 0 then NewSize := $1000 else
  4962. >    if NewSize > $F000 then NewSize := $FFF0 else
  4963. >      NewSize := (NewSize + $0FFF) and $F000;
  4964. >  if NewSize <> BufSize then
  4965. >  begin
  4966. >    if NewSize > BufSize then
  4967. >    begin
  4968. >         NewBuffer(P,NewSize);
  4969. >         move(Buffer^,P^,BufSize);
  4970. >         DisposeBuffer(Buffer);
  4971. >         Buffer:=P;
  4972. >    end;
  4973. >    N := BufLen - CurPtr + DelCount;
  4974. >    Move(Buffer^[BufSize - N], Buffer^[NewSize - N], N);
  4975. >    if NewSize < BufSize then
  4976. >    begin
  4977. >         NewBuffer(P,NewSize);
  4978. >         move(Buffer^,P^,NewSize);
  4979. >         DisposeBuffer(Buffer);
  4980. >         Buffer:=P;
  4981. >    end;
  4982. >    BufSize := NewSize;
  4983. >    GapLen := BufSize - BufLen;
  4984. >  end;
  4985. >  SetBufSize := True;
  4986. >end;
  4987. #end.
  4988. >begin
  4989. >end.
  4990. !COLORSEL.PAS
  4991. #{$O+,F+,X+,I-,S-}
  4992. >{$I-,S-}
  4993. #  RColorSelector: TStreamRec = (
  4994. #  );
  4995. >  RColorSelector: TStreamRec = (
  4996. >     ObjType: 21;
  4997. >     VmtLink: TypeOf(TColorSelector);
  4998. >     Load:    @TColorSelector.Load;
  4999. >     Store:   @TColorSelector.Store
  5000. >  );
  5001. #  RMonoSelector: TStreamRec = (
  5002. #  );
  5003. >  RMonoSelector: TStreamRec = (
  5004. >     ObjType: 22;
  5005. >     VmtLink: TypeOf(TMonoSelector);
  5006. >     Load:    @TMonoSelector.Load;
  5007. >     Store:   @TMonoSelector.Store
  5008. >  );
  5009. #  RColorDisplay: TStreamRec = (
  5010. #  );
  5011. >  RColorDisplay: TStreamRec = (
  5012. >     ObjType: 23;
  5013. >     VmtLink: TypeOf(TColorDisplay);
  5014. >     Load:    @TColorDisplay.Load;
  5015. >     Store:   @TColorDisplay.Store
  5016. >  );
  5017. #  RColorGroupList: TStreamRec = (
  5018. #  );
  5019. >  RColorGroupList: TStreamRec = (
  5020. >     ObjType: 24;
  5021. >     VmtLink: TypeOf(TColorGroupList);
  5022. >     Load:    @TColorGroupList.Load;
  5023. >     Store:   @TColorGroupList.Store
  5024. >  );
  5025. #  RColorItemList: TStreamRec = (
  5026. #  );
  5027. >  RColorItemList: TStreamRec = (
  5028. >     ObjType: 25;
  5029. >     VmtLink: TypeOf(TColorItemList);
  5030. >     Load:    @TColorItemList.Load;
  5031. >     Store:   @TColorItemList.Store
  5032. >  );
  5033. #  RColorDialog: TStreamRec = (
  5034. #  );
  5035. >  RColorDialog: TStreamRec = (
  5036. >     ObjType: 26;
  5037. >     VmtLink: TypeOf(TColorDialog);
  5038. >     Load:    @TColorDialog.Load;
  5039. >     Store:   @TColorDialog.Store
  5040. >  );
  5041. #end.
  5042. >begin
  5043. >end.
  5044. !OUTLINE.PAS
  5045. #{$O+,F+,X+,I-,S-,R-}
  5046. >{$I-,S-,R-}
  5047. #    function Iterate(Action: Pointer; CallerFrame: Word;
  5048. #      CheckRslt: Boolean): Pointer;
  5049. >    function Iterate(Action: Pointer; CallerFrame: LongWord;
  5050. >      CheckRslt: Boolean): Pointer;
  5051. #  ROutline: TStreamRec = (
  5052. #  );
  5053. >  ROutline: TStreamRec = (
  5054. >     ObjType: 91;
  5055. >     VmtLink: TypeOf(TOutline);
  5056. >     Load:    @TOutline.Load;
  5057. >     Store:   @TOutline.Store
  5058. >  );
  5059. #function TOutlineViewer.CreateGraph(Level: Integer; Lines: LongInt;
  5060. #end;
  5061. >function TOutlineViewer.CreateGraph(Level: Integer; Lines: LongInt;
  5062. >         Flags: Word; LevWidth, EndWidth: Integer;
  5063. >         const Chars: String): String;
  5064. >const
  5065. >  FillerOrBar   = 0;
  5066. >  YorL          = 2;
  5067. >  StraightOrTee = 4;
  5068. >  Retracted     = 6;
  5069. >var
  5070. >  Last, Children, Expanded: Boolean;
  5071. >begin
  5072. >     asm
  5073. >        CLD
  5074. >
  5075. >        { Break out flags }
  5076. >        XOR     BX,BX
  5077. >        MOV     AX,$Flags
  5078. >        MOV     $Expanded,BL
  5079. >        SHR     AX,1
  5080. >        ADC     $Expanded,BL
  5081. >        MOV     $Children,BL
  5082. >        SHR     AX,1
  5083. >        ADC     $Children,BL
  5084. >        MOV     $Last,BL
  5085. >        SHR     AX,1
  5086. >        ADC     $Last,BL
  5087. >
  5088. >        { Load registers }
  5089. >        MOV     ESI,$Chars
  5090. >        INC     ESI
  5091. >        MOV     EDI,$!FuncResult
  5092. >        INC     EDI
  5093. >        MOV     AX,$Lines
  5094. >        MOV     DX,$Lines+2
  5095. >        INCW    $Level
  5096. >
  5097. >        { Write bar characters }
  5098. >        JMP     !l2
  5099. >!l1:    XOR     BX,BX
  5100. >        SHR     DX,1
  5101. >        RCR     AX,1
  5102. >        RCL     BX,1
  5103. >        PUSH    AX
  5104. >        MOVZX   EBX,BX
  5105. >        PUSH    EBX
  5106. >        ADD     EBX,FillerOrBar
  5107. >        MOV     AL,[ESI+EBX]
  5108. >        POP     EBX
  5109. >        STOSB
  5110. >        PUSH    ESI
  5111. >        ADD     ESI,FillerOrBar
  5112. >        MOV     AL,[ESI]
  5113. >        POP     ESI
  5114. >        MOV     CX,$LevWidth
  5115. >        DEC     CX
  5116. >        MOVZX   ECX,CX
  5117. >        REP
  5118. >        STOSB
  5119. >        POP     AX
  5120. >!l2:
  5121. >        DECW    $Level
  5122. >        JNZ     !l1
  5123. >
  5124. >        { Write end characters }
  5125. >        MOV     BH,0
  5126. >        MOV     CX,$EndWidth
  5127. >        DEC     CX
  5128. >        JZ      !l4
  5129. >        MOV     BL,$Last
  5130. >        MOVZX   EBX,BX
  5131. >        PUSH    EBX
  5132. >        ADD     EBX,YorL
  5133. >        MOV     AL,[ESI+EBX]
  5134. >        POP     EBX
  5135. >        STOSB
  5136. >        DEC     CX
  5137. >        JZ      !l4
  5138. >        DEC     CX
  5139. >        JZ      !l3
  5140. >        PUSH    ESI
  5141. >        ADD     ESI,StraightOrTee
  5142. >        MOV     AL,[ESI]
  5143. >        POP     ESI
  5144. >        MOVZX   ECX,CX
  5145. >        REP
  5146. >        STOSB
  5147. >!l3:
  5148. >        MOV     BL,$Children
  5149. >        MOVZX   EBX,BX
  5150. >        PUSH    EBX
  5151. >        ADD     EBX,StraightOrTee
  5152. >        MOV     AL,[ESI+EBX]
  5153. >        POP     EBX
  5154. >        STOSB
  5155. >!l4:
  5156. >        MOV     BL,$Expanded
  5157. >        MOVZX   EBX,BX
  5158. >        PUSH    EBX
  5159. >        ADD     EBX,Retracted
  5160. >        MOV     AL,[ESI+EBX]
  5161. >        POP     EBX
  5162. >        STOSB
  5163. >        MOV     EAX,EDI
  5164. >        MOV     EDI,$!FuncResult
  5165. >        SUB     EAX,EDI
  5166. >        DEC     EAX
  5167. >        STOSB
  5168. >     end;
  5169. >end;
  5170. #function CallerFrame: Word; inline(
  5171. #);
  5172. >
  5173. #function TOutlineViewer.FirstThat(Test: Pointer): Pointer;
  5174. #end;
  5175. >function TOutlineViewer.FirstThat(Test: Pointer): Pointer;
  5176. >VAR cfr:LONGWORD;
  5177. >begin
  5178. >  ASM
  5179. >     //determine caller's frame
  5180. >     MOV EAX,[EBP]
  5181. >     MOV $cfr,EAX
  5182. >  END;
  5183. >  FirstThat := Iterate(Test, cfr, True);
  5184. >end;
  5185. #function TOutlineViewer.ForEach(Action: Pointer): Pointer;
  5186. #end;
  5187. >function TOutlineViewer.ForEach(Action: Pointer): Pointer;
  5188. >var cfr:LONGWORD;
  5189. >begin
  5190. >  ASM
  5191. >     //determine caller's frame
  5192. >     MOV EAX,[EBP]
  5193. >     MOV $cfr,EAX
  5194. >  END;
  5195. >  Iterate(Action, cfr, False);
  5196. >end;
  5197. #function TOutlineViewer.Iterate(Action: Pointer; CallerFrame: Word;
  5198. #end;
  5199. >function TOutlineViewer.Iterate(Action: Pointer; CallerFrame: LongWord;
  5200. >                                CheckRslt: Boolean): Pointer;
  5201. >var
  5202. >  Position: Integer;
  5203. >
  5204. >  function TraverseTree(Cur: Pointer; Level: Integer;
  5205. >    Lines: LongInt; LastChild: Boolean): Pointer; far;
  5206. >  label
  5207. >    Retn;
  5208. >  var
  5209. >    J, ChildCount: Integer;
  5210. >    Ret: Pointer;
  5211. >    Flags: Word;
  5212. >    Children: Boolean;
  5213. >    ok:BOOLEAN;
  5214. >    p:FUNCTION(Cur:POINTER;Level:INTEGER;Pos:INTEGER;Lines:LONGINT;
  5215. >               Flags:WORD;CallerFrame:LONGWORD):BOOLEAN;
  5216. >  begin
  5217. >    TraverseTree := Cur;
  5218. >    if Cur = nil then Exit;
  5219. >
  5220. >    Children := HasChildren(Cur);
  5221. >
  5222. >    Flags := 0;
  5223. >    if LastChild then Inc(Flags, ovLast);
  5224. >    if Children and IsExpanded(Cur) then Inc(Flags, ovChildren);
  5225. >    if not Children or IsExpanded(Cur) then Inc(Flags, ovExpanded);
  5226. >
  5227. >    Inc(Position);
  5228. >
  5229. >    { Perform call }
  5230. >    p:=Action;
  5231. >    ok:=p(Cur,Level,Position,Lines,Flags,CallerFrame);
  5232. >    ok:=ok AND CheckRslt;
  5233. >    IF ok then goto Retn;
  5234. >
  5235. >    if Children and IsExpanded(Cur) then
  5236. >    begin
  5237. >      ChildCount := GetNumChildren(Cur);
  5238. >
  5239. >      if not LastChild then Lines := Lines or (1 shl Level);
  5240. >      for J := 0 to ChildCount - 1 do
  5241. >      begin
  5242. >        Ret := TraverseTree(GetChild(Cur, J), Level + 1, Lines,
  5243. >          J = (ChildCount - 1));
  5244. >        TraverseTree := Ret;
  5245. >        if Ret <> nil then Exit;
  5246. >      end;
  5247. >    end;
  5248. >    TraverseTree := nil;
  5249. >  Retn:
  5250. >  end;
  5251. >
  5252. >begin  //Iterate
  5253. >  Position := -1;
  5254. >
  5255. >  asm                           { Convert 0, 1 to 0, FF }
  5256. >     DECB    $CheckRslt
  5257. >     NOTB    $CheckRslt
  5258. >  end;
  5259. >
  5260. >  Iterate := TraverseTree(GetRoot, 0, 0, True);
  5261. >end;
  5262. #end.
  5263. >begin
  5264. >end.
  5265. !BUILDTV.PAS
  5266. #  TextView,
  5267. >  {TextView,}
  5268. #begin
  5269. #end.
  5270. >begin
  5271. >end.
  5272. !MSGBOX.PAS
  5273. #{$O+,F+,X+,I-,S-}
  5274. >{$I-,S-}
  5275. #end.
  5276. >begin
  5277. >end.
  5278. !!
  5279.