home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / PROG / PASCAL / SPEED2 / SRC / LIB / SYSTEM.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1994-10-11  |  130.4 KB  |  5,422 lines

  1. {$%} {Forces the compiler to accept SYSTEM as a unit}
  2. UNIT SYSTEM;
  3.  
  4. {**************************************************************************
  5. *                                                                         *
  6. *                                                                         *
  7. *                                                                         *
  8. *         Main SYSTEM application routines and basic OS/2 APIs            *
  9. *                                                                         *
  10. *                                                                         *
  11. *                                                                         *
  12. *                                                                         *
  13. ***************************************************************************}
  14.  
  15.  
  16. INTERFACE
  17.  
  18. CONST
  19.      {Note: An ARRAY [0..x] OF CHAR is equal to a PSTRING[x] !}
  20.  
  21.  
  22.      MAXINT       =32767;
  23.      MININT       =-32768;
  24.      MAXLONGINT   =$7FFFFFFF;
  25.      MINLONGINT   =$80000001;
  26.      NULLHANDLE   =0;
  27.      NULL         =0;
  28.  
  29. TYPE
  30.      APIRET=LONGWORD;
  31.      PVOID=POINTER;
  32.  
  33.      SHANDLE=WORD;
  34.      LHANDLE=LONGWORD;
  35.  
  36. TYPE
  37.      UCHAR=BYTE;
  38.      USHORT=WORD;
  39.      ULONG=LONGWORD;
  40.      UINT=WORD;
  41.      LONG=LONGWORD;
  42.      SHORT=INTEGER;
  43.  
  44.      PSZ=PString;
  45.  
  46.      BOOL=LONGWORD;
  47.  
  48.      QWORD=RECORD
  49.                  ulLo:ULONG;
  50.                  ulHi:ULONG;
  51.            END;
  52.  
  53.      SEL=WORD;
  54.  
  55.      { Common Error definitions }
  56.      ERRORID=ULONG;
  57.  
  58. TYPE
  59.      HMODULE=LHANDLE;
  60.      PID=LHANDLE;
  61.      TID=LHANDLE;
  62.      SGID=USHORT;
  63.  
  64.      { Common SUP types }
  65.  
  66. TYPE
  67.      HAB=LHANDLE;
  68.  
  69.      { Common GPI/DEV types }
  70.  
  71.      HPS=LHANDLE;
  72.      HDC=LHANDLE;
  73.      HRGN=LHANDLE;
  74.      HBITMAP=LHANDLE;
  75.      HMF=LHANDLE;
  76.      HPAL=LHANDLE;
  77.      COLOR=LONGINT;
  78.  
  79. TYPE
  80.      POINTL=RECORD
  81.                   x:LONGINT;
  82.                   y:LONGINT;
  83.             END;
  84.  
  85.      POINTS=RECORD
  86.                   x:INTEGER;
  87.                   y:INTEGER;
  88.             END;
  89.  
  90.      RECTL=RECORD
  91.                xLeft:LONGINT;
  92.                yBottom:LONGINT;
  93.                xRight:LONGINT;
  94.                yTop:LONGINT;
  95.            END;
  96.  
  97. TYPE
  98.       HWND=LHANDLE;
  99.       HMQ=LHANDLE;
  100.       WRECT=RECTL;
  101.       WPOINT=POINTL;
  102.  
  103.      { font struct for Vio/GpiCreateLogFont }
  104.  
  105. CONST
  106.      { size for fields in the font structures }
  107.      FACESIZE                    =32;
  108.  
  109. TYPE
  110.      FATTRS=RECORD
  111.                   usRecordLength:USHORT;
  112.                   fsSelection:USHORT;
  113.                   lMatch:LONGINT;
  114.                   szFacename:PSTRING[FACESIZE-1];
  115.                   idRegistry:USHORT;
  116.                   usCodePage:USHORT;
  117.                   lMaxBaselineExt:LONGINT;
  118.                   lAveCharWidth:LONG;
  119.                   fsType:USHORT;
  120.                   fsFontUse:USHORT;
  121.            END;
  122.  
  123. TYPE
  124.      PANOSE=RECORD
  125.                   bFamilyType:BYTE;
  126.                   bSerifStyle:BYTE;
  127.                   bWeight:BYTE;
  128.                   bProportion:BYTE;
  129.                   bContrast:BYTE;
  130.                   bStrokeVariation:BYTE;
  131.                   bArmStyle:BYTE;
  132.                   bLetterform:BYTE;
  133.                   bMidline:BYTE;
  134.                   bXHeight:BYTE;
  135.                   fbPassedISO:BYTE;
  136.                   fbFailedISO:BYTE;
  137.             END;
  138.  
  139.      FONTMETRICS=RECORD
  140.                       szFamilyname:PSTRING[FACESIZE-1];
  141.                       szFacename:PSTRING[FACESIZE-1];
  142.                       idRegistry:USHORT;
  143.                       usCodePage:USHORT;
  144.                       lEmHeight:LONG;
  145.                       lXHeight:LONG;
  146.                       lMaxAscender:LONG;
  147.                       lMaxDescender:LONG;
  148.                       lLowerCaseAscent:LONG;
  149.                       lLowerCaseDescent:LONG;
  150.                       lInternalLeading:LONG;
  151.                       lExternalLeading:LONG;
  152.                       lAveCharWidth:LONG;
  153.                       lMaxCharInc:LONG;
  154.                       lEmInc:LONG;
  155.                       lMaxBaselineExt:LONG;
  156.                       sCharSlope:SHORT;
  157.                       sInlineDir:SHORT;
  158.                       sCharRot:SHORT;
  159.                       usWeightClass:USHORT;
  160.                       usWidthClass:USHORT;
  161.                       sXDeviceRes:SHORT;
  162.                       sYDeviceRes:SHORT;
  163.                       sFirstChar:SHORT;
  164.                       sLastChar:SHORT;
  165.                       sDefaultChar:SHORT;
  166.                       sBreakChar:SHORT;
  167.                       sNominalPointSize:SHORT;
  168.                       sMinimumPointSize:SHORT;
  169.                       sMaximumPointSize:SHORT;
  170.                       fsType:USHORT;
  171.                       fsDefn:USHORT;
  172.                       fsSelection:USHORT;
  173.                       fsCapabilities:USHORT;
  174.                       lSubscriptXSize:LONG;
  175.                       lSubscriptYSize:LONG;
  176.                       lSubscriptXOffset:LONG;
  177.                       lSubscriptYOffset:LONG;
  178.                       lSuperscriptXSize:LONG;
  179.                       lSuperscriptYSize:LONG;
  180.                       lSuperscriptXOffset:LONG;
  181.                       lSuperscriptYOffset:LONG;
  182.                       lUnderscoreSize:LONG;
  183.                       lUnderscorePosition:LONG;
  184.                       lStrikeoutSize:LONG;
  185.                       lStrikeoutPosition:LONG;
  186.                       sKerningPairs:SHORT;
  187.                       sFamilyClass:SHORT;
  188.                       lMatch:LONG;
  189.                       FamilyNameAtom:LONG;
  190.                       FaceNameAtom:LONG;
  191.                       _panose:PANOSE;
  192.                  END;
  193.  
  194. TYPE
  195.      PCHAR=^PSTRING;      {Pointer to Zero terminated string}
  196.  
  197.      PQMSG=^QMSG;
  198.      QMSG=RECORD
  199.               ahwnd:HWND;
  200.               msg:LONGWORD;
  201.               mp1:POINTER;
  202.               mp2:POINTER;
  203.               time:LONGWORD;
  204.               ptl:POINTL;
  205.               reserved:LONGWORD;
  206.           END;
  207.  
  208.      PSWP=^SWP;
  209.      SWP=RECORD
  210.                fl:ULONG;
  211.                cy:LONG;
  212.                cx:LONG;
  213.                y:LONG;
  214.                x:LONG;
  215.                hwndInsertBehind:HWND;
  216.                ahwnd:HWND;
  217.                ulReserved1:ULONG;
  218.                ulReserved2:ULONG;
  219.          END;
  220.  
  221.     PSWPBUF=^TSWPBUF;
  222.     TSWPBUF=ARRAY[0..20] OF SWP;
  223.  
  224.  
  225.     PLONGBUF=^TLONGBUF;
  226.     TLONGBUF=ARRAY[0..65530] OF LONGWORD;
  227.  
  228.     PScreenBuf=^ScreenBuf;
  229.     ScreenBuf=array[0..30] of string;
  230.  
  231.     _PDATETIME=^_DATETIME;
  232.     _DATETIME=RECORD
  233.                   hours:BYTE;
  234.                   minutes:BYTE;
  235.                   seconds:BYTE;
  236.                   hundredths:BYTE;
  237.                   day:BYTE;
  238.                   month:BYTE;
  239.                   year:WORD;
  240.                   timezone:INTEGER;
  241.                   weekday:BYTE;
  242.              END;
  243.  
  244. VAR PMScrBuf:PScreenBuf;
  245.  
  246. CONST
  247.      { Standard Window Messages }
  248.      WM_NULL                  =$0000;
  249.      WM_CREATE                =$0001;
  250.      WM_DESTROY               =$0002;
  251.      WM_ENABLE                =$0004;
  252.      WM_SHOW                  =$0005;
  253.      WM_MOVE                  =$0006;
  254.      WM_SIZE                  =$0007;
  255.      WM_ADJUSTWINDOWPOS       =$0008;
  256.      WM_CALCVALIDRECTS        =$0009;
  257.      WM_SETWINDOWPARAMS       =$000a;
  258.      WM_QUERYWINDOWPARAMS     =$000b;
  259.      WM_HITTEST               =$000c;
  260.      WM_ACTIVATE              =$000d;
  261.      WM_SETFOCUS              =$000f;
  262.      WM_SETSELECTION          =$0010;
  263.      WM_PPAINT                =$0011;
  264.      WM_PSETFOCUS             =$0012;
  265.      WM_PSYSCOLORCHANGE       =$0013;
  266.      WM_PSIZE                 =$0014;
  267.      WM_PACTIVATE             =$0015;
  268.      WM_PCONTROL              =$0016;
  269.      WM_COMMAND               =$0020;
  270.      WM_SYSCOMMAND            =$0021;
  271.      WM_HELP                  =$0022;
  272.      WM_PAINT                 =$0023;
  273.      WM_TIMER                 =$0024;
  274.      WM_SEM1                  =$0025;
  275.      WM_SEM2                  =$0026;
  276.      WM_SEM3                  =$0027;
  277.      WM_SEM4                  =$0028;
  278.      WM_CLOSE                 =$0029;
  279.      WM_QUIT                  =$002a;
  280.      WM_SYSCOLORCHANGE        =$002b;
  281.      WM_SYSVALUECHANGED       =$002d;
  282.      WM_APPTERMINATENOTIFY    =$002e;
  283.      WM_PRESPARAMCHANGED      =$002f;
  284.  
  285.      { Control notification messages }
  286.      WM_CONTROL               =$0030;
  287.      WM_VSCROLL               =$0031;
  288.      WM_HSCROLL               =$0032;
  289.      WM_INITMENU              =$0033;
  290.      WM_MENUSELECT            =$0034;
  291.      WM_MENUEND               =$0035;
  292.      WM_DRAWITEM              =$0036;
  293.      WM_MEASUREITEM           =$0037;
  294.      WM_CONTROLPOINTER        =$0038;
  295.      WM_QUERYDLGCODE          =$003a;
  296.      WM_INITDLG               =$003b;
  297.      WM_SUBSTITUTESTRING      =$003c;
  298.      WM_MATCHMNEMONIC         =$003d;
  299.      WM_SAVEAPPLICATION       =$003e;
  300.  
  301.      { Frame window related messages }
  302.  
  303.      WM_FLASHWINDOW           =$0040;
  304.      WM_FORMATFRAME           =$0041;
  305.      WM_UPDATEFRAME           =$0042;
  306.      WM_FOCUSCHANGE           =$0043;
  307.  
  308.      WM_SETBORDERSIZE         =$0044;
  309.      WM_TRACKFRAME            =$0045;
  310.      WM_MINMAXFRAME           =$0046;
  311.      WM_SETICON               =$0047;
  312.      WM_QUERYICON             =$0048;
  313.      WM_SETACCELTABLE         =$0049;
  314.      WM_QUERYACCELTABLE       =$004a;
  315.      WM_TRANSLATEACCEL        =$004b;
  316.      WM_QUERYTRACKINFO        =$004c;
  317.      WM_QUERYBORDERSIZE       =$004d;
  318.      WM_NEXTMENU              =$004e;
  319.      WM_ERASEBACKGROUND       =$004f;
  320.      WM_QUERYFRAMEINFO        =$0050;
  321.      WM_QUERYFOCUSCHAIN       =$0051;
  322.      WM_OWNERPOSCHANGE        =$0052;
  323.      WM_CALCFRAMERECT         =$0053;
  324.      WM_WINDOWPOSCHANGED      =$0055;
  325.      WM_ADJUSTFRAMEPOS        =$0056;
  326.      WM_QUERYFRAMECTLCOUNT    =$0059;
  327.      WM_QUERYHELPINFO         =$005B;
  328.      WM_SETHELPINFO           =$005C;
  329.      WM_ERROR                 =$005D;
  330.      WM_REALIZEPALETTE        =$005E;
  331.  
  332.      { Key/Character input messages }
  333.      WM_CHAR                  =$007a;
  334.      WM_VIOCHAR               =$007b;
  335.  
  336.      { Mouse input messages }
  337.      WM_MOUSEFIRST            =$0070;
  338.      WM_MOUSELAST             =$0079;
  339.      WM_BUTTONCLICKFIRST      =$0071;
  340.      WM_BUTTONCLICKLAST       =$0079;
  341.      WM_MOUSEMOVE             =$0070;
  342.      WM_BUTTON1DOWN           =$0071;
  343.      WM_BUTTON1UP             =$0072;
  344.      WM_BUTTON1DBLCLK         =$0073;
  345.      WM_BUTTON2DOWN           =$0074;
  346.      WM_BUTTON2UP             =$0075;
  347.      WM_BUTTON2DBLCLK         =$0076;
  348.      WM_BUTTON3DOWN           =$0077;
  349.      WM_BUTTON3UP             =$0078;
  350.      WM_BUTTON3DBLCLK         =$0079;
  351.      WM_MOUSEMAP              =$007D;
  352.      WM_EXTMOUSEFIRST         =$0410;
  353.      WM_EXTMOUSELAST          =$0419;
  354.      WM_CHORD                 =$0410;
  355.      WM_BUTTON1MOTIONSTART    =$0411;
  356.      WM_BUTTON1MOTIONEND      =$0412;
  357.      WM_BUTTON1CLICK          =$0413;
  358.      WM_BUTTON2MOTIONSTART    =$0414;
  359.      WM_BUTTON2MOTIONEND      =$0415;
  360.      WM_BUTTON2CLICK          =$0416;
  361.      WM_BUTTON3MOTIONSTART    =$0417;
  362.      WM_BUTTON3MOTIONEND      =$0418;
  363.      WM_BUTTON3CLICK          =$0419;
  364.      WM_MOUSETRANSLATEFIRST   =$0420;
  365.      WM_MOUSETRANSLATELAST    =$0428;
  366.      WM_BEGINDRAG             =$0420;
  367.      WM_ENDDRAG               =$0421;
  368.      WM_SINGLESELECT          =$0422;
  369.      WM_OPEN                  =$0423;
  370.      WM_CONTEXTMENU           =$0424;
  371.      WM_CONTEXTHELP           =$0425;
  372.      WM_TEXTEDIT              =$0426;
  373.      WM_BEGINSELECT           =$0427;
  374.      WM_ENDSELECT             =$0428;
  375.      WM_PENFIRST              =$04C0;
  376.      WM_PENLAST               =$04FF;
  377.      WM_MMPMFIRST             =$0500;
  378.      WM_MMPMLAST              =$05FF;
  379.  
  380.      WM_HELPBASE              =$0F00; {Start of msgs for help manager}
  381.      WM_HELPTOP               =$0FFF; { End of msgs for help manager }
  382.  
  383.      WM_USER                  =$1000;
  384.  
  385. VAR CheckBreak:BOOLEAN;        {Enables/Disables Ctrl-Break checks}
  386.     ExitCode:WORD;             {The exitcode from main process}
  387.     ErrorAddr:LONGWORD;        {32 Bit linear error adress}
  388.     ExitProc:POINTER;          {Exit procedures chain}
  389.     IORESULT:LONGWORD;         {In/Out result code}
  390.     FPUResult:LONGWORD;        {FPU result code}
  391.     SEEKMODE:LongWord;         {Mode for file seek operations}
  392.     FILEMODE:LongWord;         {Mode for file open operations}
  393.     HeapOrg:Pointer;           {Bottom of heap}
  394.     HeapEnd:Pointer;           {End of heap}
  395.     HeapPtr:Pointer;           {Actual heap position}
  396.     HeapSize:LONGWORD;         {Size of heap}
  397.     PMCrtWindow:LONGWORD;      {CRT Window for text output}
  398.     PMCrtFrameHandle:LONGWORD; {Frame handle for CRT Window}
  399.     PMCrtTitle:STRING;         {Title for CRT Window}
  400.     DrawLocX,DrawLocY:LONGWORD;{Actual drawing position}
  401.     Apphandle:LONGWORD;        {Main application PM anchor handle}
  402.     AppQueueHandle:LONGWORD;   {Main application queue handle}
  403.     AlternateExit:BOOLEAN;     {Set if PMObject is active for WM_QUIT Message}
  404.     MaxLines:LONGWORD;         {Maximal count of crt lines}
  405.     TextCol,TextBackCol:LONGWORD;  {Current colors for text output}
  406.     CrtKeyCount:Byte;
  407.     KeyBuffer:array[0..33] of char;
  408.     CursorVisible:LONGWORD;    {indicates that cursor is visible/invisible}
  409.     MaxDrawStarty,MaxDrawLeny:LONGWORD;
  410.     ArgStart:POINTER; {Pointer to program arguments}
  411.     BlockReadResult:LONGWORD;
  412.     BlockWriteResult:LONGWORD;
  413.     DllModule:LONGWORD;  {When the module is a DLL Init Module at main BEGIN}
  414.     DllTerminating:LONGWORD; {When the module is a DLL Terminating flag at main BEGIN}
  415.     DllInitTermResult:LONGWORD; {indicates success of DLL init/term}
  416.     ModuleCount:BYTE; {If it is a DLL modules currently using this DLL}
  417.  
  418.  
  419.  
  420. CONST
  421.     rad=1;
  422.     deg=2;
  423.     gra=3;
  424.  
  425. VAR
  426.     IsNotRad:BOOLEAN;
  427.     ToRad,FromRad:EXTENDED;
  428.  
  429.  
  430. FUNCTION  MAXAVAIL:LongWord;
  431. FUNCTION  MEMAVAIL:LongWord;
  432. PROCEDURE GETMEM(var p:Pointer;size:LongWord);
  433. PROCEDURE FREEMEM(var p:pointer;size:LongWord);
  434. PROCEDURE NewSystemHeap;  {free the whole (!) heap and generate new heap}
  435.  
  436. PROCEDURE BYTEMOVE(var source;var dest;size:LongWord);
  437. PROCEDURE MOVE(var source;var dest;size:LongWord);
  438. PROCEDURE FILLCHAR(var dest;size:LongWord;value:byte);
  439.  
  440. FUNCTION POS(item:string;source:string):Byte;
  441. FUNCTION COPY(source:string;start,ende:Byte):String;
  442. PROCEDURE SUBSTR(VAR source:string;start,ende:Byte);
  443. FUNCTION ToStr(l:longint):string;
  444. FUNCTION  UPCASE(item:char):Char;
  445. PROCEDURE Insert(Source:String;VAR s:string;Ind:Byte);
  446. PROCEDURE Delete(Var s:string;Ind:byte;len:byte);
  447. PROCEDURE CopyStrPChar(s:String;VAR p:PCHAR);
  448. PROCEDURE CopyPCharStr(p:PChar;VAR s:STRING);
  449. PROCEDURE Beep(Freq,duration:LONGWORD);
  450.  
  451. PROCEDURE Seek(var f:file;n:LongWord);
  452. FUNCTION FilePos(var f:file):LongWord;
  453. FUNCTION FileSize(var f:file):LongWord;
  454. PROCEDURE Reset(var f:file;recsize:LongWord);
  455. PROCEDURE Rewrite(var f:file;recsize:LongWord);
  456. PROCEDURE BlockWrite(VAR f:file;var Buf;Count:LongWord);
  457. PROCEDURE BlockRead(VAR f:file;var Buf;Count:LongWord);
  458. PROCEDURE Rename(VAR f:file;Newname:String);
  459. PROCEDURE CLOSE(VAR f:file);
  460. PROCEDURE ASSIGN(VAR f:file;s:String);
  461. FUNCTION Eof(VAR f:FILE):Boolean;
  462. PROCEDURE Erase(name:STRING);
  463. PROCEDURE CHDIR(path:string);
  464. PROCEDURE GETDIR(drive:byte;var path:string);
  465. PROCEDURE RMDIR(dir:string);
  466. PROCEDURE MKDIR(dir:string);
  467.  
  468. PROCEDURE ClrScr;
  469. FUNCTION KeyPressed: Boolean;
  470. FUNCTION ReadKey: Char;
  471. PROCEDURE CreateLogFont(_HPS:LONGWORD;VAR facename:STRING;hei,len,
  472.                         SelAttr:LONGWORD);
  473. PROCEDURE GOTOXY(x,y:LONGWORD);
  474.  
  475. FUNCTION  PARAMSTR(item:Byte):string;
  476. FUNCTION  PARAMCOUNT:Byte;
  477. PROCEDURE PutMemPtr(p:Pointer;Offset:LONGWORD;Value:BYTE);
  478. FUNCTION GetMemPtr(p:Pointer;Offset:LONGWORD):BYTE;
  479. PROCEDURE Halt(code:BYTE);
  480. PROCEDURE RunError(Code:BYTE);
  481. PROCEDURE SetTrigMode(mode:BYTE);
  482.  
  483. PROCEDURE MainDispatchLoop;
  484.  
  485. FUNCTION LongToPointer(l:LONGWORD):POINTER;
  486. FUNCTION PointerToLong(p:POINTER):LONGWORD;
  487.  
  488. PROCEDURE Randomize;
  489. FUNCTION  Random(value:word):word;
  490.  
  491. FUNCTION SHORT1FROMMP(p:POINTER):WORD;
  492. FUNCTION SHORT2FROMMP(p:POINTER):WORD;
  493. FUNCTION MPFrom2Short(s1,s2:Word):POINTER;
  494. FUNCTION MPFromShort(s:Word):POINTER;
  495.  
  496.  
  497. IMPLEMENTATION
  498.  
  499.  
  500. FUNCTION SHORT1FROMMP(p:POINTER):WORD;ASM;
  501. BEGIN
  502.      ASM
  503.         MOV EBX,ESP
  504.         MOV AX,[EBX+4]
  505.         RETN32 4
  506.      END;
  507. END;
  508.  
  509. FUNCTION SHORT2FROMMP(p:POINTER):WORD;ASM;
  510. BEGIN
  511.  
  512.      ASM
  513.         MOV EBX,ESP
  514.         MOV AX,[EBX+6]
  515.         RETN32 4
  516.      END;
  517. END;
  518.  
  519. FUNCTION MPFrom2Short(s1,s2:Word):POINTER;ASM;
  520. BEGIN
  521.      ASM
  522.         MOV EBX,ESP
  523.         MOV AX,[EBX+4]
  524.         PUSH AX
  525.         MOV AX,[EBX+6]
  526.         PUSH AX
  527.         POP EAX
  528.         RETN32 4
  529.      END;
  530. END;
  531.  
  532. FUNCTION MPFromShort(s:Word):POINTER;ASM;
  533. BEGIN
  534.      ASM
  535.         MOV EBX,ESP
  536.         MOV AX,[EBX+4]
  537.         MOVZX EAX,AX
  538.         RETN32 2
  539.      END;
  540. END;
  541.  
  542.  
  543. {**************************************************************************
  544. *                                                                         *
  545. *  Set support routines                                                   *
  546. *                                                                         *
  547. ***************************************************************************}
  548.  
  549. ASSEMBLER
  550.  
  551. !SetAssign PROC NEAR32
  552.           PUSH EBP
  553.           MOV EBP,ESP
  554.  
  555.           MOV EDI,[EBP+8]   ;Ziel
  556.           MOV ECX,8
  557.           MOV EAX,0
  558.           CLD
  559.           REP
  560.           STOSW
  561.  
  562.           MOV EDI,[EBP+8]   ;Ziel
  563.           MOV CX,[EBP+12]   ;Parameter count
  564.           CMP CX,0
  565.           JE !NSAs          ;only clear set
  566.           MOVZX ECX,CX
  567.           LEA ESI,[EBP+14]  ;Points to first parameter
  568. !plo:
  569.           MOV AL,[ESI+0]    ;Get value of parameter
  570.           XOR AH,AH
  571.           MOV BX,16
  572.           XOR EDX,EDX
  573.           DIV BX            ;Calculate Word position
  574.           SHL AX,1
  575.           MOVZX EAX,AX
  576.           ADD EDI,EAX
  577.           MOV AX,DX         ;Bit Position [0..15]
  578.           SHL AX,1
  579.           MOVZX EAX,AX
  580.           MOV EBX,OFFSET(@SetTab)
  581.           ADD EBX,EAX
  582.           MOV AX,[EBX+0]
  583.           MOVZX EAX,AX
  584.           MOV BX,[EDI+0]    ;Old Value
  585.           OR AX,BX
  586.           MOV [EDI+0],AX    ;Store new value
  587.  
  588.           INC ESI
  589.           INC ESI
  590.           MOV EDI,[EBP+8]   ;Ziel
  591.           LOOP !plo         ;until all parameters processed
  592. !NSAs:
  593.           LEAVE
  594.           RETN32 6          ;Return to caller
  595. @SetTab dw 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768
  596. !SetAssign ENDP
  597.  
  598. !SetAnd PROC NEAR32
  599.           PUSH EBP
  600.           MOV EBP,ESP
  601.           MOV EDI,[EBP+8]   ;Ziel
  602.           MOV ESI,[EBP+12]
  603.           MOV ECX,8
  604. !SAndl:
  605.           MOV EAX,[ESI+0]
  606.           AND EAX,[EDI+0]
  607.           MOV [EDI+0],EAX
  608.           ADD ESI,4
  609.           ADD EDI,4
  610.           LOOP !SAndl
  611.  
  612.           LEAVE
  613.           RETN32 8
  614. !SetAnd ENDP
  615.  
  616. !NegateSet PROC NEAR32
  617.           PUSH EBP
  618.           MOV EBP,ESP
  619.  
  620.           MOV EDI,[EBP+8]
  621.           MOV ECX,8
  622. !NS_l:
  623.           MOV EAX,[EDI+0]
  624.           NOT EAX
  625.           MOV [EDI+0],EAX
  626.           ADD EDI,4
  627.           LOOP !NS_l
  628.  
  629.           LEAVE
  630.           RETN32 4
  631. !NegateSet ENDP
  632.  
  633. !TempSetAnd PROC NEAR32
  634.            PUSH EBP
  635.            MOV EBP,ESP
  636.            SUB ESP,32
  637.  
  638.            MOV EDI,[EBP+8]   ;Ziel
  639.            MOV CL,[EBP+12]   ;Count
  640.            MOVZX ECX,CL
  641.            LEA ESI,[EBP+14]  ;First Parameter
  642. !TSAl:
  643.            MOV AX,[ESI+0]
  644.            PUSH AX
  645.            INC ESI
  646.            INC ESI
  647.            LOOP !TSAl
  648.            MOV CL,[EBP+12]   ;Count
  649.            XOR CH,CH
  650.            PUSH CX
  651.            LEA EAX,[EBP-32]
  652.            PUSH EAX
  653.            CALLN32 !SetAssign
  654.            MOV AL,[EBP+12]   ;Count
  655.            MOVZX EAX,AL
  656.            SHL EAX,1
  657.            ADD ESP,EAX
  658.  
  659.            LEA EAX,[EBP-32]
  660.            PUSH EAX
  661.            MOV EAX,[EBP+8]   ;Ziel
  662.            PUSH EAX
  663.            CALLN32 !SetAnd
  664.  
  665.            LEAVE
  666.            RETN32 6
  667. !TempSetAnd ENDP
  668.  
  669. !SetOr PROC NEAR32
  670.           PUSH EBP
  671.           MOV EBP,ESP
  672.           MOV EDI,[EBP+8]   ;Ziel
  673.           MOV ESI,[EBP+12]
  674.           MOV ECX,8
  675. !SAndl_1:
  676.           MOV EAX,[ESI+0]
  677.           OR EAX,[EDI+0]
  678.           MOV [EDI+0],EAX
  679.           ADD ESI,4
  680.           ADD EDI,4
  681.           LOOP !SAndl_1
  682.  
  683.           LEAVE
  684.           RETN32 8
  685. !SetOr ENDP
  686.  
  687. !TempSetOr PROC NEAR32
  688.            PUSH EBP
  689.            MOV EBP,ESP
  690.            SUB ESP,32
  691.  
  692.            MOV EDI,[EBP+8]   ;Ziel
  693.            MOV CL,[EBP+12]   ;Count
  694.            MOVZX ECX,CL
  695.            LEA ESI,[EBP+14]  ;First Parameter
  696. !TSAl_1:
  697.            MOV AX,[ESI+0]
  698.            PUSH AX
  699.            INC ESI
  700.            INC ESI
  701.            LOOP !TSAl_1
  702.            MOV CL,[EBP+12]   ;Count
  703.            XOR CH,CH
  704.            PUSH CX
  705.            LEA EAX,[EBP-32]
  706.            PUSH EAX
  707.            CALLN32 !SetAssign
  708.            MOV AL,[EBP+12]   ;Count
  709.            MOVZX EAX,AL
  710.            SHL EAX,1
  711.            ADD ESP,EAX
  712.  
  713.            LEA EAX,[EBP-32]
  714.            PUSH EAX
  715.            MOV EAX,[EBP+8]   ;Ziel
  716.            PUSH EAX
  717.            CALLN32 !SetOr
  718.  
  719.            LEAVE
  720.            RETN32 6
  721. !TempSetOr ENDP
  722.  
  723. !SetAndNot PROC NEAR32
  724.           PUSH EBP
  725.           MOV EBP,ESP
  726.           MOV EDI,[EBP+8]   ;Ziel
  727.           MOV ESI,[EBP+12]
  728.           MOV ECX,8
  729. !SAndl_2:
  730.           MOV EAX,[ESI+0]
  731.           NOT EAX
  732.           AND EAX,[EDI+0]
  733.           MOV [EDI+0],EAX
  734.           ADD ESI,4
  735.           ADD EDI,4
  736.           LOOP !SAndl_2
  737.  
  738.           LEAVE
  739.           RETN32 8
  740. !SetAndNot ENDP
  741.  
  742. !TempSetAndNot PROC NEAR32
  743.            PUSH EBP
  744.            MOV EBP,ESP
  745.            SUB ESP,32
  746.  
  747.            MOV EDI,[EBP+8]   ;Ziel
  748.            MOV CL,[EBP+12]   ;Count
  749.            MOVZX ECX,CL
  750.            LEA ESI,[EBP+14]  ;First Parameter
  751. !TSAl_2:
  752.            MOV AX,[ESI+0]
  753.            PUSH AX
  754.            INC ESI
  755.            INC ESI
  756.            LOOP !TSAl_2
  757.            MOV CL,[EBP+12]   ;Count
  758.            XOR CH,CH
  759.            PUSH CX
  760.            LEA EAX,[EBP-32]
  761.            PUSH EAX
  762.            CALLN32 !SetAssign
  763.            MOV AL,[EBP+12]   ;Count
  764.            MOVZX EAX,AL
  765.            SHL EAX,1
  766.            ADD ESP,EAX
  767.  
  768.            LEA EAX,[EBP-32]
  769.            PUSH EAX
  770.            MOV EAX,[EBP+8]   ;Ziel
  771.            PUSH EAX
  772.            CALLN32 !SetAndNot
  773.  
  774.            LEAVE
  775.            RETN32 6
  776. !TempSetAndNot ENDP
  777.  
  778. !SetCompare PROC NEAR32
  779.           PUSH EBP
  780.           MOV EBP,ESP
  781.           MOV EDI,[EBP+8]   ;Ziel
  782.           MOV ESI,[EBP+12]
  783.           MOV ECX,8
  784. !SCAndl_2:
  785.           MOV EAX,[ESI+0]
  786.           CMP EAX,[EDI+0]
  787.           JNE !SCNot
  788.           ADD ESI,4
  789.           ADD EDI,4
  790.           LOOP !SCAndl_2
  791.           MOV AX,0          ;Sets are equal
  792.           LEAVE
  793.           RETN32 8
  794. !SCNot:
  795.           MOV AX,1          ;not equal
  796.           LEAVE
  797.           RETN32 8
  798. !SetCompare ENDP
  799.  
  800. !TempSetCompare PROC NEAR32
  801.            PUSH EBP
  802.            MOV EBP,ESP
  803.            SUB ESP,32
  804.  
  805.            MOV EDI,[EBP+8]   ;Ziel
  806.            MOV CL,[EBP+12]   ;Count
  807.            MOVZX ECX,CL
  808.            LEA ESI,[EBP+14]  ;First Parameter
  809. !TCSAl_2:
  810.            MOV AX,[ESI+0]
  811.            PUSH AX
  812.            INC ESI
  813.            INC ESI
  814.            LOOP !TCSAl_2
  815.            MOV CL,[EBP+12]   ;Count
  816.            XOR CH,CH
  817.            PUSH CX
  818.            LEA EAX,[EBP-32]
  819.            PUSH EAX
  820.            CALLN32 !SetAssign
  821.            MOV AL,[EBP+12]   ;Count
  822.            MOVZX EAX,AL
  823.            SHL EAX,1
  824.            ADD ESP,EAX
  825.  
  826.            LEA EAX,[EBP-32]
  827.            PUSH EAX
  828.            MOV EAX,[EBP+8]   ;Ziel
  829.            PUSH EAX
  830.            CALLN32 !SetCompare
  831.  
  832.            LEAVE
  833.            RETN32 6
  834. !TempSetCompare ENDP
  835.  
  836. END;
  837.  
  838.  
  839.  
  840.  
  841.  
  842. {***************************************************************************
  843. *                                                                          *
  844. *     Random numbers support                                               *
  845. *                                                                          *
  846. ****************************************************************************}
  847.  
  848.  
  849. PROCEDURE Randomize;
  850. VAR d:_DateTime;
  851.     Hour,Minute,Second,Sec100:BYTE;
  852. BEGIN
  853.      ASM
  854.         LEA EAX,$d
  855.         PUSH EAX
  856.         MOV AL,1
  857.         CALLDLL DosCalls,230  ;DosGetDateTime
  858.         ADD ESP,4
  859.      END;
  860.      Hour:=d.hours;
  861.      Minute:=d.minutes;
  862.      Second:=d.Seconds;
  863.      Sec100:=d.Hundredths;
  864.      ASM
  865.         MOV CL,$Minute
  866.         MOV CH,$Hour
  867.         MOV DH,$Second
  868.         MOV DL,$Sec100
  869.         MOV !RandSeed,CX
  870.         MOV !RandSeed+2,DX
  871.      END;
  872. END;
  873.  
  874. ASSEMBLER
  875.  
  876. !NextRandom PROC NEAR32
  877.             MOV AX,!RandSeed
  878.             MOV BX,!RandSeed+2
  879.             MOV CX,AX
  880.             MULW !Factor
  881.             SHL CX,3
  882.             ADD CH,CL
  883.             ADD DX,CX
  884.             ADD DX,BX
  885.             SHL BX,2
  886.             ADD DX,BX
  887.             ADD DH,BL
  888.             MOV CL,5
  889.             SHL BX,CL
  890.             ADD DH,BL
  891.             ADD AX,1
  892.             ADC DX,0
  893.             MOV !RandSeed,AX
  894.             MOV !RandSeed+2,DX
  895.             RETN32
  896. !NextRandom ENDP
  897.  
  898. END;
  899.  
  900. FUNCTION  RANDOM(value:word):word;ASM;
  901. BEGIN
  902.      ASM
  903.            PUSH EBP
  904.            MOV EBP,ESP
  905.            CALLN32 !NextRandom
  906.            MOV CX,DX
  907.            MOV BX,[EBP+8]
  908.            MUL BX
  909.            MOV AX,CX
  910.            MOV CX,DX
  911.            MUL BX
  912.            ADD AX,CX
  913.            ADC DX,0
  914.            MOV AX,DX
  915.            LEAVE
  916.            RETN32 2
  917.      END;
  918. END;
  919.  
  920.  
  921. {***************************************************************************
  922. *                                                                          *
  923. *   Memory management                                                      *
  924. *                                                                          *
  925. ****************************************************************************}
  926.  
  927.  
  928. PROCEDURE NewSystemHeap;  {delete old system heap and create new one}
  929. BEGIN
  930.     {Free old system heap and generate new}
  931.     ASM
  932.        ;Free old system heap
  933.        PUSHL _HeapOrg
  934.        MOV AL,1
  935.        CALLDLL DosCalls,347   ;DosSubUnsetMem
  936.        ADD ESP,4
  937.        PUSHL _HeapOrg
  938.        MOV AL,1
  939.        CALLDLL DosCalls,304   ;DosFreeMem
  940.        ADD ESP,4
  941.  
  942.        ;generate new system heap
  943.        MOV EAX,_HeapSize    ;Allocate private memory
  944.        PUSHL 3         ;Flags PAG_READ|PAG_WRITE
  945.        PUSH EAX        ;Length of memory
  946.        PUSHL OFFSET(_Heaporg)
  947.        MOV AL,3             ;3 Parameters
  948.        CALLDLL DosCalls,299 ;DosAllocMem
  949.        ADD ESP,12            ;Clear Stack
  950.  
  951.        ;Prepare the memory block for suballocation
  952.        PUSHL _HeapSize      ;Size of Heap
  953.        PUSHL 5              ;Flags DOSSUB_INIT|DOSSUB_SPARSE_OBJ
  954.        PUSHL _Heaporg
  955.        MOV AL,3
  956.        CALLDLL DosCalls,344 ;DosSubSetMem
  957.        ADD ESP,12            ;Clear Stack
  958.  
  959.        ;Set the system pointers
  960.        MOV EAX,_HeapOrg
  961.        MOV _HeapPtr,EAX
  962.        ADD EAX,_HeapSize
  963.        MOV _HeapEnd,EAX
  964.     END;
  965. END;
  966.  
  967. FUNCTION LongToPointer(l:LONGWORD):POINTER;ASM;
  968. BEGIN
  969.      ASM
  970.         MOV EBX,ESP
  971.         MOV EAX,[EBX+4]
  972.         RETN32 4
  973.      END;
  974. END;
  975.  
  976. FUNCTION PointerToLong(p:POINTER):LONGWORD;ASM;
  977. BEGIN
  978.      ASM
  979.         MOV EBX,ESP
  980.         MOV EAX,[EBX+4]
  981.         RETN32 4
  982.      END;
  983. END;
  984.  
  985.  
  986. PROCEDURE PutMemPtr(p:Pointer;Offset:LONGWORD;Value:BYTE);
  987. BEGIN
  988.      ASM
  989.         MOV EDI,$p
  990.         ADD EDI,$Offset
  991.         MOV AL,$Value
  992.         MOV [EDI+0],AL
  993.      END;
  994. END;
  995.  
  996. FUNCTION GetMemPtr(p:Pointer;Offset:LONGWORD):BYTE;ASM;
  997. BEGIN
  998.      ASM
  999.         PUSH EBP
  1000.         MOV EBP,ESP
  1001.         MOV EDI,$p
  1002.         ADD EDI,$Offset
  1003.         MOV AL,[EDI+0]
  1004.         LEAVE
  1005.         RETN32 8
  1006.      END;
  1007. END;
  1008.  
  1009.  
  1010.  
  1011.  
  1012. ASSEMBLER
  1013.  
  1014. !ParaInfo PROC NEAR32  ;(AL=Function - 1 count of parameters to CL
  1015.                        ;               2 Pointer to parameter CL to ESI
  1016.                        ;Input:argument start in ESI
  1017.          MOV BX,0      ;we start with parameter 0
  1018.          CMP AL,2      ;get parameter name ?
  1019.          JNE !no_name
  1020.          PUSH ESI
  1021.          CMP CL,0      ;parameter 0 required ?
  1022.          JE !no_args   ;Thats cool (or it sucks)
  1023.          POP ESI
  1024. !no_name:
  1025.          ;Overread the EXE file name
  1026.          CLD
  1027.          PUSH AX
  1028. !rrloop:
  1029.          LODSB
  1030.          CMP AL,0
  1031.          JNE !rrloop
  1032.          POP AX
  1033.  
  1034.          CMP AL,2   ;get parameter name ?
  1035.          JE !get_argname
  1036.          MOV CL,255 ;impossible parameter
  1037. !get_argname:
  1038.          XOR CH,CH
  1039.          MOV BX,1      ;now finally we start with parameter 1
  1040.  
  1041.          LODSB
  1042.          ;check whether the first character is a separator
  1043.          CMP AL,' '
  1044.          JE !aagain
  1045.          CMP AL,0   ;is this already the end -->Urrgh !
  1046.          JNE !al2
  1047.          PUSHL 0    ;The (nonexistent) parameters -->Throw it away guy !
  1048.          MOV BL,0   ;No parameters
  1049.          JMP !no_args
  1050. !al2:
  1051.          DEC ESI    ;restore old position
  1052. !aagain:
  1053.          PUSH ESI   ;save last adress
  1054.          CMP CL,BL  ;is the parameter reached ??
  1055.          JE !no_args
  1056. !readloop:
  1057.          LODSB
  1058.          CMP AL,0
  1059.          JE !no_args1  ;No more arguments detected
  1060.          ;check all separators possible
  1061.          CMP AL,' '
  1062.          JE !separator
  1063.          ;No separator --> normal character
  1064.          JMP !readloop
  1065. !separator:
  1066.          ;Check whether more separators follow
  1067.          LODSB
  1068.          CMP AL,' '
  1069.          JE !one_more
  1070.          CMP AL,0      ;A zero parameter is stupid
  1071.          JNE !no_more
  1072.          POP EAX       ;Clear stack
  1073.          PUSHL 0       ;The (nonexistent) parameter -->Throw it away guy !
  1074.          JMP !no_args
  1075. !one_more:
  1076.          JMP !separator
  1077. !no_more:
  1078.          DEC ESI
  1079.          INC BX        ;Increment parameter count
  1080.          POP EAX       ;clear stack
  1081.          JMP !aagain
  1082. !no_args1:
  1083.          ;Argument index was invalid
  1084.          POP ESI   ;Clear Stack
  1085.          PUSHL 0   ;Pointer to parameter is NIL
  1086. !no_args:
  1087.          MOV CL,BL     ;Parameter count
  1088.          POP ESI       ;Adress of last parameter
  1089.          RETN32
  1090. !ParaInfo ENDP
  1091.  
  1092. END;
  1093.  
  1094. FUNCTION  PARAMSTR(item:Byte):string;ASM;
  1095. BEGIN
  1096.      ASM
  1097.          PUSH EBP
  1098.          MOV EBP,ESP
  1099.          MOV CL,[EBP+12]             ;index to CL
  1100.          MOV AL,2                    ;Get Parameter name
  1101.          MOV ESI,_ArgStart
  1102.          CALLN32 !ParaInfo
  1103.          MOV EDI,[EBP+8]             ;Result string
  1104.          MOVB [EDI+0],0              ;Result string is empty
  1105.          CMP ESI,0                   ;Parameter invalid ?
  1106.          JE _Lpe                     ;--> It sucks !
  1107.  
  1108.          MOV EDI,[EBP+8]             ;result string
  1109.          XOR AL,AL    ;Stringlen to 0
  1110.          STOSB
  1111.          MOV CL,0     ;Len is 0
  1112.          CLD
  1113. __lp1:
  1114.          LODSB
  1115.          ;Check all separators
  1116.          CMP AL,' '
  1117.          JE __Lps
  1118.          CMP AL,0    ;Last parameter
  1119.          JE __Lps
  1120.          INC CL
  1121.          ;No separator --> save
  1122.          STOSB
  1123.          JMP __lp1
  1124. __Lps:
  1125.          MOV AL,0              ;terminate string with zero
  1126.          STOSB
  1127.          MOV EDI,[EBP+8]       ;Result string
  1128.          MOV [EDI+0],CL        ;set Stringlen
  1129. _lpe:
  1130.          LEAVE
  1131.          RETN32 6
  1132.     END;
  1133. END;
  1134.  
  1135.  
  1136.  
  1137. FUNCTION  PARAMCOUNT:Byte;ASM;
  1138. BEGIN
  1139.      ASM
  1140.            MOV AL,1  ;get parametercount
  1141.            MOV ESI,_ArgStart
  1142.            CALLN32 !ParaInfo
  1143.            MOV AL,CL
  1144.            XOR AH,AH
  1145.            RETN32
  1146.      END;
  1147. END;
  1148.  
  1149.  
  1150.  
  1151. PROCEDURE Beep(Freq,duration:LONGWORD);
  1152. BEGIN
  1153.      ASM
  1154.          PUSHL $duration
  1155.          PUSHL $freq
  1156.          MOV AL,2
  1157.          CALLDLL DOSCALLS,286  ;DosBeep
  1158.          ADD ESP,8
  1159.      END;
  1160. END;
  1161.  
  1162.  
  1163.  
  1164. PROCEDURE MainDispatchLoop;
  1165. VAR _qmsg:QMSG;
  1166. BEGIN
  1167.      ASM
  1168. !ndis:
  1169.         PUSHL 0
  1170.         PUSHL 0
  1171.         PUSHL 0
  1172.         LEA EAX,$_qmsg
  1173.         PUSH EAX
  1174.         PUSHL _AppHandle
  1175.         MOV AL,5
  1176.         CALLDLL PMWIN,915  ;WinGetMsg
  1177.         ADD ESP,20
  1178.         CMP EAX,0
  1179.         JE !exdis
  1180.  
  1181.         LEA EAX,$_qmsg
  1182.         PUSH EAX
  1183.         PUSHL _AppHandle
  1184.         MOV AL,2
  1185.         CALLDLL PMWIN,912  ;WinDispatchMsg
  1186.         ADD ESP,8
  1187.         JMP !ndis
  1188. !exdis:
  1189.      END;
  1190. END;
  1191.  
  1192. PROCEDURE CopyStrPChar(s:String;VAR p:PCHAR);ASM;
  1193. BEGIN
  1194.      ASM
  1195.         MOV EBX,ESP
  1196.         MOV ESI,[EBX+8]  ;Source
  1197.         MOV EDI,[EBX+4] ;Dest
  1198.         MOV CL,[ESI+0]
  1199.         INC ESI
  1200.         MOVZX ECX,CL
  1201.         CMP CX,0
  1202.         JE !scpc
  1203.         CLD
  1204.         REP
  1205.         MOVSB
  1206. !scpc:
  1207.         MOVB [EDI+0],0
  1208.  
  1209.         RETN32 8
  1210.      END;
  1211. END;
  1212.  
  1213. PROCEDURE CopyPCharStr(p:PChar;VAR s:String);ASM;
  1214. BEGIN
  1215.      ASM
  1216.         MOV EBX,ESP
  1217.  
  1218.         MOV ESI,[EBX+8]  ;Source
  1219.         MOV EDI,[EBX+4] ;Dest
  1220.         PUSH EDI
  1221.         INC EDI
  1222.         MOV CL,0
  1223.         CLD
  1224. !aclo:
  1225.         LODSB
  1226.         CMP AL,0
  1227.         JE !scpc_1
  1228.         STOSB
  1229.         INC CL
  1230.         JMP !aclo
  1231. !scpc_1:
  1232.         POP EDI
  1233.         MOV [EDI+0],CL
  1234.  
  1235.         RETN32 8
  1236.      END;
  1237. END;
  1238.  
  1239. ASSEMBLER
  1240.  
  1241. !Concat PROC NEAR32
  1242.         MOV EBX,ESP
  1243.         MOV EDI,[EBX+8]    ;s
  1244.         MOV ESI,[EBX+4]    ;s1
  1245.         MOVZXB ECX,[EDI+0] ;length of s
  1246.         CLD
  1247.         LODSB
  1248.         ADD [EDI+0],AL
  1249.         JNC !!ll1
  1250.         MOVB [EDI+0],255
  1251.         MOV AL,CL
  1252.         NOT AL
  1253. !!ll1:
  1254.         ADD EDI,ECX
  1255.         INC EDI
  1256.         MOV CL,AL
  1257.         REP
  1258.         MOVSB
  1259.         MOV AL,0      ;Abschluß PChar
  1260.         STOSB
  1261.         RETN32 4
  1262. !Concat ENDP
  1263.  
  1264. END; {Assembler}
  1265.  
  1266. PROCEDURE Halt(code:BYTE);ASM;
  1267. BEGIN
  1268.      ASM
  1269.         MOV EBX,ESP
  1270.         MOV AL,[EBX+4]
  1271.         XOR AH,AH
  1272.         MOV _ExitCode,AX
  1273.         CMPD _PMCrtWindow,0   ;is a CrtWindow created ?
  1274.         JE !qt                ;No !
  1275.         CALLN32 _MainDispatchLoop ;Wait until CRT terminates
  1276. !qt:
  1277.         MOV AX,_ExitCode  ;ExitCode holen
  1278.         XOR AH,AH
  1279.         CMP AL,0   ;Fehler aufgetreten ?
  1280.         JE noexerr
  1281.  
  1282.         PUSH AX      ;Save Return code
  1283.  
  1284.         MOV EDI,OFFSET(!ErrorMsg)
  1285.         ADD EDI,24   ;Focus after error
  1286.         XOR AH,AH
  1287.         MOV BX,10
  1288.         XOR ECX,ECX
  1289. Lw46_111:
  1290.         XOR EDX,EDX
  1291.         DIV BX
  1292.         PUSH DX
  1293.         INC CX
  1294.         OR AX,AX
  1295.         JNE Lw46_111
  1296. Lw47_111:
  1297.         POP AX
  1298.         ADD AL,'0'
  1299.         MOV [EDI+0],AL
  1300.         INC EDI
  1301.         LOOP Lw47_111
  1302.  
  1303.         ;Insert the error Adress
  1304.         MOVB [EDI+0],32
  1305.         MOVB [EDI+1],'a'
  1306.         MOVB [EDI+2],'t'
  1307.         MOVB [EDI+3],32
  1308.         ADD EDI,4
  1309.  
  1310.         MOV EAX,_ErrorAddr
  1311.         SUB EAX,4
  1312.         MOV EBX,16
  1313.         XOR ECX,ECX
  1314. Lw46_112:
  1315.         XOR EDX,EDX
  1316.         DIV EBX
  1317.         PUSH DX
  1318.         INC CX
  1319.         OR EAX,EAX
  1320.         JNE Lw46_112
  1321. Lw47_112:
  1322.         POP AX
  1323.         ADD AL,'0'
  1324.         CMP AL,57
  1325.         JNA !g57
  1326.         ADD AL,7
  1327. !g57:
  1328.         MOV [EDI+0],AL
  1329.         INC EDI
  1330.         LOOP Lw47_112
  1331.         MOVB [EDI+0],0
  1332.  
  1333.         PUSHL 1200
  1334.         PUSHL 200
  1335.         CALLN32 _Beep
  1336.  
  1337.         PUSHL 4010h                  ;MB_OK|MB_MOVEABLE|MB_QUERY
  1338.         PUSHL 0
  1339.         PUSHL OFFSET(@Err)
  1340.         PUSHL OFFSET(!ErrorMsg)
  1341.         PUSHL 1
  1342.         PUSHL 1
  1343.         MOV AL,6
  1344.         CALLDLL PMWin,789        ;WinMessageBox
  1345.         ADD ESP,24
  1346.  
  1347.  
  1348.         POP AX     ;Get Return Code
  1349. noexerr:
  1350.         PUSH AX
  1351.  
  1352.         MOV EAX,_PMCrtWindow
  1353.         CMP EAX,0
  1354.         JE !nodel
  1355.  
  1356.         PUSHL _PMCrtWindow
  1357.         MOV AL,1
  1358.         CALLDLL PMWIN,728   ;WinDestroyWindow
  1359.         ADD ESP,4
  1360. !nodel:
  1361.         ;Free system heap
  1362.         PUSHL _HeapOrg
  1363.         MOV AL,1
  1364.         CALLDLL DosCalls,347   ;DosSubUnsetMem
  1365.         ADD ESP,4
  1366.         PUSHL _HeapOrg
  1367.         MOV AL,1
  1368.         CALLDLL DosCalls,304   ;DosFreeMem
  1369.         ADD ESP,4
  1370.  
  1371.         PUSHL _AppQueueHandle
  1372.         MOV AL,1
  1373.         CALLDLL PMWIN,726   ;WinDestroyMsgQueue
  1374.         ADD ESP,4
  1375.         PUSHL _AppHandle
  1376.         MOV AL,1
  1377.         CALLDLL PMWIN,888   ;WinTerminate
  1378.         ADD ESP,4
  1379.  
  1380.         POP AX
  1381.         MOVZX EAX,AX
  1382.         PUSHL 1               ;Exit the whole process
  1383.         PUSH EAX              ;Return Code
  1384.         MOV AL,2
  1385.         CALLDLL DosCalls,234  ;DosExit
  1386.         ADD ESP,8
  1387.         RETN32
  1388. @Err db 'Runtime error - Program terminated',0
  1389.     END; {asm}
  1390. END;
  1391.  
  1392. PROCEDURE RunError(Code:BYTE);ASM;
  1393. BEGIN
  1394.      ASM
  1395.         MOV EBX,ESP
  1396.         POP EAX            ;Adress from call
  1397.         MOV _ErrorAddr,EAX
  1398.         MOV AL,[EBX+4]
  1399.         XOR AH,AH
  1400.         MOV _ExitCode,AX
  1401. exloop:
  1402.         PUSHL OFFSET(@raddr) ;Return adress for ExitProc
  1403.         PUSHL _ExitProc    ;ExitProc on Stack
  1404.         RETN32             ;jump into ExitProc
  1405. @raddr
  1406.         JMP exloop  ;until termination
  1407.      END; {asm}
  1408. END;
  1409.  
  1410. PROCEDURE RunErrorIntern(Code:BYTE);ASM;
  1411. BEGIN
  1412.      ASM
  1413.         MOV EBX,ESP
  1414.         MOV AL,[EBX+4]
  1415.         XOR AH,AH
  1416.         MOV _ExitCode,AX
  1417. exloop:
  1418.         PUSHL OFFSET(@raddr) ;Return adress for ExitProc
  1419.         PUSHL _ExitProc    ;ExitProc on Stack
  1420.         RETN32             ;jump into ExitProc
  1421. @raddr
  1422.         JMP exloop  ;until termination
  1423.      END; {asm}
  1424. END;
  1425.  
  1426. ASSEMBLER
  1427.  
  1428. !PCharCopy PROC NEAR32
  1429.          MOV EBX,ESP
  1430.          MOV ESI,[EBX+8]
  1431.          MOV EDI,[EBX+4]
  1432.          CLD
  1433. !re:
  1434.          LODSB
  1435.          STOSB
  1436.          CMP AL,0
  1437.          JNE !re
  1438.          CLD
  1439.          RETN32 8
  1440. !PCharCopy ENDP
  1441.  
  1442. END;
  1443.  
  1444. PROCEDURE GetAPIMem(VAR p:POINTER;size:LONGWORD);
  1445. BEGIN
  1446.      ASM
  1447.         PUSHL 19        ;Flags PAG_READ|PAG_WRITE|PAG_COMMIT
  1448.         PUSHL $size     ;Length of memory
  1449.         PUSHL $p
  1450.         MOV AL,3             ;3 Parameters
  1451.         CALLDLL DosCalls,299 ;DosAllocMem
  1452.         ADD ESP,12            ;Clear Stack
  1453.         CMP EAX,0
  1454.         JE !eok
  1455.         LEAVE
  1456.         POP EAX              ;Adress from which the error came
  1457.         MOV _ErrorAddr,EAX
  1458.         PUSH 214             ;Illegal pointer operation
  1459.         CALLN32 _RunErrorIntern
  1460. !eok:
  1461.      END;
  1462. END;
  1463.  
  1464. PROCEDURE FreeAPIMem(VAR p:POINTER;size:LONGWORD);
  1465. BEGIN
  1466.      ASM
  1467.         MOV ESI,$p
  1468.         PUSHL [ESI+0]
  1469.         MOV AL,1
  1470.         CALLDLL DosCalls,304   ;DosFreeMem
  1471.         ADD ESP,4
  1472.         CMP EAX,0
  1473.         JE !eok_1
  1474.  
  1475.         LEAVE
  1476.         POP EAX                ;Adress from which the error came
  1477.         MOV _ErrorAddr,EAX
  1478.         PUSH 204               ;Illegal pointer operation
  1479.         CALLN32 _RunErrorIntern
  1480. !eok_1:
  1481.         MOV ESI,$p
  1482.         MOVD [ESI+0],0
  1483.      END;
  1484. END;
  1485.  
  1486.  
  1487. PROCEDURE GETMEM(var p:Pointer;size:LongWord);
  1488. BEGIN
  1489.      ASM
  1490.         MOV EAX,[EBP+8]       ;Size
  1491.         ADD EAX,7
  1492.         AND AL,F8h            ;Align on 8 byte boundary
  1493.         PUSH EAX
  1494.         PUSHL [EBP+12]
  1495.         PUSHL _HeapOrg
  1496.         MOV AL,3
  1497.         CALLDLL DosCalls,345   ;DosSubAllocMem
  1498.         ADD ESP,12             ;Clear Stack
  1499.         CMP EAX,0
  1500.         JE !wg
  1501.         LEAVE
  1502.         POP EAX                ;Adress from which the error came
  1503.         MOV _ErrorAddr,EAX
  1504.         PUSH 204               ;Illegal pointer operation
  1505.         CALLN32 _RunErrorIntern
  1506. !wg:
  1507.         MOV ESI,[EBP+12]
  1508.         MOV EAX,[ESI+0]        ;Adresse
  1509.         ADD EAX,[EBP+8]
  1510.         CMP EAX,_HeapPtr
  1511.         JB !eg
  1512.         MOV _HeapPtr,EAX
  1513. !eg:
  1514.      END;
  1515. END;
  1516.  
  1517. PROCEDURE FREEMEM(var p:pointer;size:LongWord);
  1518. BEGIN
  1519.      ASM
  1520.          MOV ESI,[EBP+12]      ;Addr
  1521.          MOV ESI,[ESI+0]
  1522.  
  1523.          MOV EAX,[EBP+8]       ;Size
  1524.          ADD EAX,7
  1525.          AND AL,F8h            ;Align on 8 byte boundary
  1526.          PUSH EAX
  1527.          MOV ESI,[EBP+12]
  1528.          MOV EAX,[ESI+0]
  1529.          MOVD [ESI+0],0       ;Invalidate pointer
  1530.          MOV EBX,EAX
  1531.          ADD EBX,[EBP+8]
  1532.          CMP EBX,_HeapPtr
  1533.          JB !nf
  1534.          MOV _HeapPtr,EAX
  1535. !nf:
  1536.          PUSH EAX              ;Adress of block
  1537.          PUSHL _HeapOrg
  1538.          MOV AL,3
  1539.          CALLDLL DosCalls,346  ;DosSubFreeMem
  1540.          ADD ESP,12
  1541.          CMP EAX,0
  1542.          JE !ef
  1543.          LEAVE
  1544.          POP EAX               ;Adress from which the error came
  1545.          MOV _ErrorAddr,EAX
  1546.          PUSH 204              ;Illegal pointer operation
  1547.          CALLN32 _RunErrorIntern
  1548. !ef:
  1549.      END;
  1550. END;
  1551.  
  1552. FUNCTION  MAXAVAIL:LongWord;ASM;
  1553. BEGIN
  1554.      ASM
  1555.         MOV EAX,_HeapEnd
  1556.         SUB EAX,_HeapPtr
  1557.         RETN32
  1558.      END;
  1559. END;
  1560.  
  1561.  
  1562. FUNCTION  MEMAVAIL:LongWord;ASM;
  1563. BEGIN
  1564.      ASM
  1565.         MOV EAX,_HeapEnd
  1566.         SUB EAX,_HeapPtr
  1567.         RETN32
  1568.      END;
  1569. END;
  1570.  
  1571. PROCEDURE BYTEMOVE(var source;var dest;size:LongWord);ASM;
  1572. BEGIN
  1573.      ASM
  1574.          MOV EBX,ESP
  1575.          MOV ESI,[EBX+12]
  1576.          MOV EDI,[EBX+8]
  1577.          MOV ECX,[EBX+4]
  1578.          CLD
  1579.          CMP ESI,EDI
  1580.          JAE !Mo1
  1581.          ADD ESI,ECX
  1582.          ADD EDI,ECX
  1583.          DEC ESI
  1584.          DEC EDI
  1585.          STD
  1586. !Mo1:
  1587.          REP
  1588.          MOVSB
  1589.          CLD
  1590.          RETN32 12
  1591.     END;
  1592. END;
  1593.  
  1594.  
  1595. PROCEDURE MOVE(var source;var dest;size:LongWord);ASM;
  1596. BEGIN
  1597.      ASM
  1598.         MOV EBX,ESP
  1599.         MOV ESI,[EBX+12]
  1600.         MOV EDI,[EBX+8]
  1601.         MOV ECX,[EBX+4]
  1602.         CLD
  1603.         CMP ESI,EDI
  1604.         JB !Mo2
  1605.         CMP ECX,0
  1606.         JE __L12_1
  1607.         TEST ECX,1
  1608.         JE __L11_1         ;schon gerade Anzahl
  1609.         MOVSB
  1610.         JMP !Mo2_1
  1611. !Mo2:
  1612.         ADD ESI,ECX
  1613.         ADD EDI,ECX
  1614.         DEC ESI
  1615.         DEC EDI
  1616.         STD
  1617.         CMP ECX,0
  1618.         JE __L12_1
  1619.         TEST ECX,1
  1620.         JNE __L__11_1         ;schon gerade Anzahl ??
  1621.         DEC EDI               ;ja !!
  1622.         DEC ESI
  1623.         JMP __L11_1
  1624. __L__11_1:
  1625.         MOVSB
  1626.         DEC ESI
  1627.         DEC EDI
  1628. !Mo2_1:
  1629.         DEC ECX            ;count auf gerade Anzahl
  1630.         CMP ECX,0
  1631.         JE __L12_1
  1632. __L11_1:
  1633.         SHR ECX,1         ;da wortweises Übertragen
  1634.         REP
  1635.         db 66h            ;no double word
  1636.         MOVSW
  1637. __L12_1:
  1638.         CLD
  1639.         RETN32 12
  1640.      END;
  1641. END;
  1642.  
  1643.  
  1644. PROCEDURE FILLCHAR(var dest;size:LongWord;value:byte);ASM;
  1645. BEGIN
  1646.     ASM
  1647.         CLD
  1648.         MOV EBX,ESP
  1649.         MOV EDI,[EBX+10]   ;Destination pointer
  1650.         MOV ECX,[EBX+6]    ;count
  1651.         CMP ECX,0          ;count=0 ??
  1652.         JE __L12
  1653.         MOV AL,[EBX+4]     ;value
  1654.         MOV AH,AL
  1655.  
  1656.         CMP ECX,0
  1657.         JE __L12
  1658.         TEST ECX,1
  1659.         JE __L11           ;schon gerade Anzahl
  1660.         STOSB
  1661.         DEC ECX            ;count auf gerade Anzahl
  1662.         CMP ECX,0
  1663.         JE __L12
  1664. __L11:
  1665.         SHR ECX,1         ;da wortweises Übertragen
  1666.         REP
  1667.         db 66h            ;no double word
  1668.         STOSW
  1669. __L12:
  1670.         RETN32 10
  1671.      END;
  1672. END;
  1673.  
  1674.  
  1675.  
  1676. ASSEMBLER
  1677.  
  1678. ;***************************************************
  1679. ;String Support routines
  1680. ;***************************************************
  1681.  
  1682. !StrCopy PROC NEAR32
  1683.                 CLD
  1684.                 MOV EBX,ESP
  1685.                 MOV ESI,[EBX+10]     ;Source String
  1686.                 MOV EDI,[EBX+6]     ;Destination String
  1687.                 MOV CL,[EBX+4]       ;Maximum length
  1688.                 MOVZX ECX,CL
  1689.                 LODSB
  1690.                 CMP AL,CL
  1691.                 JBE _L1
  1692.                 MOV AL,CL
  1693. _L1:
  1694.                 STOSB
  1695.                 MOV CL,AL
  1696.                 MOVZX ECX,CL
  1697.                 CMP ECX,0
  1698.                 JE _eee1
  1699.  
  1700.                 TEST ECX,1
  1701.                 JE __L11_2         ;schon gerade Anzahl
  1702.                 MOVSB
  1703.                 DEC ECX            ;count auf gerade Anzahl
  1704.                 CMP ECX,0
  1705.                 JE _eee1
  1706. __L11_2:
  1707.                 SHR ECX,1         ;da wortweises Übertragen
  1708.                 REP
  1709.                 db 66h            ;no double word
  1710.                 MOVSW
  1711. _eee1:
  1712.                 MOV AL,0          ;Abschluß PChar
  1713.                 STOSB
  1714.                 RETN32 10
  1715. !StrCopy ENDP
  1716.  
  1717.  
  1718. !StrCopyTemp PROC NEAR32
  1719.                 CLD
  1720.                 MOV EBX,ESP
  1721.                 PUSHA
  1722.                 MOV ESI,[EBX+4]          ;Source String
  1723.                 MOV EDI,OFFSET(!TempString) ;Destination String
  1724.                 LODSB                       ;Length of source string
  1725.                 STOSB                       ;save
  1726.                 MOV CL,AL                   ;set counter
  1727.                 MOVZX ECX,CL
  1728.  
  1729.                 CMP ECX,0
  1730.                 JE __L12_3
  1731.                 TEST ECX,1
  1732.                 JE __L11_3         ;schon gerade Anzahl
  1733.                 MOVSB
  1734.                 DEC ECX            ;count auf gerade Anzahl
  1735.                 CMP ECX,0
  1736.                 JE __L12_3
  1737. __L11_3:
  1738.                 SHR ECX,1         ;da wortweises Übertragen
  1739.                 REP
  1740.                 db 66h            ;no double word
  1741.                 MOVSW
  1742. __L12_3:
  1743.                 MOV EDI,OFFSET(!TempString)
  1744.                 MOV AL,[EDI+0]
  1745.                 XOR AH,AH
  1746.                 MOVZX EAX,AX
  1747.                 ADD EDI,EAX
  1748.                 MOVB [EDI+1],0  ;Abschluß PChar
  1749.                 POPA
  1750.                 RETN32 4
  1751. !StrCopyTemp ENDP
  1752.  
  1753. !AddString PROC NEAR32
  1754.         MOV EBX,ESP
  1755.         MOV EDI,[EBX+8]    ;s2
  1756.         MOV ESI,[EBX+4]    ;s1
  1757.         MOVZXB ECX,[EDI+0] ;length of s
  1758.         CLD
  1759.         LODSB
  1760.         ADD [EDI+0],AL
  1761.         JNC !!lll1
  1762.         MOVB [EDI+0],255
  1763.         MOV AL,CL
  1764.         NOT AL
  1765. !!lll1:
  1766.         ADD EDI,ECX
  1767.         INC EDI
  1768.         MOV CL,AL
  1769.         REP
  1770.         MOVSB
  1771.         MOV AL,0      ;Abschluß PChar
  1772.         STOSB
  1773.         RETN32 8
  1774. !AddString ENDP
  1775.  
  1776. !CopyString PROC NEAR32
  1777.         CLD
  1778.     SUB    EDX,EBX
  1779.     CMP    EAX,EBX
  1780.     JB    LA1
  1781.         MOV    EAX,EBX
  1782. LA1:
  1783.         STOSB
  1784.     MOV    ECX,EAX
  1785.     ADD    EBX,ESI
  1786.         CMP     ECX,0
  1787.         JE __L12_4
  1788.  
  1789.         TEST ECX,1
  1790.         JE __L11_4         ;schon gerade Anzahl
  1791.         MOVSB
  1792.         DEC ECX            ;count auf gerade Anzahl
  1793.         CMP ECX,0
  1794.         JE __L12_4
  1795. __L11_4:
  1796.         SHR ECX,1         ;da wortweises Übertragen
  1797.         REP
  1798.         db 66h            ;no double word
  1799.         MOVSW
  1800. __L12_4:
  1801.     MOV    ESI,EBX
  1802.     RETN32
  1803. !CopyString ENDP
  1804.  
  1805. END;
  1806.  
  1807. FUNCTION  UPCASE(item:char):Char;ASM;
  1808. BEGIN
  1809.      ASM
  1810.          MOV EBX,ESP
  1811.          MOV AL,[EBX+4]
  1812.          CMP AL,61h
  1813.          JB L32
  1814.          CMP AL,7ah
  1815.          JA L32
  1816.          SUB AL,20h
  1817. L32:
  1818.          RETN32 2
  1819.       END;
  1820. END;
  1821.  
  1822. FUNCTION COPY(source:string;start,ende:Byte):String;ASM;
  1823. BEGIN
  1824.      ASM
  1825.         PUSH EBP
  1826.         MOV EBP,ESP
  1827.  
  1828.         MOV ESI,[EBP+16]             ;Source string
  1829.         MOV EDI,[EBP+8]              ;Destination string
  1830.  
  1831.         MOVZXB AX,[ESI+0]            ;Length of source
  1832.         MOVZXB ECX,$Start            ;Index
  1833.         OR ECX,ECX
  1834.         JG !_Lab1
  1835.         MOV ECX,1
  1836. !_Lab1:
  1837.         ADD ESI,ECX
  1838.         SUB AX,CX
  1839.         JB !_Lab3
  1840.         INC AX
  1841.         MOVZXB CX,$Ende             ;Count
  1842.         OR CX,CX
  1843.         JGE !_Lab2
  1844.         XOR CX,CX
  1845. !_Lab2:
  1846.         CMP AX,CX
  1847.         JBE !_Lab4
  1848.         MOV AX,CX
  1849.         JMP !_Lab4
  1850. !_Lab3:
  1851.         XOR AX,AX
  1852. !_Lab4:
  1853.         STOSB
  1854.         MOVZX ECX,AX
  1855.         CMP ECX,0
  1856.         JE !_Lab5
  1857.         REP
  1858.         MOVSB
  1859. !_Lab5:
  1860.         MOV EDI,[EBP+16]             ;Source string
  1861.         MOVZXB EAX,[EDI+0]
  1862.         ADD EDI,EAX
  1863.         MOVB [EDI+1],0               ;Abschluß PChar
  1864.  
  1865.         LEAVE
  1866.         RETN32 12
  1867.      END;
  1868. END;
  1869.  
  1870. PROCEDURE SUBSTR(VAR source:string;start,ende:Byte);ASM;
  1871. BEGIN
  1872.       ASM
  1873.         PUSH EBP
  1874.         MOV EBP,ESP
  1875.  
  1876.         MOV ESI,[EBP+12]             ;Source string
  1877.         MOV EDI,ESI                  ;Destination string
  1878.  
  1879.         MOVZXB AX,[ESI+0]            ;Length of source
  1880.         MOVZXB ECX,$Start            ;Index
  1881.         OR ECX,ECX
  1882.         JG !_Lab1_1
  1883.         MOV ECX,1
  1884. !_Lab1_1:
  1885.         ADD ESI,ECX
  1886.         SUB AX,CX
  1887.         JB !_Lab3_1
  1888.         INC AX
  1889.         MOVZXB CX,$Ende             ;Count
  1890.         OR CX,CX
  1891.         JGE !_Lab2_1
  1892.         XOR CX,CX
  1893. !_Lab2_1:
  1894.         CMP AX,CX
  1895.         JBE !_Lab4_1
  1896.         MOV AX,CX
  1897.         JMP !_Lab4_1
  1898. !_Lab3_1:
  1899.         XOR AX,AX
  1900. !_Lab4_1:
  1901.         STOSB
  1902.         MOVZX ECX,AX
  1903.         CMP ECX,0
  1904.         JE !_Lab5_1
  1905.         REP
  1906.         MOVSB
  1907. !_Lab5_1:
  1908.         MOV EDI,[EBP+12]
  1909.         MOVZXB EAX,[EDI+0]
  1910.         ADD EDI,EAX
  1911.         MOVB [EDI+1],0  ;Abschluß PChar
  1912.         LEAVE
  1913.         RETN32 8
  1914.      END;
  1915. END;
  1916.  
  1917. ASSEMBLER
  1918.  
  1919. !Long2Str PROC NEAR32
  1920.         MOV EBX,ESP
  1921.         MOV EAX,[EBX+8]
  1922.         MOV EDI,[EBX+4]
  1923.         PUSH EDI
  1924.         POP ESI
  1925.         MOVB [EDI+0],0
  1926.         MOV EBX,10
  1927.         XOR ECX,ECX
  1928.         CMP EAX,0
  1929.         JNL Lw46_1
  1930.         NEG EAX
  1931.         MOVB [EDI+0],1
  1932.         INC EDI
  1933.         MOVB [EDI+0],'-'
  1934. Lw46_1:
  1935.         XOR EDX,EDX
  1936.         DIV EBX
  1937.         PUSH DX
  1938.         INC CX
  1939.         OR EAX,EAX
  1940.         JNE Lw46_1
  1941. Lw47:
  1942.         POP AX
  1943.         ADD AL,'0'
  1944.         INCB [ESI+0]
  1945.         INC EDI
  1946.         MOV [EDI+0],AL
  1947.         LOOP Lw47
  1948.  
  1949.         MOV EBX,ESP
  1950.         MOV EDI,[EBX+4]
  1951.         MOV AL,[EDI+0]
  1952.         MOVZX EAX,AL
  1953.         ADD EDI,EAX
  1954.         MOVB [EDI+1],0  ;Abschluß PChar
  1955.         RETN32 8
  1956. !Long2Str ENDP
  1957.  
  1958.  
  1959. !Str2Long PROC NEAR32
  1960.         PUSH EBP
  1961.         MOV EBP,ESP
  1962.         SUB ESP,10
  1963.         MOV EDI,[EBP+16]   ;s
  1964.         MOV CL,[EDI+0]     ;Länge
  1965.         MOVZX ECX,CL
  1966.         MOVB [EBP-6],0
  1967.  
  1968.         MOVD [EBP-10],10   ;Base
  1969.         MOV AL,[EDI+1]
  1970.         ADD EDI,ECX
  1971.         CMP AL,'$'         ;Hexadecimal ??
  1972.         JNE !nohex
  1973.         MOVD [EBP-10],16   ;Base
  1974.         DEC ECX
  1975. !nohex:
  1976.         CMP AL,'-'
  1977.         JNE !q2
  1978.         DEC ECX
  1979.         MOVB [EBP-6],1
  1980. !q2:
  1981.         MOV EBX,1
  1982.         MOVW EAX,0
  1983.         MOV [EBP-4],EAX
  1984. !q1:
  1985.         MOV AL,[EDI+0]
  1986.         DEC EDI
  1987.         CMP AL,48
  1988.         JB !qerr
  1989.         CMP AL,57
  1990.         JNA !noqerr
  1991.  
  1992.         CMP AL,102
  1993.         JA !qerr
  1994.         CMP AL,65
  1995.         JB !qerr
  1996.         CMP AL,70
  1997.         JBE !hexnum
  1998.         CMP AL,97
  1999.         JB !qerr
  2000.         SUB AL,32    ;To upper
  2001. !hexnum:
  2002.         CMPD [EBP-10],16
  2003.         JNE !qerr
  2004.         SUB AL,7
  2005. !noqerr:
  2006.         SUB AL,48
  2007.         MOVZX EAX,AL
  2008.         MUL EBX
  2009.         MOV EDX,[EBP-4]
  2010.         ADD EDX,EAX
  2011.         MOV [EBP-4],EDX
  2012.         MOV EAX,EBX
  2013.         MOV EBX,[EBP-10]  ;Base
  2014.         MUL EBX
  2015.         MOV EBX,EAX
  2016.         LOOP !q1
  2017. !qerr:
  2018.         MOV EDI,[EBP+8]     ;result
  2019.         XOR CH,CH
  2020.         MOV [EDI+0],CX
  2021.         MOV EAX,[EBP-4]
  2022.         CMPB [EBP-6],1
  2023.         JNE !q3
  2024.         NEG EAX
  2025. !q3:
  2026.         MOV EDI,[EBP+12]    ;l
  2027.         MOV [EDI+0],EAX
  2028.         LEAVE
  2029.         RETN32 12
  2030. !Str2Long ENDP
  2031.  
  2032. !Str2Word PROC NEAR32
  2033.         PUSH EBP
  2034.         MOV EBP,ESP
  2035.         SUB ESP,10
  2036.         MOV EDI,[EBP+16]   ;s
  2037.         MOV CL,[EDI+0]     ;Länge
  2038.         MOVZX ECX,CL
  2039.         MOVB [EBP-6],0
  2040.  
  2041.         MOVD [EBP-10],10   ;Base
  2042.         MOV AL,[EDI+1]
  2043.         ADD EDI,ECX
  2044.         CMP AL,'$'         ;Hexadecimal ??
  2045.         JNE !__nohex
  2046.         MOVD [EBP-10],16   ;Base
  2047.         DEC ECX
  2048. !__nohex:
  2049.         CMP AL,'-'
  2050.         JNE !__q2
  2051.         DEC ECX
  2052.         MOVB [EBP-6],1
  2053. !__q2:
  2054.         MOV EBX,1
  2055.         MOVW EAX,0
  2056.         MOV [EBP-4],EAX
  2057. !__q1:
  2058.         MOV AL,[EDI+0]
  2059.         DEC EDI
  2060.         CMP AL,48
  2061.         JB !__qerr
  2062.         CMP AL,57
  2063.         JNA !__noqerr
  2064.  
  2065.         CMP AL,102
  2066.         JA !__qerr
  2067.         CMP AL,65
  2068.         JB !__qerr
  2069.         CMP AL,70
  2070.         JBE !__hexnum
  2071.         CMP AL,97
  2072.         JB !__qerr
  2073.         SUB AL,32    ;To upper
  2074. !__hexnum:
  2075.         CMPD [EBP-10],16
  2076.         JNE !__qerr
  2077.         SUB AL,7
  2078. !__noqerr:
  2079.         SUB AL,48
  2080.         MOVZX EAX,AL
  2081.         MUL EBX
  2082.         MOV EDX,[EBP-4]
  2083.         ADD EDX,EAX
  2084.         MOV [EBP-4],EDX
  2085.         MOV EAX,EBX
  2086.         MOV EBX,[EBP-10]  ;Base
  2087.         MUL EBX
  2088.         MOV EBX,EAX
  2089.         LOOP !__q1
  2090. !__qerr:
  2091.         MOV EDI,[EBP+8]     ;result
  2092.         XOR CH,CH
  2093.         MOV [EDI+0],CX
  2094.         MOV EAX,[EBP-4]
  2095.         CMPB [EBP-6],1
  2096.         JNE !__q3
  2097.         NEG EAX
  2098. !__q3:
  2099.         MOV EDI,[EBP+12]    ;l
  2100.         MOV [EDI+0],AX
  2101.         LEAVE
  2102.         RETN32 12
  2103. !Str2Word ENDP
  2104.  
  2105. !Str2Byte PROC NEAR32
  2106.         PUSH EBP
  2107.         MOV EBP,ESP
  2108.         SUB ESP,10
  2109.         MOV EDI,[EBP+16]   ;s
  2110.         MOV CL,[EDI+0]     ;Länge
  2111.         MOVZX ECX,CL
  2112.         MOVB [EBP-6],0
  2113.  
  2114.         MOVD [EBP-10],10   ;Base
  2115.         MOV AL,[EDI+1]
  2116.         ADD EDI,ECX
  2117.         CMP AL,'$'         ;Hexadecimal ??
  2118.         JNE !___nohex
  2119.         MOVD [EBP-10],16   ;Base
  2120.         DEC ECX
  2121. !___nohex:
  2122.         CMP AL,'-'
  2123.         JNE !___q2
  2124.         DEC ECX
  2125.         MOVB [EBP-6],1
  2126. !___q2:
  2127.         MOV EBX,1
  2128.         MOVW EAX,0
  2129.         MOV [EBP-4],EAX
  2130. !___q1:
  2131.         MOV AL,[EDI+0]
  2132.         DEC EDI
  2133.         CMP AL,48
  2134.         JB !___qerr
  2135.         CMP AL,57
  2136.         JNA !___noqerr
  2137.  
  2138.         CMP AL,102
  2139.         JA !___qerr
  2140.         CMP AL,65
  2141.         JB !___qerr
  2142.         CMP AL,70
  2143.         JBE !___hexnum
  2144.         CMP AL,97
  2145.         JB !___qerr
  2146.         SUB AL,32    ;To upper
  2147. !___hexnum:
  2148.         CMPD [EBP-10],16
  2149.         JNE !___qerr
  2150.         SUB AL,7
  2151. !___noqerr:
  2152.         SUB AL,48
  2153.         MOVZX EAX,AL
  2154.         MUL EBX
  2155.         MOV EDX,[EBP-4]
  2156.         ADD EDX,EAX
  2157.         MOV [EBP-4],EDX
  2158.         MOV EAX,EBX
  2159.         MOV EBX,[EBP-10]  ;Base
  2160.         MUL EBX
  2161.         MOV EBX,EAX
  2162.         LOOP !___q1
  2163. !___qerr:
  2164.         MOV EDI,[EBP+8]     ;result
  2165.         XOR CH,CH
  2166.         MOV [EDI+0],CX
  2167.         MOV EAX,[EBP-4]
  2168.         CMPB [EBP-6],1
  2169.         JNE !___q3
  2170.         NEG EAX
  2171. !___q3:
  2172.         MOV EDI,[EBP+12]    ;l
  2173.         MOV [EDI+0],AL
  2174.         LEAVE
  2175.         RETN32 12
  2176. !Str2Byte ENDP
  2177.  
  2178. END;
  2179.  
  2180. FUNCTION ToStr(l:longint):string;ASM;
  2181. BEGIN
  2182.      ASM
  2183.         MOV EBX,ESP
  2184.         PUSHL [EBX+8]
  2185.         PUSHL [EBX+4]      ;Destination string
  2186.         CALLN32 !Long2Str
  2187.         RETN32 8
  2188.      END;
  2189. END;
  2190.  
  2191. ASSEMBLER
  2192.  
  2193. !StringCmp PROC NEAR32
  2194.               MOV EBX,ESP
  2195.               CLD
  2196.               MOV ESI,[EBX+8]
  2197.               MOV EDI,[EBX+4]
  2198.               LODSB
  2199.               MOV AH,[EDI+0]
  2200.               INC EDI
  2201.               MOV CL,AL
  2202.               CMP CL,AH
  2203.               JBE _nl1
  2204.               MOV CL,AH
  2205. _nl1:
  2206.               OR CL,CL
  2207.               JE _nl2
  2208.               MOVZX ECX,CL
  2209.               CLD
  2210.               REP
  2211.               CMPSB
  2212.               JNE _nl3
  2213. _nl2:
  2214.               CMP AL,AH
  2215. _nl3:
  2216.               RETN32 8
  2217. !StringCmp ENDP
  2218.  
  2219. !PStringCmp PROC NEAR32
  2220.               MOV EBX,ESP
  2221.               CLD
  2222.               MOV ESI,[EBX+8]  ;2.String
  2223.               MOV EDI,[EBX+4]
  2224.               PUSH EDI
  2225.               PUSH ESI
  2226.               MOV AL,0
  2227. !syy:
  2228.               CMPB [ESI+0],0
  2229.               JE !sxx
  2230.               INC AL
  2231.               INC ESI
  2232.               JMP !syy
  2233. !sxx:
  2234.               MOV AH,0
  2235. !syy1:
  2236.               CMPB [EDI+0],0
  2237.               JE !sxx1
  2238.               INC AH
  2239.               INC EDI
  2240.               JMP !syy1
  2241. !sxx1:
  2242.               POP ESI
  2243.               POP EDI
  2244.               MOV CL,AL
  2245.               CMP CL,AH
  2246.               JBE _nl1_1
  2247.               MOV CL,AH
  2248. _nl1_1:
  2249.               OR CL,CL
  2250.               JE _nl2_1
  2251.               MOVZX ECX,CL
  2252.               CLD
  2253.               REP
  2254.               CMPSB
  2255.               JNE _nl3_1
  2256. _nl2_1:
  2257.               CMP AL,AH
  2258. _nl3_1:
  2259.               RETN32 8
  2260. !PStringCmp ENDP
  2261.  
  2262. END;
  2263.  
  2264. FUNCTION POS(item:string;source:string):Byte;ASM;
  2265. BEGIN
  2266.      ASM
  2267.          PUSH EBP
  2268.          MOV EBP,ESP
  2269.          MOV ESI,[EBP+12]   ;item
  2270.          CLD
  2271.          LODSB
  2272.          OR AL,AL
  2273.          JE !lab2
  2274.          MOVZXB EAX,AL
  2275.          MOV EDX,EAX
  2276.          MOV EDI,[EBP+8]    ;source
  2277.          MOVZXB ECX,[EDI+0]
  2278.          SUB ECX,EDX
  2279.          JB !lab2
  2280.          INC ECX
  2281.          INC EDI
  2282. !lab1:
  2283.          LODSB
  2284.          REPNE
  2285.          SCASB
  2286.          JNE !lab2
  2287.          MOV EAX,EDI
  2288.          MOV EBX,ECX
  2289.          MOV ECX,EDX
  2290.          DEC ECX
  2291.          REPE
  2292.          CMPSB
  2293.          JE !lab3
  2294.          MOV EDI,EAX
  2295.          MOV ECX,EBX
  2296.          MOV ESI,[EBP+12]   ;item
  2297.          INC ESI
  2298.          JMP !lab1
  2299. !Lab2:
  2300.          XOR EAX,EAX
  2301.          JMP !Lab4
  2302. !lab3:
  2303.          DEC EAX
  2304.          SUB EAX,[EBP+8]    ;source
  2305. !Lab4:
  2306.          LEAVE
  2307.          RETN32 8
  2308.      END;
  2309. END;
  2310.  
  2311. PROCEDURE Insert(Source:String;VAR s:string;Ind:Byte);
  2312. var OldLen:Byte;
  2313.     SourceLen:Byte;
  2314.     TStr:STRING;
  2315. Begin
  2316.      asm
  2317.         CMPB [EBP+8],0
  2318.         JE !exx2
  2319.         LEA EDI,$TStr
  2320.         MOV ESI,[EBP+10]
  2321.         INC EDI
  2322.         MOV CL,[ESI+0]
  2323.         XOR CH,CH
  2324.         MOV [EBP-2],CL   ;OldLen
  2325.         MOV CL,[EBP+8]   ;ab dieser Position
  2326.         CMP CL,[EBP-2]
  2327.         JNA !no
  2328.         MOV CL,[EBP-2]
  2329.         MOV [EBP+8],CL
  2330.         INC CL
  2331. !no:
  2332.         INC ESI
  2333.         CMP CL,0
  2334.         JE !nc1
  2335.         DEC CL
  2336.         MOVZX ECX,CL
  2337.         CLD
  2338.         REP
  2339.         MOVSB             ;var s in TempString kopieren
  2340. !nc1:
  2341.         PUSH ESI          ;alte Position merken
  2342.         MOV ESI,[EBP+14]  ;Source
  2343.         MOV CL,[Esi+0]
  2344.         XOR CH,CH
  2345.         MOV [EBP-4],CL    ;SourceLen
  2346.         iNC ESI
  2347.         CMP CL,0
  2348.         JE !nc2
  2349.         MOVZX ECX,CL
  2350.         CLD
  2351.         REP
  2352.         MOVSB
  2353. !nc2:
  2354.         POP ESI         ;alte Position holen
  2355.         MOV CL,[EBP-2]  ;Oldlen
  2356.         MOV AL,[EBP+8]  ;Index
  2357.         DEC AL
  2358.         SUB CL,AL
  2359.         CMP CL,0
  2360.         JE !nc3
  2361.         MOVZX ECX,CL
  2362.         REP
  2363.         MOVSB
  2364. !nc3:
  2365.         MOV AL,[EBP-2]  ;Oldlen
  2366.         ADD AL,[EBP-4]
  2367.  
  2368.         MOV $TStr,AL  ;Länge setzen
  2369.         MOV EDI,[EBP+10]
  2370.         LEA ESI,$TStr
  2371.         MOV CL,AL
  2372.         INC CL
  2373.         MOVZX ECX,CL
  2374.         CLD
  2375.         REP
  2376.         MOVSB
  2377.         MOV EDI,[EBP+10]
  2378.         XOR CH,CH
  2379.         MOV CL,AL
  2380.         MOVZX ECX,CL
  2381.         ADD EDI,ECX
  2382.         MOVB [EDI+1],0  ;Abschluß PChar
  2383. !exx2:
  2384.     end;
  2385. End;
  2386.  
  2387. PROCEDURE Delete(Var s:string;Ind:byte;len:byte);
  2388. var newlen:Byte;
  2389. BEGIN
  2390.      ASM
  2391.         MOV EDI,$s        ;var s
  2392.         MOV AL,[EDI+0]    ;Length of the string
  2393.         MOV CL,$Ind       ;Index in the string
  2394.         CMP CL,AL
  2395.         JA !exx3
  2396.         CMP CL,0
  2397.         JE !exx1
  2398.  
  2399.         MOVZX ECX,CL      ;Index in the string
  2400.         ADD EDI,ECX       ;add the index
  2401.         MOV ESI,$s        ;var s
  2402.         ADD ESI,ECX       ;add the index
  2403.         MOV CL,$len       ;len
  2404.         ADD CL,$ind       ;index
  2405.         CMP CL,AL         ;greater than maximal length ??
  2406.         JNA !cp
  2407.         ;len=maximal length-Index
  2408.         MOV CL,$Len       ;len
  2409.         MOV BL,AL         ;maximal length to bl
  2410.         SUB BL,CL
  2411.         MOV $Len,CL       ;set len anew
  2412. !cp:
  2413.         MOV CL,$Len       ;len
  2414.         MOVZX ECX,CL
  2415.         ADD ESI,ECX       ;add len
  2416.         ADD CL,$Ind       ;Index
  2417.         DEC CL
  2418.         SUB AL,CL
  2419.         MOV CL,AL         ;to transmit
  2420.         CMP CL,0
  2421.         JE !exx1          ;zero bytes
  2422.  
  2423.         MOVZX ECX,CL
  2424.         CLD
  2425.         REP
  2426.         MOVSB
  2427. !exx1:
  2428.         MOV EDI,$s        ;var s
  2429.         MOV AL,[EDI+0]    ;current len
  2430.         SUB AL,$Len       ;len
  2431.         MOV [EDI+0],AL    ;Länge neu setzen
  2432.         MOVZX EAX,AL
  2433.         ADD EDI,EAX
  2434.         MOVB [EDI+1],0 ;PChar Abschluß
  2435. !exx3:
  2436.      end;
  2437. END;
  2438.  
  2439. {*************************************************************************
  2440. *                                                                        *
  2441. *                                                                        *
  2442. *             Procedures and functions for file handling                 *
  2443. *                                                                        *
  2444. *                                                                        *
  2445. **************************************************************************}
  2446.  
  2447. PROCEDURE CHDIR(path:string);ASM;
  2448. BEGIN
  2449.      ASM
  2450.         MOV EBX,ESP
  2451.         MOV EAX,[EBX+4]
  2452.         INC EAX
  2453.         PUSH EAX
  2454.         MOV AL,1
  2455.         CALLDLL DosCalls,255  ;DosSetCurrentDir
  2456.         ADD ESP,4
  2457.         MOV _IoResult,EAX
  2458.         RETN32
  2459.      END;
  2460. END;
  2461.  
  2462. PROCEDURE GETDIR(drive:byte;var path:string);ASM;
  2463. BEGIN
  2464.      ASM
  2465.         PUSH EBP
  2466.         MOV EBP,ESP
  2467.         MOVD _IoResult,0
  2468.         SUB ESP,8
  2469.  
  2470.         MOV AL,$drive
  2471.         CMP AL,0      ;actual drive required ??
  2472.         JA !nad
  2473.  
  2474.         LEA EAX,[EBP-4]    ;DriveMap
  2475.         PUSH EAX
  2476.         LEA EAX,[EBP-8]    ;Current drive
  2477.         PUSH EAX
  2478.         MOV AL,2
  2479.         CALLDLL DosCalls,275 ;DosQueryCurrentDisk
  2480.         ADD ESP,8
  2481.  
  2482.         MOV _IoResult,EAX
  2483.         CMPD _IoResult,0
  2484.         JNE !egd
  2485.         MOV AL,[EBP-8]
  2486. !nad:
  2487.         MOV EDI,[EBP+8]    ;Path
  2488.         INC EDI
  2489.         CLD
  2490.         ADD AL,64
  2491.         STOSB
  2492.         MOV AL,':'
  2493.         STOSB
  2494.         MOV AL,'\'
  2495.         STOSB
  2496.  
  2497.         MOVD [EBP-4],250   ;max length of dir
  2498.         LEA EAX,[EBP-4]
  2499.         PUSH EAX
  2500.         MOV EAX,[EBP+8]    ;Path
  2501.         ADD EAX,4          ;dispatch drive letter and :\
  2502.         PUSH EAX
  2503.         MOV AL,[EBP+12]    ;Drive number
  2504.         MOVZX EAX,AL
  2505.         PUSH EAX
  2506.         MOV AL,3
  2507.         CALLDLL DosCalls,274     ;DosQueryCurrentDir
  2508.         ADD ESP,12
  2509.         MOV _IoResult,EAX
  2510.  
  2511.         CMPD _IoResult,0
  2512.         JNE !egd
  2513.  
  2514.         MOV CL,255
  2515.         MOV ESI,[EBP+8]
  2516.         INC ESI
  2517.         CLD
  2518. !lgd:
  2519.         INC CL
  2520.         LODSB
  2521.         CMP AL,0
  2522.         JNE !lgd
  2523.  
  2524.         MOV ESI,[EBP+8]
  2525.         MOV [ESI+0],CL   ;set string length
  2526. !egd:
  2527.         LEAVE
  2528.         RETN32 6
  2529.      END;
  2530. END;
  2531.  
  2532. PROCEDURE RMDIR(dir:string);ASM;
  2533. BEGIN
  2534.      ASM
  2535.         MOV EBX,ESP
  2536.         MOV EAX,[EBX+4]
  2537.         INC EAX
  2538.         PUSH EAX
  2539.         MOV AL,1
  2540.         CALLDLL DosCalls,226    ;DosDeleteDir
  2541.         ADD ESP,4
  2542.         MOV _IoResult,EAX
  2543.         RETN32 4
  2544.      END;
  2545. END;
  2546.  
  2547. PROCEDURE MKDIR(dir:string);ASM;
  2548. BEGIN
  2549.      ASM
  2550.         MOV EBX,ESP
  2551.         PUSHL 0         ;No extended attributes
  2552.         MOV EAX,[EBX+4]
  2553.         INC EAX
  2554.         PUSH EAX
  2555.         MOV AL,2
  2556.         CALLDLL DosCalls,270  ;DosCreateDir
  2557.         ADD ESP,8
  2558.         MOV _IoResult,EAX
  2559.         RETN32 4
  2560.      END;
  2561. END;
  2562.  
  2563. PROCEDURE Erase(name:STRING);ASM;
  2564. BEGIN
  2565.      ASM
  2566.          MOV EBX,ESP
  2567.          MOV EAX,[EBX+4]
  2568.          INC EAX
  2569.          PUSH EAX
  2570.          MOV AL,1
  2571.          CALLDLL DosCalls,259   ;DosDelete
  2572.          ADD ESP,4
  2573.          MOV _IoResult,EAX
  2574.          RETN32
  2575.      END;
  2576. END;
  2577.  
  2578. PROCEDURE Seek(var f:file;n:LongWord);ASM;
  2579. BEGIN
  2580.      ASM
  2581.          PUSH EBP
  2582.          MOV EBP,ESP
  2583.          SUB ESP,4
  2584.          LEA EAX,[EBP-4]
  2585.          PUSH EAX
  2586.          PUSHL _SeekMode   ;from where to Seek
  2587.          PUSHL [EBP+8]     ;Bytes to move
  2588.          MOV EDI,[EBP+12]  ;var f
  2589.          PUSHL [EDI+0]     ;Handle
  2590.          MOV AL,4
  2591.          CALLDLL DosCalls,256 ;DosSetFilePtr
  2592.          ADD ESP,16
  2593.          MOV _IoResult,EAX
  2594.          LEAVE
  2595.          RETN32 8
  2596.       END;
  2597. END;
  2598.  
  2599. FUNCTION FilePos(var f:file):LongWord;ASM;
  2600. BEGIN
  2601.      ASM
  2602.          PUSH EBP
  2603.          MOV EBP,ESP
  2604.          SUB ESP,4
  2605.          LEA EAX,[EBP-4]
  2606.          PUSH EAX
  2607.          PUSHL 1                ;from current position
  2608.          PUSHL 0
  2609.          MOV EDI,[EBP+8]        ;var f
  2610.          PUSHL [EDI+0]     ;Handle
  2611.          MOV AL,4
  2612.          CALLDLL DosCalls,256 ;DosSetFilePtr
  2613.          ADD ESP,16
  2614.          MOV _IoResult,EAX
  2615.          MOV EAX,[EBP-4]   ;result
  2616.          LEAVE
  2617.          RETN32 4
  2618.       END;
  2619. END;
  2620.  
  2621.  
  2622. FUNCTION FileSize(var f:file):LongWord;ASM;
  2623. BEGIN
  2624.      ASM
  2625.          PUSH EBP
  2626.          MOV EBP,ESP
  2627.          SUB ESP,8
  2628.          MOV EDI,[EBP+8]  ;Var f
  2629.          PUSH EDI
  2630.          CALLN32 _FilePos
  2631.          PUSH EAX
  2632.          CMPD,_ioresult,0
  2633.          JNE L_19_1   ;Error occured
  2634.  
  2635.          LEA EAX,[EBP-8]
  2636.          PUSH EAX
  2637.          PUSHL 2                ;_End of file
  2638.          PUSHL 0
  2639.          MOV EDI,[EBP+8]        ;var f
  2640.          PUSHL [EDI+0]          ;Handle
  2641.          MOV AL,4
  2642.          CALLDLL DosCalls,256   ;DosSetFilePtr
  2643.          ADD ESP,16
  2644.          CMPD _IoResult,0
  2645.          JNE L_19_1   ;Error occured
  2646.  
  2647.          POP EBX   ;alte Fileposition
  2648.          LEA EAX,[EBP-4]
  2649.          PUSH EAX
  2650.          PUSHL 0                ;Start of file
  2651.          PUSH EBX
  2652.          MOV EDI,[EBP+8]        ;var f
  2653.          PUSHL [EDI+0]     ;Handle
  2654.          MOV AL,4
  2655.          CALLDLL DosCalls,256 ;DosSetFilePtr
  2656.          ADD ESP,16
  2657.          MOV _IoResult,EAX
  2658. L_19_1:
  2659.          MOV EAX,[EBP-8]
  2660.          LEAVE
  2661.          RETN32 4
  2662.       END;
  2663. END;
  2664.  
  2665.  
  2666.  
  2667. PROCEDURE Reset(var f:file;recsize:LongWord);ASM;
  2668. BEGIN
  2669.       ASM
  2670.          PUSH EBP
  2671.          MOV EBP,ESP
  2672.          MOVD _Ioresult,0
  2673.          SUB ESP,4         ;Action Taken
  2674.          MOV EDI,[EBP+12]  ;Var f
  2675.          MOV EAX,[EBP+8]   ;Recsize
  2676.          MOV [EDI+4],EAX
  2677.          MOVD [EDI+88],0   ;No extended attributes required
  2678.          PUSHL 0           ;no extended Attributes
  2679.          PUSHL _FileMode
  2680.          PUSHL 1           ;Open If file exists
  2681.          PUSHL 0           ;No attributes required
  2682.          PUSHL 0
  2683.          LEA EAX,[EBP-4]
  2684.          PUSH EAX
  2685.          LEA EAX,[EDI+0]   ;Handle
  2686.          PUSH EAX
  2687.          LEA EAX,[EDI+8]   ;Filename
  2688.          PUSH EAX
  2689.          MOV AL,8
  2690.          CALLDLL DosCalls,273  ;DosOpen
  2691.          ADD ESP,32
  2692.          MOV _IoResult,EAX
  2693.          CMPD _IoResult,0
  2694.          JNE !ers
  2695.          MOV ESI,[EBP+12]
  2696.          MOV EAX,_FileMode
  2697.          MOV [EDI+92],EAX  ;Patch file mode
  2698. !ers:
  2699.          LEAVE
  2700.          RETN32 8
  2701.       END;
  2702. END;
  2703.  
  2704. PROCEDURE Rewrite(var f:file;recsize:Longword);ASM;
  2705. BEGIN
  2706.      ASM
  2707.          PUSH EBP
  2708.          MOV EBP,ESP
  2709.          MOVD _IoResult,0
  2710.          SUB ESP,4         ;Action Taken
  2711.          MOV EDI,[EBP+12]  ;Var f
  2712.          MOV EAX,[EBP+8]   ;Recsize
  2713.          MOV [EDI+4],EAX
  2714.          MOVD [EDI+88],0   ;no extended Attributes required
  2715.          PUSHL 0           ;no extended Attributes required
  2716.          PUSHL _FileMode
  2717.          PUSHL  18         ;Create if not exist,replace if exist
  2718.          PUSHL 20h         ;ARCHIVE
  2719.          PUSHL 0
  2720.          LEA EAX,[EBP-4]
  2721.          PUSH EAX
  2722.          LEA EAX,[EDI+0]   ;Handle
  2723.          PUSH EAX
  2724.          LEA EAX,[EDI+8]   ;Filename
  2725.          PUSH EAX
  2726.          MOV AL,8
  2727.          CALLDLL DosCalls,273  ;DosOpen
  2728.          ADD ESP,32
  2729.          MOV _IoResult,EAX
  2730.          CMPD _IoResult,0
  2731.          JNE !ers_1
  2732.          MOV ESI,[EBP+12]
  2733.          MOV EAX,_FileMode
  2734.          MOV [EDI+92],EAX  ;Patch file mode
  2735. !ers_1:
  2736.          LEAVE
  2737.          RETN32 8
  2738.       END;
  2739. END;
  2740.  
  2741. PROCEDURE BlockWrite(VAR f:file;var Buf;Count:LongWord);ASM;
  2742. BEGIN
  2743.      ASM
  2744.          PUSH EBP
  2745.          MOV EBP,ESP
  2746.          MOVD _IoResult,0
  2747.          CMPD [EBP+8],0  ;Bufferlen
  2748.          JE !ebw
  2749.          MOV EDI,[EBP+16]  ;VAR f
  2750.          PUSHL OFFSET(_BlockWriteResult)    ;result
  2751.          MOV EAX,[EBP+8]  ;BufferLen
  2752.          MOV EBX,[EDI+4]   ;RecSize
  2753.          MUL EBX
  2754.          PUSH EAX
  2755.          PUSHL [EBP+12]    ;Buffer
  2756.          PUSHL [EDI+0]     ;Handle
  2757.          MOV AL,4
  2758.          CALLDLL DosCalls,282 ;DosWrite
  2759.          ADD ESP,16
  2760.          MOV _IoResult,EAX
  2761. !ebw:
  2762.          LEAVE
  2763.          RETN32 12
  2764.      END;
  2765. END;
  2766.  
  2767. PROCEDURE BlockRead(VAR f:file;var Buf;Count:LongWord);ASM;
  2768. BEGIN
  2769.      ASM
  2770.          PUSH EBP
  2771.          MOV EBP,ESP
  2772.          MOVD _IoResult,0
  2773.          CMPD [EBP+8],0  ;Bufferlen
  2774.          JE !ebr
  2775.          MOV EDI,[EBP+16]  ;VAR f
  2776.          PUSHL OFFSET(_BlockreadResult)  ;result
  2777.          MOV EAX,[EBP+8]  ;BufferLen
  2778.          MOV EBX,[EDI+4]   ;RecSize
  2779.          MUL EBX
  2780.          PUSH EAX
  2781.          PUSHL [EBP+12] ;Buffer
  2782.          PUSHL [EDI+0]  ;Handle
  2783.          MOV AL,4
  2784.          CALLDLL DosCalls,281 ;DosRead
  2785.          ADD ESP,16
  2786.          MOV _IoResult,EAX
  2787. !ebr:
  2788.          LEAVE
  2789.          RETN32 12
  2790.      END;
  2791. END;
  2792.  
  2793. PROCEDURE Rename(VAR f:file;NewName:String);
  2794. BEGIN
  2795.      ASM
  2796.         LEA EAX,$NewName
  2797.         INC EAX
  2798.         PUSH EAX
  2799.         MOV ESI,$f
  2800.         LEA EAX,[ESI+8]   ;old filename
  2801.         PUSH EAX
  2802.         MOV AL,2
  2803.         CALLDLL DosCalls,271  ;DosMove
  2804.         ADD ESP,8
  2805.         MOV _Ioresult,EAX
  2806.      END;
  2807. END;
  2808.  
  2809. PROCEDURE CLOSE(VAR f:file);ASM;
  2810. BEGIN
  2811.      ASM
  2812.         PUSH EBP
  2813.         MOV EBP,ESP
  2814.         MOV EDI,[EBP+8]
  2815.         MOVD _Ioresult,0
  2816.         CMPD [EDI+0],0  ;Get file Handle
  2817.         JNE !nce
  2818.         MOVD _IoResult,6 ;Invalid Handle
  2819.         JMP !edc
  2820. !nce:
  2821.         PUSHL [EDI+0]  ;Handle
  2822.         MOV AL,1
  2823.         CALLDLL DosCalls,257  ;DosClose
  2824.         ADD ESP,4
  2825.         MOV _IoResult,EAX
  2826.         CMPD _IoResult,0
  2827.         JNE !edc
  2828.         MOV EDI,[EBP+8]
  2829.         MOVD [EDI+92],0  ;Mark file as closed
  2830. !edc:
  2831.         LEAVE
  2832.         RETN32 4
  2833.       END;
  2834. END;
  2835.  
  2836.  
  2837. PROCEDURE ASSIGN(VAR f:file;s:String);ASM;
  2838. BEGIN
  2839.      ASM
  2840.        PUSH EBP
  2841.        MOV EBP,ESP
  2842.        MOV EDI,[EBP+12]  ;File variable
  2843.        MOV AL,0
  2844.        MOV ECX,100       ;Length of file structure
  2845.        REP
  2846.        STOSB
  2847.        MOV EDI,[EBP+12]  ;File variable
  2848.  
  2849.        MOV ESI,[EBP+8]   ;String
  2850.        MOV CL,[ESI+0]    ;Length
  2851.        INC ESI
  2852.        CMP CL,79
  2853.        JBE L_1
  2854. L_2:
  2855.        MOV CL,79
  2856.        JMP L_3
  2857. L_1:
  2858.        CMP CL,0
  2859.        JE L_2__1    ;Skip empty file name
  2860. L_3:
  2861.        MOVZX ECX,CL
  2862.        ADD EDI,8    ;Set on filename
  2863.        CLD
  2864.        REP
  2865.        MOVSB
  2866. L_2__1:
  2867.        LEAVE
  2868.        RETN32 8
  2869.    END;
  2870. END;
  2871.  
  2872. ASSEMBLER
  2873.  
  2874. !BlockWriteFile PROC NEAR32
  2875.          PUSH EBP
  2876.          MOV EBP,ESP
  2877.          MOVD _IoResult,0
  2878.          CMPD [EBP+8],0  ;Bufferlen
  2879.          JE !ebw1
  2880.          MOV EDI,[EBP+16]  ;VAR f
  2881.          PUSHL OFFSET(_BlockWriteResult)    ;result
  2882.          MOV EAX,[EBP+8]  ;BufferLen
  2883.          MOV EBX,[EDI+4]   ;RecSize
  2884.          MUL EBX
  2885.          PUSH EAX
  2886.          PUSHL [EBP+12]    ;Buffer
  2887.          PUSHL [EDI+0]     ;Handle
  2888.          MOV AL,4
  2889.          CALLDLL DosCalls,282 ;DosWrite
  2890.          ADD ESP,16
  2891.          MOV _IoResult,EAX
  2892. !ebw1:
  2893.          LEAVE
  2894.          RETN32 8   ;Leave f on stack
  2895. !BlockWriteFile ENDP
  2896.  
  2897. !BlockReadFile PROC NEAR32
  2898.          PUSH EBP
  2899.          MOV EBP,ESP
  2900.          MOVD _IoResult,0
  2901.          CMPD [EBP+8],0  ;Bufferlen
  2902.          JE !ebr1
  2903.          MOV EDI,[EBP+16]  ;VAR f
  2904.          PUSHL OFFSET(_BlockreadResult)  ;result
  2905.          MOV EAX,[EBP+8]  ;BufferLen
  2906.          MOV EBX,[EDI+4]   ;RecSize
  2907.          MUL EBX
  2908.          PUSH EAX
  2909.          PUSHL [EBP+12] ;Buffer
  2910.          PUSHL [EDI+0]  ;Handle
  2911.          MOV AL,4
  2912.          CALLDLL DosCalls,281 ;DosRead
  2913.          ADD ESP,16
  2914.          MOV _IoResult,EAX
  2915. !ebr1:
  2916.          LEAVE
  2917.          RETN32 8  ;Leave f on stack
  2918. !BlockReadFile ENDP
  2919.  
  2920.  
  2921. !TextRead PROC NEAR32  ;[EBP+12]-->FileVar  Result to !TempString
  2922.                        ;[EBP+8]-->BufferString
  2923.           PUSH EBP
  2924.           MOV EBP,ESP
  2925.           SUB ESP,4    ;for old file position
  2926.           PUSHA        ;PUSHAD
  2927.  
  2928.           PUSHL [EBP+12]    ;FileVar
  2929.           CALLN32 _Filepos
  2930.           MOV EBX,_IoResult
  2931.           CMP EBX,0
  2932.           JNE !end_read
  2933.  
  2934.           MOV [EBP-4],EAX   ;Save file position
  2935.  
  2936.           MOV EDI,[EBP+12]  ;Filevar
  2937.           MOVD [EDI+4],1    ;RecSize
  2938.           PUSH EDI
  2939.           MOV EDX,[EBP+8]   ;Buffer
  2940.           INC EDX
  2941.           PUSH EDX
  2942.           PUSHL 255         ;Length
  2943.           CALLN32 _BlockRead
  2944.           CMPD _IoResult,0
  2945.           JNE L_14x
  2946.  
  2947.           MOV EAX,_BlockReadresult    ;Result
  2948.           MOV ESI,[EBP+8]
  2949.           MOV [ESI+0],AL   ;Bytes read
  2950.           JMP L_16x
  2951. L_14x:
  2952. L_12x:
  2953.           MOV ESI,[EBP+8]
  2954.           MOVB [ESI+0],0   ;No records transmitted
  2955. L_16x:
  2956.           MOV EAX,_IoResult
  2957.           CMPW EAX,0
  2958.           JNE !end_read
  2959.           XOR CX,CX
  2960.           MOV ESI,[EBP+8]
  2961.           CLD
  2962.           LODSB
  2963.           CMP AL,0
  2964.           JE !end_read
  2965.           XOR AH,AH
  2966.           MOV DX,AX     ;old len
  2967. !lox1:
  2968.           LODSB
  2969.           INC CX
  2970.           CMP AL,13
  2971.           JE !end_lox
  2972.           CMP AL,10
  2973.           JE !end_lox
  2974.           CMP CX,DX       ;greater then bytes read ?
  2975.           JAE !end_read
  2976.           CMP CX,255
  2977.           JB !lox1
  2978.           JMP !end_read   ;NO CR found
  2979. !end_lox:
  2980.           MOV AX,CX
  2981.           DEC AX
  2982.           PUSH EDI
  2983.           MOV EDI,[EBP+8]
  2984.           MOV [EDI+0],AL  ;Set new length
  2985.           CMPB [EDI+1],13
  2986.           jne !ner
  2987.           MOVB [EDI+0],0
  2988. !ner:
  2989.           POP EDI
  2990.           LODSB
  2991.           CMP AL,10
  2992.           JNE !no_i
  2993.           INC CX
  2994. !no_i:
  2995.           MOV AX,CX
  2996.           MOVZX EAX,AL
  2997.           MOV EBX,[EBP-4]       ;old file-position
  2998.           ADD EBX,EAX
  2999.           MOV EAX,[EBP+12]       ;FileVar
  3000.           PUSH EAX
  3001.           PUSH EBX
  3002.           CALLN32 _Seek
  3003. !end_read:
  3004.           POPA                  ;POPAD
  3005.           LEAVE
  3006.           RETN32 4               ;Do not remove parameters !!!
  3007. !TextRead ENDP
  3008.  
  3009. !TextWrite PROC NEAR32  ;[EBP+12]-->FileVar [EBP+8] String to write
  3010.           PUSH EBP
  3011.           MOV EBP,ESP
  3012.  
  3013.           MOV EDI,[EBP+12]  ;Filevar
  3014.           MOVD [EDI+4],1    ;RecSize
  3015.           PUSH EDI
  3016.           MOV EDI,[EBP+8]   ;String
  3017.           MOV CL,[EDI+0]
  3018.           MOVZX ECX,CL
  3019.           INC EDI
  3020.           PUSH EDI
  3021.           PUSH ECX          ;Length
  3022.           CALLN32 _BlockWrite
  3023.           CMPD _IoResult,0
  3024.           JNE !no_1
  3025.  
  3026.           MOV EDI,[EBP+12]   ;Filevar
  3027.           PUSH EDI
  3028.           MOV EDX,OFFSET(@creoln)
  3029.           PUSH EDX
  3030.           PUSHL 2            ;length
  3031.           CALLN32 _BlockWrite
  3032. !no_1:
  3033.           LEAVE
  3034.           RETN32 4    ;Do not remove FileVar parameter !!!
  3035. @creoln db 13,10
  3036. !TextWrite ENDP
  3037.  
  3038. END;
  3039.  
  3040. FUNCTION Eof(var f:file):Boolean;ASM;
  3041. BEGIN
  3042.      ASM
  3043.         PUSH EBP
  3044.         MOV EBP,ESP
  3045.  
  3046.         MOV EDI,[EBP+8] ;var f
  3047.         CMPD [EDI+0],0  ;FileHandle
  3048.         JE L_21
  3049.  
  3050.         PUSHL [EBP+8]  ;var f
  3051.         CALLN32 _Filepos
  3052.         PUSH EAX       ;Save current position
  3053.  
  3054.         PUSHL [EBP+8]  ;var f
  3055.         CALLN32 _FileSize
  3056.  
  3057.         POP EBX        ;Get current position
  3058.         CMP EBX,EAX
  3059.         JB L_22
  3060.         MOV AL,1       ;its EOF
  3061.         LEAVE
  3062.         RETN32 4
  3063. L_22:
  3064.         XOR AL,AL      ;its not EOF
  3065.         LEAVE
  3066.         RETN32 4
  3067. L_21:
  3068.         MOVD _IoResult,6  ;Invalid handle
  3069.         XOR EAX,EAX
  3070.         JMP L_22
  3071.       END;
  3072. END;
  3073.  
  3074.  
  3075.  
  3076.  
  3077. {*************************************************************************
  3078. *                                                                        *
  3079. *                                                                        *
  3080. *          Procedures and functions for outputting text in a PM Screen   *
  3081. *                                                                        *
  3082. **************************************************************************}
  3083.  
  3084. PROCEDURE CreateLogFont(_HPS:LONGWORD;VAR facename:STRING;hei,len,
  3085.                         SelAttr:LONGWORD);
  3086. VAR fa:FATTRS;
  3087. BEGIN
  3088.      move(facename[1],fa.szFaceName,length(facename)+1);
  3089.      fa.usRecordLength:=sizeof(FATTRS);
  3090.      fa.fsSelection:=SelAttr;
  3091.      fa.lMatch:=1;
  3092.      fa.idRegistry:=0;
  3093.      fa.usCodePage:=0; {default}
  3094.      fa.lMaxbaseLineExt:=hei;
  3095.      fa.lAveCharWidth:=len;
  3096.      fa.fsType:=0;
  3097.      fa.fsFontUse:=0;
  3098.      ASM
  3099.         LEA EAX,$fa
  3100.         PUSH EAX
  3101.         PUSHL 1   ;Font ID
  3102.         PUSHL 0
  3103.         PUSHL $_hps
  3104.         MOV AL,4
  3105.         CALLDLL PMGPI,368    ;GpiCreateLogFont
  3106.         ADD ESP,16
  3107.  
  3108.         PUSHL 1   ;Font ID
  3109.         PUSHL $_hps
  3110.         MOV AL,2
  3111.         CALLDLL PMGPI,513   ;GpiSetCharSet
  3112.         ADD ESP,8
  3113.      END;
  3114. END;
  3115.  
  3116. PROCEDURE InvalidatePMCrtWindow;
  3117. VAR rc:RECTL;
  3118. BEGIN
  3119.      ASM
  3120.         LEA EAX,$rc
  3121.         PUSH EAX
  3122.         PUSHL _PMCrtWindow
  3123.         MOV AL,2
  3124.         CALLDLL PMWIN,840  ;WinQueryWindowRect
  3125.         ADD ESP,8
  3126.  
  3127.         PUSHL 0
  3128.         LEA EAX,$rc
  3129.         PUSH EAX
  3130.         PUSHL _PMCrtWindow
  3131.         MOV AL,3
  3132.         CALLDLL PMWIN,765   ;WinInvalidateRect
  3133.         ADD ESP,12
  3134.      END;
  3135. END;
  3136.  
  3137.  
  3138. PROCEDURE PMCrtScrollDown;
  3139. BEGIN
  3140.      ASM
  3141.         MOV EDI,_PMScrBuf
  3142.         MOV ESI,EDI
  3143.         ADD ESI,256
  3144.         MOV ECX,1920   ;30 Lines a 256 chars=7680 (DIV 4 --> MOVSD)
  3145.         CLD
  3146.         REP
  3147.         MOVSW          ;MOVSD
  3148.      END;
  3149.      Dec(DrawLocY);
  3150.      PmScrBuf^[DrawLocY]:='';
  3151.      {prepare whole window for repaint}
  3152.      MaxDrawStarty:=0;
  3153.      MaxDrawLeny:=MaxLines;
  3154. END;
  3155.  
  3156. PROCEDURE PMCrtRedraw(_hps:HPS);
  3157. VAR pt:pointl;
  3158.     rec:RECTL;
  3159.     Adresse:LONGWORD;
  3160.     t:Word;
  3161.     Metrics:FontMetrics;
  3162.     YAddFont:LONGWORD;
  3163.     Size:LONGWORD;
  3164.     cusizex,cusizey,cux,cuy:LONGWORD;
  3165.     facename:string;
  3166. BEGIN
  3167.      Size:=sizeof(FontMetrics);
  3168.      facename:='System VIO';
  3169.      CreateLogFont(_hps,facename,16,8,0);
  3170.      ASM
  3171.         LEA EAX,$Metrics
  3172.         PUSH EAX
  3173.         PUSHL $Size
  3174.         PUSHL $_hps
  3175.         MOV AL,3
  3176.         CALLDLL PMGPI,453  ;QueryFontMetrics
  3177.         ADD ESP,12
  3178.  
  3179.         LEA EAX,$rec
  3180.         PUSH EAX
  3181.         PUSHL _PMCrtWindow
  3182.         MOV AL,2
  3183.         CALLDLL PMWIN,840  ;WinQueryWindowRect
  3184.         ADD ESP,8
  3185.      END;
  3186.      YAddFont:=Metrics.lMaxAscender+Metrics.lMaxDescender;
  3187.      cusizex:=Metrics.lAveCharWidth;
  3188.      cusizey:=2;
  3189.      cux:=2+DrawLocx*cusizex;
  3190.      cuy:=rec.yTop-(DrawLocy+1)*YAddFont;
  3191.      ASM
  3192.         ;Set window cursor
  3193.         PUSHL 0      ;whole window
  3194.         PUSHL 8004h  ;CURSOR_SETPOS
  3195.         PUSHL $cusizey
  3196.         PUSHL $cusizex
  3197.         PUSHL $cuy
  3198.         PUSHL $cux
  3199.         PUSHL _PMCrtWindow
  3200.         MOV AL,7
  3201.         CALLDLL PMWIN,715  ;WinCreateCursor
  3202.         ADD ESP,28
  3203.  
  3204.         PUSHL _CursorVisible
  3205.         PUSHL _PMCrtWindow
  3206.         MOV AL,2
  3207.         CALLDLL PMWIN,880     ;WinShowCursor
  3208.         ADD ESP,8
  3209.  
  3210.         PUSHL _TextCol        ;TextColor
  3211.         PUSHL $_hps
  3212.         MOV AL,2
  3213.         CALLDLL PMGPI,517    ;GpiSetColor
  3214.         ADD ESP,8
  3215.  
  3216.         PUSHL _TextBackCol   ;Text BackGround
  3217.         PUSHL $_hps
  3218.         MOV AL,2
  3219.         CALLDLL PMGPI,504    ;GpiSetBackColor
  3220.         ADD ESP,8
  3221.  
  3222.         PUSHL 2      ;BM_OVERPAINT
  3223.         PUSHL $_hps
  3224.         MOV AL,2
  3225.         CALLDLL PMGPI,505    ;GpiSetBackMix
  3226.         ADD ESP,8
  3227.  
  3228.         MOV EAX,_MaxDrawStarty
  3229.         MOV EBX,256
  3230.         MUL EBX
  3231.         MOV EBX,_PmScrBuf
  3232.         ADD EAX,EBX
  3233.         MOV $Adresse,EAX
  3234.     END;
  3235.  
  3236.     pt.x:=2;
  3237.     pt.y:=rec.yTop-(MaxDrawStarty+1)*yAddFont;
  3238.     t:=0;
  3239.     IF MaxDrawLeny<>MaxLines THEN
  3240.     BEGIN
  3241.          rec.yTop:=pt.y;
  3242.          rec.yBottom:=rec.yTop-(MaxDrawLeny+1)*yAddFont;
  3243.          IF MaxDrawLeny=0 THEN rec.xleft:=rec.xleft+DrawLocX*cusizex; {1 Zeile}
  3244.     END;
  3245.     ASM
  3246.        PUSHL _TextBackCol
  3247.        LEA EAX,$rec
  3248.        PUSH EAX
  3249.        PUSHL $_hps
  3250.        MOV AL,3
  3251.        CALLDLL PMWIN,743  ;WinFillRect
  3252.        ADD ESP,12
  3253.     END;
  3254.     WHILE pt.y>=rec.yBottom DO
  3255.     BEGIN
  3256.          ASM
  3257.             MOV ESI,$Adresse
  3258.             MOV AL,[ESI+0]
  3259.             CMP AL,0
  3260.             JE !no_draw
  3261.             INC ESI
  3262.             PUSH ESI
  3263.             MOVZX EAX,AL
  3264.             PUSH EAX
  3265.  
  3266.             LEA EAX,$pt
  3267.             PUSH EAX
  3268.             PUSHL $_hps
  3269.             MOV AL,4
  3270.             CALLDLL PMGPI,359   ;GpiCharStringAt
  3271.             ADD ESP,16
  3272. !no_draw:
  3273.          END;
  3274.          Inc(Adresse,256);
  3275.          dec(pt.y,yAddFont);
  3276.          inc(t);
  3277.          IF t>MaxDrawLeny THEN exit;
  3278.     END;
  3279. END;
  3280.  
  3281. FUNCTION PMCrtHandleEvent(Win:LONGWORD;Msg:LONGWORD;para1,para2:POINTER;
  3282.                           VAR Handled:BOOLEAN):LONGWORD;
  3283. VAR
  3284.     H:Boolean;
  3285.     _hps:LONGWORD;
  3286.     r:LONGWORD;
  3287.     command:WORD;
  3288.     rc:RECTL;
  3289. BEGIN
  3290.       r:=0;
  3291.       H:=TRUE;
  3292.       CASE Msg OF
  3293.           WM_QUIT:
  3294.           BEGIN
  3295.                IF PMCrtWindow<>0 THEN
  3296.                BEGIN {Destroy Crt Window}
  3297.                     ASM
  3298.                        PUSHL 5 ;QW_PARENT
  3299.                        PUSHL $Win
  3300.                        MOV AL,2
  3301.                        CALLDLL PMWIN,834  ;WinQueryWindow
  3302.                        ADD ESP,8
  3303.                        PUSH EAX
  3304.                        MOV AL,1
  3305.                        CALLDLL PMWIN,728  ;WinDestroyWindow
  3306.                        ADD ESP,4
  3307.                     END;
  3308.                     PMCrtWindow:=0;
  3309.                     FreeApiMem(PMScrBuf,sizeof(ScreenBuf));
  3310.                END;
  3311.                IF not Handled THEN H:=FALSE;
  3312.           END;
  3313.           WM_SETFOCUS:  {EingabeFocus neu setzen}
  3314.           BEGIN
  3315.                ASM
  3316.                   MOV EAX,[EBP+12]  ;para2
  3317.                   CMP EAX,0
  3318.                   JE !dc      ;Window is loosing focus
  3319.  
  3320.                   ;Window becomes focus --> Create the cursor
  3321.                   PUSHL 0  ;whole window
  3322.                   PUSHL 4  ;CURSOR_SOLID | CURSOR_FLASH
  3323.                   PUSHL 2
  3324.                   PUSHL 8
  3325.                   PUSHL 40
  3326.                   PUSHL 40
  3327.                   PUSHL _PMCrtWindow
  3328.                   MOV AL,7
  3329.                   CALLDLL PMWIN,715  ;WinCreateCursor
  3330.                   ADD ESP,28
  3331.  
  3332.                   PUSHL 1            ;Show the cursor
  3333.                   PUSHL _PMCrtWindow
  3334.                   MOV AL,2
  3335.                   CALLDLL PMWIN,880  ;WinShowCursor
  3336.                   ADD ESP,4
  3337.  
  3338.                   CALLN32 _InvalidatePMCrtWindow
  3339.  
  3340.                   JMP !ccde
  3341. !dc:
  3342.                   ;Window is loosing focus --> Destroy the cursor
  3343.                   PUSHL _PMCrtWindow
  3344.                   MOV AL,1
  3345.                   CALLDLL PMWIN,725  ;WinDestroyCursor
  3346.                   ADD ESP,4
  3347. !ccde:
  3348.                END;
  3349.           END;
  3350.           WM_CHAR:
  3351.           BEGIN
  3352.               if CrtKeyCount < 33 then
  3353.               begin
  3354.                    ASM
  3355.                       MOV AX,[EBP+16]    ;para1
  3356.                       AND AX,41h         ;KC_Char valid and KC_KEYUP
  3357.                       CMP AX,1
  3358.                       JNE !no_char
  3359.                       MOV AX,[EBP+12] ;para2
  3360.                       LEA EDI,_KeyBuffer
  3361.                       MOV BL,_CrtKeyCount
  3362.                       MOVZX EBX,BL
  3363.                       ADD EDI,EBX
  3364.                       INCB _CrtKeyCount
  3365.                       MOV [EDI+0],AL
  3366. !no_char:
  3367.                    END;
  3368.               end;
  3369.           END;
  3370.           WM_CLOSE:
  3371.           BEGIN
  3372.                PmCrtWindow:=0;
  3373.                IF not AlternateExit THEN {send WM_QUIT}
  3374.                BEGIN
  3375.                     ASM
  3376.                        PUSHL 0
  3377.                        PUSHL 0
  3378.                        PUSHL 2ah  ;WM_QUIT
  3379.                        PUSHL $win
  3380.                        MOV AL,4
  3381.                        CALLDLL PMWIN,919  ;WinPostMsg
  3382.                        ADD ESP,16
  3383.                     END;
  3384.                END
  3385.                ELSE {only destroy window}
  3386.                BEGIN
  3387.                     ASM
  3388.                        PUSHL 5 ;QW_PARENT
  3389.                        PUSHL $Win
  3390.                        MOV AL,2
  3391.                        CALLDLL PMWIN,834  ;WinQueryWindow
  3392.                        ADD ESP,8
  3393.                        PUSH EAX
  3394.                        MOV AL,1
  3395.                        CALLDLL PMWIN,728  ;WinDestroyWindow
  3396.                        ADD ESP,4
  3397.                     END;
  3398.                END;
  3399.           END;
  3400.           WM_PAINT:
  3401.           BEGIN
  3402.                MaxDrawStarty:=0;
  3403.                MaxDrawLeny:=MaxLines;
  3404.                ASM
  3405.                   LEA EAX,$rc
  3406.                   PUSH EAX
  3407.                   PUSHL 0
  3408.                   PUSHL $Win
  3409.                   MOV AL,3
  3410.                   CALLDLL PMWIN,703  ;WinbeginPaint
  3411.                   ADD ESP,12
  3412.                   MOV $_hps,EAX
  3413.                END;
  3414.                PMCrtRedraw(_hps);
  3415.                ASM
  3416.                   PUSHL $_hps
  3417.                   MOV AL,1
  3418.                   CALLDLL PMWIN,738  ;WinendPaint
  3419.                   ADD ESP,4
  3420.                END;
  3421.           END;
  3422.           WM_ERASEBACKGROUND:r:=1;
  3423.           ELSE IF not Handled THEN H:=FALSE;
  3424.       END;
  3425.       Handled:=H;
  3426.       PMCrtHandleEvent:=r;
  3427. END;
  3428.  
  3429. FUNCTION PMCrtHandler(para2,para1:POINTER;Msg,Win:LONGWORD):LONGWORD;ASM;
  3430. BEGIN
  3431.      ASM
  3432.         PUSH EBP
  3433.         MOV EBP,ESP
  3434.         SUB ESP,2
  3435.         ;Save parameters as it is SYSTEM Calling Convention
  3436.         PUSH EDI
  3437.         PUSH ESI
  3438.         PUSH EBX
  3439.  
  3440.         MOVW [EBP-2],0   ;Not Handled
  3441.         PUSHL $Win
  3442.         PUSHL $Msg
  3443.         PUSHL $para1
  3444.         PUSHL $para2
  3445.         LEA EAX,[EBP-2]
  3446.         PUSH EAX
  3447.         CALLN32 _PMCrtHandleEvent
  3448.         MOV BL,[EBP-2]
  3449.         CMP BL,0
  3450.         JNE !hh
  3451.         ;not handled
  3452.         ;Default Window handler
  3453.         PUSHL $para2
  3454.         PUSHL $para1
  3455.         PUSHL $msg
  3456.         PUSHL $win
  3457.         MOV AL,4
  3458.         CALLDLL PMWin,911   ;WinDefWindowProc
  3459.         ADD ESP,16
  3460. !hh:
  3461.         ;Get registers as it is SYSTEM calling convention
  3462.         POP EBX
  3463.         POP ESI
  3464.         POP EDI
  3465.         LEAVE
  3466.         RETN32
  3467.     END;
  3468. END;
  3469.  
  3470. PROCEDURE DrawPMCrtWindow;
  3471. BEGIN
  3472.      ASM
  3473.          PUSHL _PMCrtWindow
  3474.          MOV AL,1
  3475.          CALLDLL PMWIN,757   ;WinGetPS
  3476.          ADD ESP,4
  3477.  
  3478.          PUSH EAX            ;For WinReleasePS
  3479.  
  3480.          PUSH EAX
  3481.          CALLN32 _PMCrtRedraw
  3482.  
  3483.          MOV AL,1
  3484.          CALLDLL PMWIN,848   ;WinReleasePS
  3485.          ADD ESP,4
  3486.      END;
  3487. END;
  3488.  
  3489.  
  3490. PROCEDURE CreatePMCrtWindow; {Generate a window}
  3491. VAR fr:LONGWORD;
  3492.     t:Byte;
  3493. BEGIN
  3494.      IF PMCrtWindow=0 THEN
  3495.      BEGIN
  3496.          MaxLines:=29;
  3497.          TextCol:=7;     {CLR_NEUTRAL}
  3498.          TextBackCol:=0; {CLR_BACKGROUND}
  3499.          GetAPIMem(PMScrBuf,sizeof(ScreenBuf));
  3500.          {prepare whole window for repaint}
  3501.          MaxDrawStarty:=0;
  3502.          MaxDrawLeny:=MaxLines;
  3503.          ASM
  3504.             MOV ECX,_MaxLines
  3505.             MOV AL,0
  3506. !cloop:
  3507.             MOV EDI,_PMScrBuf
  3508.             MOV [EDI+0],AL
  3509.             ADD EDI,256
  3510.             LOOP !cloop
  3511.          END;
  3512.          DrawLocX:=0;
  3513.          DrawLocY:=0;
  3514.          ASM
  3515.             PUSHL 0
  3516.             PUSHL 4  ;CS_SizeRedraw
  3517.             MOV EAX,*_PMCrtHandler
  3518.             PUSH EAX
  3519.             PUSHL OFFSET(@CrtWinName)
  3520.             PUSHL _AppHandle
  3521.             MOV AL,5
  3522.             CALLDLL PMWIN,926  ;WinregisterClass
  3523.             ADD ESP,20
  3524.  
  3525.             PUSHL OFFSET(_PmCrtWindow)
  3526.             PUSHL 0
  3527.             PUSHL 0
  3528.             PUSHL 0
  3529.             MOV EAX,OFFSET(_PMCrtTitle)
  3530.             INC EAX
  3531.             PUSH EAX
  3532.             PUSHL OFFSET(@CrtWinName)
  3533.             MOVD $fr,0c3bh
  3534.             LEA EAX,$fr
  3535.             PUSH EAX
  3536.             PUSHL 0
  3537.             PUSHL 1  ;HWND_DESKTOP
  3538.             MOV AL,9
  3539.             CALLDLL PMWIN,908   ;WinCreateStdWindow
  3540.             ADD ESP,36
  3541.             MOV _PMCrtFrameHandle,EAX
  3542.  
  3543.             PUSHL 8fh
  3544.             PUSHL 350
  3545.             PUSHL 500
  3546.             PUSHL 100
  3547.             PUSHL 50
  3548.             PUSHL 3   ;HWND_TOP
  3549.             PUSHL _PMCrtFrameHandle
  3550.             MOV AL,7
  3551.             CALLDLL PMWIN,875   ;WinsetWindowPos
  3552.             ADD ESP,28
  3553.             LEAVE
  3554.             RETN32
  3555. @CrtWinName db 'PMCRTWIN',0
  3556.        END;
  3557.      END;
  3558. END;
  3559.  
  3560.  
  3561.  
  3562. PROCEDURE GOTOXY(x,y:LONGWORD);
  3563. BEGIN
  3564.      CreatePMCrtWindow;
  3565.      IF x>0 THEN dec(x);
  3566.      IF y>0 THEN dec(y);
  3567.      IF x>250 THEN x:=250;
  3568.      IF y>MaxLines-1 THEN y:=MaxLines-1;
  3569.      DrawLocX:=x;
  3570.      DrawLocY:=y;
  3571.      MaxDrawStarty:=DrawLocy;
  3572.      MaxDrawLeny:=0;
  3573.      DrawPMCrtWindow;
  3574. END;
  3575.  
  3576. PROCEDURE HideCursor;
  3577. BEGIN
  3578.      CreatePMCrtWindow;
  3579.      Cursorvisible:=0;
  3580.      MaxDrawStarty:=DrawLocy;
  3581.      MaxDrawLeny:=0;
  3582.      DrawPMCrtWindow;
  3583. END;
  3584.  
  3585. PROCEDURE ShowCursor;
  3586. BEGIN
  3587.      CreatePMCrtWindow;
  3588.      Cursorvisible:=1;
  3589.      MaxDrawStarty:=DrawLocy;
  3590.      MaxDrawLeny:=0;
  3591.      DrawPMCrtWindow;
  3592. END;
  3593.  
  3594. PROCEDURE ClrScr;
  3595. BEGIN
  3596.      CreatePMCrtWindow;
  3597.      DrawLocx:=0;
  3598.      DrawLocY:=0;
  3599.      ASM
  3600.         MOV ECX,_MaxLines
  3601.         MOV AL,0
  3602. !cloop_1:
  3603.         MOV EDI,_PMScrBuf
  3604.         MOV [EDI+0],AL
  3605.         ADD EDI,256
  3606.         LOOP !cloop_1
  3607.      END;
  3608.      {prepare whole window for repaint}
  3609.      MaxDrawStarty:=0;
  3610.      MaxDrawLeny:=MaxLines;
  3611.      DrawPMCrtWindow;
  3612. END;
  3613.  
  3614. ASSEMBLER
  3615.  
  3616. !CharOut PROC NEAR32  ;Char in AL  ;Format in AH
  3617.              PUSH AX  ;Save char
  3618.              CALLN32 _CreatePMCrtWindow
  3619.              MOV EDI,_PMScrBuf
  3620.              MOV EAX,_DrawLocY
  3621.              SHL EAX,8  ;*256
  3622.              ADD EDI,EAX
  3623.  
  3624.              MOV EBX,_DrawLocX
  3625.              CMP EBX,255
  3626.              JAE !exco    ;Skip
  3627. !next_c:
  3628.              MOV AL,[EDI+0]
  3629.              MOVZX EAX,AL
  3630.              CMP EAX,75
  3631.              JAE !exco    ;Skip
  3632.              CMP EAX,EBX        ;until positions ok
  3633.              JA !go
  3634.              MOV ESI,EDI
  3635.              ADD ESI,EAX
  3636.              INC ESI
  3637.              MOVB [ESI+0],32    ;Fill with space
  3638.              INCB [EDI+0]
  3639.              JMP !next_c
  3640. !go:
  3641.              CMP EAX,EBX
  3642.              JA !ninc
  3643.              INCB [EDI+0]
  3644. !ninc:
  3645.              POP AX             ;Get char
  3646.              INC EBX
  3647.              CMP AH,1           ;Format ???
  3648.              JBE !nform2
  3649.              MOVZX ECX,AH
  3650.              DEC ECX
  3651. !lolo:
  3652.              INCB [EDI+0]
  3653.              MOV ESI,EDI
  3654.              ADD ESI,EBX
  3655.              MOVB [ESI+0],32
  3656.              INC EBX
  3657.              INCD _DrawLocX
  3658.              LOOP !lolo
  3659. !nform2:
  3660.              ADD EDI,EBX
  3661.              MOV [EDI+0],AL
  3662.              INCD _DrawLocX
  3663. !exco:
  3664.              RETN32
  3665. !CharOut ENDP
  3666.  
  3667. !WriteEnd PROC NEAR32
  3668.                   MOV EAX,_DrawLocY
  3669.                   MOV _MaxDrawStarty,EAX
  3670.                   MOVD _MaxDrawLeny,0  ;draw 1 line
  3671.                   MOV EAX,_DrawLocX
  3672.                   CMP EAX,74
  3673.                   JB !wncr
  3674.                   INCD _DrawLocY
  3675.                   MOV EAX,_DrawLocY
  3676.                   CMP EAX,_MaxLines
  3677.                   JB !ns22
  3678.                   ;Scroll the current window
  3679.                   CALLN32 _PMCrtScrollDown
  3680. !ns22:
  3681.                   MOVD _DrawLocX,0
  3682. !wncr:
  3683.                   CALLN32 _DrawPMCrtWindow
  3684.                   RETN32
  3685. !WriteEnd ENDP
  3686.  
  3687.  
  3688.  
  3689. !WritelnEnd PROC NEAR32
  3690.                   CALLN32 _CreatePMCrtWindow;
  3691.                   MOV EAX,_DrawLocY
  3692.                   MOV _MaxDrawStarty,EAX
  3693.                   MOVD _MaxDrawLeny,0  ;draw 1 line
  3694.                   INC EAX
  3695.                   MOV _DrawLocY,EAX
  3696.                   CMP EAX,_MaxLines
  3697.                   JB !ns
  3698.                   ;Scroll the current window
  3699.                   CALLN32 _PMCrtScrollDown
  3700. !ns:
  3701.                   MOVD _DrawLocX,0
  3702.                   CALLN32 _DrawPMCrtWindow
  3703.                   RETN32
  3704. !WritelnEnd ENDP
  3705.  
  3706.  
  3707. !Writeln PROC NEAR32
  3708.             CALLN32 !WritelnEnd
  3709.             RETN32
  3710. !Writeln ENDP
  3711.  
  3712.  
  3713. !WriteStr PROC NEAR32        ;put out string
  3714.          PUSH EBP
  3715.          MOV EBP,ESP
  3716.          SUB ESP,255
  3717.          PUSHL [EBP+10]
  3718.          LEA EAX,[EBP-255]
  3719.          PUSH EAX
  3720.          PUSH 255
  3721.          CALLN32 !STRCOPY
  3722. $S EQU [EBP-255]
  3723.  
  3724.          CALLN32 _CreatePMCrtWindow
  3725.  
  3726.          MOV AL,[EBP+8]      ;Format value
  3727.          LEA ESI,$S
  3728.          MOV BL,[ESI+0]      ;Actual len
  3729.          CMP BL,AL
  3730.          JAE !nform
  3731.  
  3732.          ;String must be extended
  3733.          SUB AL,BL           ;Char to extend
  3734.          MOVZX EAX,AL        ;Number of spaces to be inserted
  3735.          MOV CL,[ESI+0]      ;Length of string
  3736.          MOVZX ECX,CL
  3737.          ADD [ESI+0],AL      ;Increment length
  3738.          ADD ESI,ECX         ;Last char
  3739.          MOV EDI,ESI
  3740.          ADD EDI,EAX
  3741.          STD
  3742.          REP
  3743.          MOVSB
  3744.          CLD
  3745.          LEA EDI,$S
  3746.          INC EDI
  3747.          MOV ECX,EAX
  3748.          MOV AL,32
  3749.          REP
  3750.          STOSB
  3751. !nform:
  3752.          MOV EDI,_PMScrBuf
  3753.          MOV EAX,_DrawLocY
  3754.          SHL EAX,8  ;*256
  3755.          ADD EDI,EAX
  3756.  
  3757.          MOV EBX,_DrawLocX  ;is this the start of a line ?
  3758.          CMP EBX,0
  3759.          JNE !move          ;No --> special action required
  3760.  
  3761.          LEA ESI,$S         ;TextString
  3762.          MOV AL,[ESI+0]
  3763.          MOVZX EAX,AL
  3764.          ADD _DrawLocX,EAX
  3765.          PUSH ESI
  3766.          PUSH EDI
  3767.          PUSH 255
  3768.          CALLN32 !StrCopy
  3769.          LEAVE
  3770.          RETN32 6
  3771. !move:
  3772. !next_c_1:
  3773.          MOV AL,[EDI+0] ;Actual len of the line
  3774.          MOVZX EAX,AL
  3775.          CMP EAX,75
  3776.          JAE !exco_1    ;Skip
  3777.  
  3778.          CMP EAX,EBX    ;until positions ok (pos=DrawLocX)
  3779.          JA !go_1
  3780.          MOV ESI,EDI
  3781.          ADD ESI,EAX
  3782.          INC ESI
  3783.          MOVB [ESI+0],32  ;Fill with space
  3784.          INCB [EDI+0]
  3785.          JMP !next_c_1
  3786. !go_1:
  3787.          LEA ESI,$S         ;TextString
  3788.          MOV AL,[ESI+0]     ;Length of the string
  3789.          INC ESI
  3790.          MOVZX EAX,AL       ;Bytes to copy
  3791.          MOV BL,[EDI+0]     ;Current length of the line
  3792.          MOVZX EBX,BL
  3793.  
  3794.          MOV ECX,EAX
  3795.          ADD ECX,EBX
  3796.          CMP ECX,75
  3797.          JB !aok            ;This fits into this line
  3798.          ;Limit exceeeded --> Cut String and NewLine
  3799.          MOV EAX,75
  3800.          SUB EAX,EBX     ;Calculate positions that are free
  3801. !aok:
  3802.          CMP EAX,0       ;Current bytes to tranmit
  3803.          JE !exco_1      ;No bytes to transmit
  3804.  
  3805.          MOV ECX,_DrawLocX
  3806.          ADD ECX,EAX      ;Add Bytes to Transmit
  3807.          MOV [EDI+0],CL   ;increment textlen
  3808.  
  3809.          MOV EBX,_DrawLocX
  3810.          ADD _DrawLocX,EAX
  3811.  
  3812.          ADD EDI,EBX        ;set to location
  3813.          INC EDI
  3814.  
  3815.          MOV ECX,EAX        ;Bytes to copy
  3816.          CLD
  3817.          REP
  3818.          MOVSB
  3819. !exco_1:
  3820.          LEAVE
  3821.          RETN32 6
  3822. !WriteStr ENDP
  3823.  
  3824. !WriteWord PROC NEAR32       ;(AX:word)           gibt 16 bit Zahl in AX aus
  3825.           PUSH EBP
  3826.           MOV EBP,ESP
  3827.           SUB ESP,255
  3828. $!TempStr EQU [EBP-255]
  3829.           MOV BL,[EBP+8]     ;Format
  3830.           PUSH BX
  3831.  
  3832.           MOVZX EAX,AX
  3833.           PUSH EAX
  3834.           LEA EAX,$!TempStr
  3835.           PUSH EAX
  3836.           CALLN32 _ToStr
  3837.  
  3838.           POP BX
  3839.           LEA EAX,$!TempStr
  3840.           PUSH EAX
  3841.           PUSH BX          ;Format
  3842.           CALLN32 !WriteStr
  3843.           LEAVE
  3844.           RETN32 2    ;keine Parameter
  3845. !WriteWord ENDP
  3846.  
  3847. !WriteInt PROC NEAR32       ;(AX:word) gibt 16 bit Zahl in AX aus mit Vorzeichen
  3848.           PUSH EBP
  3849.           MOV EBP,ESP
  3850.           SUB ESP,255
  3851. $!TempStr EQU [EBP-255]
  3852.           MOV BL,[EBP+8]     ;Format
  3853.           PUSH BX
  3854.           MOV CX,0
  3855.           CMP AX,0
  3856.           JNS !novorz
  3857.           MOV CX,1           ;'-' requested
  3858.           NEG AX
  3859. !novorz:
  3860.           PUSH CX            ;Format
  3861.           MOVZX EAX,AX
  3862.           PUSH EAX
  3863.           LEA EAX,$!TempStr
  3864.           PUSH EAX
  3865.           CALLN32 _ToStr
  3866.           POP CX             ;Format
  3867.           CMP CX,0
  3868.           JE !n_min
  3869.  
  3870.           LEA ESI,$!TempStr
  3871.           MOV CL,[ESI+0]
  3872.           INCB [ESI+0]
  3873.           MOVZX ECX,CL
  3874.           ADD ESI,ECX
  3875.           MOV EDI,ESI
  3876.           INC EDI
  3877.           STD
  3878.           REP
  3879.           MOVSB
  3880.           CLD
  3881.           LEA ESI,$!TempStr
  3882.           MOVB [ESI+1],'-'
  3883. !n_min:
  3884.           POP BX
  3885.           LEA EAX,$!TempStr
  3886.           PUSH EAX
  3887.           PUSH BX          ;Format
  3888.           CALLN32 !WriteStr
  3889.           LEAVE
  3890.           RETN32 2    ;keine Parameter
  3891. !WriteInt ENDP
  3892.  
  3893.  
  3894. !WriteLongWord PROC NEAR32       ;(EAX:word)    gibt 32 bit Zahl in EAX aus
  3895.              PUSH EBP
  3896.              MOV EBP,ESP
  3897.              SUB ESP,255
  3898. $!TempStr EQU [EBP-255]
  3899.              MOV BL,[EBP+8]     ;Format
  3900.              PUSH BX
  3901.  
  3902.              PUSH EAX
  3903.              LEA EAX,$!TempStr
  3904.              PUSH EAX
  3905.              CALLN32 _ToStr
  3906.  
  3907.              POP BX
  3908.              LEA EAX,$!TempStr
  3909.              PUSH EAX
  3910.              PUSH BX          ;Format
  3911.              CALLN32 !WriteStr
  3912.              LEAVE
  3913.              RETN32 2  ;keine Parameter
  3914. !WriteLongWord ENDP
  3915.  
  3916. !WriteLongInt PROC NEAR32       ;(EAX:word)    gibt 32 bit Zahl in EAX aus
  3917.              PUSH EBP
  3918.              MOV EBP,ESP
  3919.              SUB ESP,255
  3920. $!TempStr EQU [EBP-255]
  3921.              MOV BL,[EBP+8]     ;Format
  3922.              PUSH BX
  3923.              MOV CX,0
  3924.              CMP EAX,0
  3925.              JNS !novorz1
  3926.              MOV CX,1
  3927.              NEG EAX
  3928. !novorz1:
  3929.              PUSH CX            ;Format
  3930.              PUSH EAX
  3931.              LEA EAX,$!TempStr
  3932.              PUSH EAX
  3933.              CALLN32 _ToStr
  3934.              POP CX             ;Format
  3935.              CMP CX,0
  3936.              JE !n_min1
  3937.  
  3938.              LEA ESI,$!TempStr
  3939.              MOV CL,[ESI+0]
  3940.              INCB [ESI+0]
  3941.              MOVZX ECX,CL
  3942.              ADD ESI,ECX
  3943.              MOV EDI,ESI
  3944.              INC EDI
  3945.              STD
  3946.              REP
  3947.              MOVSB
  3948.              CLD
  3949.              LEA ESI,$!TempStr
  3950.              MOVB [ESI+1],'-'
  3951. !n_min1:
  3952.              POP BX
  3953.              LEA EAX,$!TempStr
  3954.              PUSH EAX
  3955.              PUSH BX          ;Format
  3956.              CALLN32 !WriteStr
  3957.              LEAVE
  3958.              RETN32 2    ;keine Parameter
  3959. !WriteLongInt ENDP
  3960.  
  3961.  
  3962. END;
  3963.  
  3964.  
  3965.  
  3966. {*************************************************************************
  3967. *                                                                        *
  3968. *                                                                        *
  3969. *           SYSTEM initialization procedures                             *
  3970. *                                                                        *
  3971. *                                                                        *
  3972. **************************************************************************}
  3973.  
  3974.  
  3975. ASSEMBLER
  3976.  
  3977. !SystemEnd PROC NEAR32
  3978.            XOR AH,AH
  3979.            MOV _ExitCode,AX
  3980. exloop1:
  3981.            PUSHL OFFSET(@raddr1)  ;Returnadress for ExitProc
  3982.            PUSHL _ExitProc    ;ExitProc on Stack
  3983.            RETN32             ;jump into ExitProc
  3984. @raddr1
  3985.            JMP exloop1        ;until termination
  3986. !SystemEnd ENDP
  3987.  
  3988. !Halt1 PROC NEAR32
  3989.       MOV AX,_ExitCode
  3990.       PUSH AX
  3991.       CALLN32 _Halt
  3992. !Halt1 ENDP
  3993.  
  3994. !SystemInit PROC NEAR32  ;SystemHeapSize in EAX
  3995.            ;Initialize FPU
  3996.            db 0dbh,0e3h              ;FINIT Init FPU
  3997.            db 0dbh,0e2h              ;FCLEX Clear Exceptions
  3998.            FLDCW !FPUControl         ;Load Control word
  3999.            FWAIT
  4000.            ;allocate main memory (uncommitted) for suballocation
  4001.            ;via Getmem and Freemem
  4002.            MOV EBX,1024
  4003.            MUL EBX
  4004.            MOV _HeapSize,EAX
  4005.            PUSHL 3         ;Flags PAG_READ|PAG_WRITE
  4006.            PUSH EAX        ;Length of memory
  4007.            PUSHL OFFSET(_Heaporg)
  4008.            MOV AL,3             ;3 Parameters
  4009.            CALLDLL DosCalls,299 ;DosAllocMem
  4010.            ADD ESP,12            ;Clear Stack
  4011.            CMP EAX,0
  4012.            JNE !ei
  4013.  
  4014.            ;Prepare the memory block for suballocation
  4015.            PUSHL _HeapSize      ;Size of Heap
  4016.            PUSHL 5              ;Flags DOSSUB_INIT|DOSSUB_SPARSE_OBJ
  4017.            PUSHL _Heaporg
  4018.            MOV AL,3
  4019.            CALLDLL DosCalls,344 ;DosSubSetMem
  4020.            ADD ESP,12            ;Clear Stack
  4021.            CMP EAX,0
  4022.            JNE !ei
  4023.  
  4024.            MOV EAX,_HeapOrg
  4025.            MOV _HeapPtr,EAX
  4026.            ADD EAX,_HeapSize
  4027.            MOV _HeapEnd,EAX
  4028.            MOV EAX,*!Halt1       ;Standard exit procedure
  4029.            MOV _ExitProc,EAX
  4030.            ;Create Application anchor handle
  4031.            PUSHL 0
  4032.            MOV AL,1
  4033.            CALLDLL PMWIN,763   ;WinInitialize
  4034.            ADD ESP,4
  4035.            MOV _AppHandle,EAX
  4036.            ;Create Application Message queue
  4037.            PUSHL 0
  4038.            PUSHL _AppHandle
  4039.            MOV AL,2
  4040.            CALLDLL PMWIN,716   ;WinCreateMsgQueue
  4041.            ADD ESP,8
  4042.            MOV _AppQueueHandle,EAX
  4043.  
  4044.            PUSH 0
  4045.            PUSHL OFFSET(!TempString)
  4046.            CALLN32 _ParamStr   ;Get name of program
  4047.  
  4048.            PUSHL OFFSET(!TempString)
  4049.            PUSHL OFFSET(_PMCRTTITLE)
  4050.            PUSH 255
  4051.            CALLN32 !StrCopy
  4052.            MOVD _TextBackCol,-2
  4053.            MOVD _SeekMode,0   ;FILE_BEGIN
  4054.            MOVD _FileMode,42h ;fmInOut
  4055.            MOVB _CrtKeyCount,0
  4056.            MOVD _CursorVisible,1  ;Cursor is visible
  4057.            RETN32
  4058. !ei:
  4059.            ;Error during initialization
  4060.            POP EAX                ;Address from which the error came
  4061.            MOV _ErrorAddr,EAX
  4062.            PUSH 216               ;Access violation
  4063.            CALLN32 _RunErrorIntern
  4064. !SystemInit ENDP
  4065.  
  4066. !VmtCall PROC NEAR32  ;(object:Pointer;) numProc in AX
  4067.         PUSH EBP
  4068.         MOV EBP,ESP
  4069.         MOV EDI,[EBP+8]
  4070.         CMP EDI,0
  4071.         JNE !obj_init
  4072. !obj_error:
  4073.         ;Object not initialized or VMT damaged
  4074.         PUSH 210               ;Object not initialized
  4075.         CALLN32 _RunErrorIntern
  4076. !obj_init
  4077.         MOV EBX [EDI+0]
  4078.         CMP EBX,0
  4079.         JE !obj_error
  4080.         MOV EDI,[EDI+0]  ;get VMT pointer
  4081.         DEC AX
  4082.         SHL AX,2         ;VmtNummer*2
  4083.         MOVZX EAX,AX
  4084.         ADD EDI,EAX      ;add NumProc
  4085.         LEAVE
  4086.         db ffh,27h       ;JMP NEAR32 [EDI+0] --> in Methode springen
  4087.         RETN32
  4088. !VmtCall ENDP
  4089.  
  4090. END;
  4091.  
  4092.  
  4093. {*************************************************************************
  4094. *                                                                        *
  4095. *                                                                        *
  4096. *             KeyBoard Procedures and functions                          *
  4097. *                                                                        *
  4098. *                                                                        *
  4099. **************************************************************************}
  4100.  
  4101. FUNCTION KeyPressed: Boolean;
  4102. VAR _qmsg:QMSG;
  4103.     MsgIdent:LONGWORD;
  4104. begin
  4105.   CreatePMCrtWindow;
  4106.   ASM
  4107. !next_mess:
  4108.       CMPB _CrtKeyCount,0
  4109.       JA !exm
  4110.  
  4111.       PUSHL 0
  4112.       PUSHL 0
  4113.       PUSHL 0
  4114.       LEA EAX,$_qmsg
  4115.       PUSH EAX
  4116.       PUSHL _AppHandle
  4117.       MOV AL,5
  4118.       CALLDLL PMWIN,915  ;WinGetMsg
  4119.       ADD ESP,20
  4120.       CMP EAX,0
  4121.       JNE !exm_1
  4122.       MOVD _PMCrtWindow,0
  4123.       MOV AX,0
  4124.       CALLN32 !SystemEnd  ;WM_QUIT message detected
  4125. !exm_1:
  4126.       LEA EAX,$_qmsg
  4127.       PUSH EAX
  4128.       PUSHL _AppHandle
  4129.       MOV AL,2
  4130.       CALLDLL PMWIN,912  ;WinDispatchMsg
  4131.       ADD ESP,8
  4132. !exm:
  4133.   END;
  4134.   IF CrtKeyCount>0 THEN KeyPressed:=TRUE
  4135.   ELSE KeyPressed:=FALSE;
  4136. END;
  4137.  
  4138. FUNCTION ReadKey:Char;
  4139. var t:byte;
  4140. begin
  4141.     CreatePMCrtWindow;
  4142.     REPEAT UNTIL KeyPressed;
  4143.     ReadKey:=KeyBuffer[0];
  4144.     Dec(CrtKeyCount);
  4145.     FOR t:=0 to CrtKeyCount do KeyBuffer[t]:=Keybuffer[t+1];
  4146.     ASM
  4147.        ;Function result
  4148.        MOV AL,[EBP-2]
  4149.     END;
  4150. end;
  4151.  
  4152. ASSEMBLER
  4153.  
  4154. !ReadStr PROC NEAR32  ;read string from comsole [EBP+8] is output
  4155.                    PUSH EBP
  4156.                    MOV EBP,ESP
  4157.                    SUB ESP,2
  4158.                    CALLN32 _CreatePMCrtWindow
  4159.                    PUSHA         ;PUSHAD
  4160.                    MOV EDI,[EBP+8]
  4161.                    INC EDI       ;on first character
  4162.                    MOV ECX,0     ;Length is currently zero
  4163. _nez:
  4164.                    PUSHA
  4165.                    CALLN32 _ReadKey   ;read a character
  4166.                    CMP AL,0dh          ;is it a CR
  4167.                    JE !zcr             ;yes !
  4168.                    MOV [EBP-2],AL      ;save
  4169.                    CMP AL,8            ;is it a BS
  4170.                    JNE __!nbs
  4171.  
  4172.                    POPA
  4173.                    MOV EAX,[EBP+8]
  4174.                    CMP ECX,0
  4175.                    JE _nez             ;Backspace cannot be first char
  4176.                    DEC EDI
  4177.                    PUSHA
  4178.                    DECD _DrawLocX
  4179.                    MOV AL,32
  4180.                    MOV AH,0
  4181.                    CALLN32 !CharOut
  4182.                    DECD _DrawLocX
  4183.                    CALLN32 !WriteEnd
  4184.                    POPA
  4185.                    DEC ECX
  4186.                    JMP _nez
  4187. __!nbs:
  4188.                    MOV AH,0
  4189.                    CALLN32 !CharOut    ;and put out
  4190.                    CALLN32 !WriteEnd
  4191. _nv10:
  4192.                    POPA
  4193.                    MOV AL,[EBP-2]      ;get char
  4194.                    MOV [EDI+0],AL      ;and save
  4195.                    INC EDI
  4196.                    INC ECX             ;save length
  4197.                    CMP ECX,254         ;already 255 chars ?
  4198.                    JB _nez             ;no-->next char
  4199.                    PUSHA
  4200.  
  4201. !zcr:
  4202.                    POPA
  4203.                    MOV ESI,[EBP+8]
  4204.                    MOV [ESI+0],CL      ;save length
  4205.                    CALLN32 !WriteEnd
  4206.                    POPA
  4207.                    LEAVE
  4208.                    RETN32
  4209. !ReadStr ENDP
  4210.  
  4211. !ReadLongWord PROC NEAR32   ;(var value:word)   read word from console
  4212.          PUSH EBP
  4213.          MOV EBP,ESP
  4214.          SUB ESP,259
  4215. $!TempStr EQU [EBP-259]
  4216.          CALLN32 _CreatePMCrtWindow
  4217.          LEA EAX,$!TempStr
  4218.          PUSH EAX
  4219.          CALLN32 !ReadStr   ;to !TempString
  4220.          LEA ESI,$!TempStr
  4221.          MOVD [EBP-4],0     ;Word to 0
  4222.          MOV EBX,1           ;value to multiply
  4223.          MOV CL,[ESI+0]     ;get length
  4224.          MOVZX ECX,CL
  4225.          CMP CL,0           ;no input ??
  4226.          JE l4
  4227.          ADD ESI,ECX        ;onto first char
  4228. L3:
  4229.          MOV AL,[ESI+0]     ;get char
  4230.          DEC ESI
  4231.          SUB AL,48
  4232.          MOVZX EAX,AL
  4233.          MUL EBX
  4234.          ADD [EBP-4],EAX
  4235.          MOV EAX,EBX
  4236.          MOV EBX,10
  4237.          MUL EBX
  4238.          MOV EBX,EAX          ;Multiplikator
  4239.          LOOP L3
  4240. L4:
  4241.          MOV EAX,[EBP-4]
  4242.          LEAVE
  4243.          RETN32             ;no parameters
  4244. !ReadLongWord ENDP
  4245.  
  4246. END; {ASSEMBLER}
  4247.  
  4248. {*************************************************************************
  4249. *                                                                        *
  4250. *                                                                        *
  4251. *             Floating point support                                     *
  4252. *                                                                        *
  4253. *                                                                        *
  4254. **************************************************************************}
  4255.  
  4256. PROCEDURE SetTrigMode(mode:BYTE);
  4257. BEGIN
  4258.      CASE Mode OF
  4259.         Rad:IsNotRad:=FALSE;
  4260.         Deg:
  4261.         BEGIN
  4262.              ToRad:=0.01745329262;
  4263.              FromRad:=57.29577951;
  4264.              IsNotRad:=TRUE;
  4265.         END;
  4266.         Gra:
  4267.         BEGIN
  4268.              ToRad:=0.01570796327;
  4269.              FromRad:=63.66197724;
  4270.              IsNotRad:=TRUE;
  4271.         END;
  4272.      END; {case}
  4273. END;
  4274.  
  4275. ASSEMBLER
  4276.  
  4277. !RadArc PROC NEAR32  ;Converts ST(0) to Rad
  4278.        CMPB _IsNotRad,1
  4279.        JNE !!!_l80
  4280.        FLDT _ToRad
  4281.        DB deh,c9h  ;FMULP ST(1),ST
  4282. !!!_l80:
  4283.        RETN32
  4284. !RadArc ENDP
  4285.  
  4286. !NormRad PROC NEAR32  ;Converts ST(0) to actual TrigMode
  4287.        CMPB _IsNotRad,1
  4288.        JNE !!!_l81
  4289.        FLDT _FromRad
  4290.        DB deh,c9h  ;FMULP ST(1),ST
  4291. !!!_l81:
  4292.        RETN32
  4293. !NormRad ENDP
  4294.  
  4295.  
  4296. !Calculate PROC NEAR32
  4297. ;Input EDI String
  4298. ;CX Count
  4299. ;Output Value in ST(0)
  4300.          PUSH EBP
  4301.          MOV EBP,ESP
  4302.          SUB ESP,2
  4303. !!!weiter1:
  4304.          MOV AL,[EDI+0]
  4305.          SUB AL,3ah
  4306.          ADD AL,0ah
  4307.          JNB !!!ex
  4308.          XOR AH,AH
  4309.          MOV [EBP-2],AX
  4310.          FILDD !C10
  4311.          db 0deh,0c9h           ;FMULP ST(1),ST
  4312.          FILDW [EBP-2]
  4313.          db 0deh,0c1h           ;FADDP ST(1),ST
  4314.          INC EDI
  4315.          DEC CX
  4316.          CMP CX,0
  4317.          JE !!!ex
  4318.          JMP !!!weiter1
  4319. !!!ex:
  4320.          LEAVE
  4321.          RETN32
  4322. !Calculate ENDP
  4323.  
  4324. !DivMul10 PROC NEAR32
  4325. ;Input: BX Count of divides/mult by 10
  4326. ;       AL 0-mult 1-divide
  4327.         MOV CX,BX
  4328.         AND CX,7                ;only values 0..7
  4329.         MOV ESI,OFFSET(!DivTab)
  4330.         MOVZX ECX,CX
  4331.         SHL ECX,1
  4332.         SHL ECX,1
  4333.         ADD ESI,ECX
  4334.         FILDD [ESI+0]   ;10..10000000 laden
  4335.         SHR BX,1
  4336.         SHR BX,1
  4337.         SHR BX,1                ;divide numbers by 8
  4338.         MOV ESI,OFFSET(!Power10Tab)
  4339.         CMP BX,0
  4340.         JE !!!process
  4341. !!!Power10:
  4342.         SHR BX,1
  4343.         JNB !!!mm            ;until a bit is set
  4344.         FLDT [ESI+0]
  4345.         db 0deh,0c9h              ;FMULP ST(1),ST
  4346. !!!mm:
  4347.         ADD ESI,10
  4348.         CMP BX,0
  4349.         JNE !!!Power10
  4350. !!!process:
  4351.         CMP AL,1
  4352.         JNE !!!_mul
  4353.         db 0deh,0f9h             ;FDIVP ST(1),ST
  4354.         RETN32
  4355. !!!_mul:
  4356.         db 0deh,0c9h             ;FMULP ST(1),ST
  4357.         RETN32
  4358. !DivMul10 ENDP
  4359.  
  4360. !Str2Float PROC NEAR32
  4361. ;Input EDI  String to convert
  4362. ;      CX     Length of this string
  4363. ;Output Floating point value in ST(0)
  4364.         PUSH EBP
  4365.         MOV EBP,ESP
  4366.         SUB ESP,6     ;for Control word and sign
  4367.  
  4368.         FSTCW [EBP-2] ;Store control word
  4369.         FWAIT
  4370.         db 0dbh,0e2h                 ;FCLEX Clear exceptions
  4371.         FLDCW !FPUControl  ;Load control word
  4372.         FWAIT
  4373.         db 0d9h,0eeh               ;FLDZ Load +0.0
  4374.         MOVB [EBP-4],0         ;sign is positive
  4375.         MOVW [EBP-6],0         ;count of numbers after point
  4376. !!!again:
  4377.         CMP CX,0              ;String has zero length ?
  4378.         JE !!!Error
  4379.  
  4380.         MOV AL,[EDI+0]        ;load character
  4381.         CMP AL,43  ;'+'
  4382.         JNE !!!not_plus
  4383.         ;Sign '+' was detected
  4384.         INC EDI
  4385.         DEC CX
  4386.         CMP CX,0
  4387.         JE !!!Error
  4388.         JMP !!!weiter
  4389. !!!not_plus:
  4390.         CMP AL,45   ;'-'
  4391.         JNE !!!not_minus
  4392.         ;Sign '-' was detected
  4393.         MOVB [EBP-4],1 ;Sign is negative
  4394.         INC EDI
  4395.         DEC CX
  4396.         CMP CX,0
  4397.         JE !!!Error
  4398.         JMP !!!weiter
  4399. !!!not_minus:
  4400.         CMP AL,32
  4401.         JNE !!!weiter
  4402.         INC EDI
  4403.         DEC CX
  4404.         JMP !!!again
  4405. !!!weiter:
  4406.         CALLN32 !Calculate                ;Calculate numbers before point
  4407.         CMP CX,0
  4408.         JE !!!no_exp
  4409.  
  4410.         ;Look for .
  4411.         MOV AL,[EDI+0]
  4412.         CMP AL,'.'
  4413.         JNE !!!Change
  4414.         DEC CX
  4415.         INC EDI
  4416.         PUSH CX
  4417.         CALLN32 !Calculate              ;Calculate numbers after point
  4418.         POP BX
  4419.         SUB BX,CX
  4420.         MOV [EBP-6],BX               ;Count of numbers after point
  4421. !!!Change:
  4422.         ;in ST(0) is now an integer value
  4423.         ;[EBP-6] contains the current numbers after the point
  4424.         CMPB [EBP-4],1
  4425.         JNE !!!not_neg
  4426.         db 0d9h,0e0h,9bh             ;FCHS+FWAIT change sign
  4427. !!!not_neg:
  4428.         ;Check for exponent
  4429.         CMP CX,0
  4430.         JE !!!no_exp
  4431.         MOV AL,[EDI+0]
  4432.         CMP AL,'e'
  4433.         JE !!!exp
  4434.         CMP AL,'E'
  4435.         JNE !!!no_exp
  4436. !!!exp:
  4437.         ;an exponent was detected
  4438.         INC EDI
  4439.         DEC CX
  4440.         CMP CX,0
  4441.         JE !!!Error
  4442.         db 0d9h,0eeh             ;FLDZ Load +0.0
  4443.         MOVB [EBP-4],0    ;sign is positive
  4444.         MOV AL,[EDI+0]
  4445.         CMP AL,'-'
  4446.         JNE !!!no_minus
  4447.         MOVB [EBP-4],1   ;sign is negative
  4448.         INC EDI
  4449.         DEC CX
  4450.         CMP CX,0
  4451.         JE !!!Error
  4452.         JMP !!!Calc
  4453. !!!no_minus:
  4454.         CMP AL,43   ;'+'
  4455.         JNE !!!calc
  4456.         INC EDI
  4457.         DEC CX
  4458.         CMP CX,0
  4459.         JE !!!Error
  4460. !!!calc:
  4461.         CALLN32 !Calculate
  4462.         FISTPW !Exponent   ;Store integer value and pop
  4463.         MOV BX,!Exponent
  4464.         MOV AL,0                 ;Mult
  4465.         CMPB [EBP-4],1
  4466.         JNE !!!make
  4467.         MOV AL,1                 ;Divide if Exponent negative
  4468. !!!make:
  4469.         PUSH CX
  4470.         CALLN32 !DivMul10
  4471.         POP CX
  4472. !!!no_exp:
  4473.         CMP CX,0
  4474.         JNE !!!Error     ;invalid chars
  4475.         MOV BX,[EBP-6]
  4476.         MOV AL,1      ;Divide
  4477.         CALLN32 !DivMul10
  4478.         JMP !!!ok
  4479. !!!Error:
  4480.         MOVW _IoResult,1      ;FPU error
  4481. !!!ok:
  4482.         LEAVE
  4483.         RETN32
  4484. !Str2Float ENDP
  4485.  
  4486. !Str2Real PROC NEAR32
  4487.        PUSH EBP
  4488.        MOV EBP,ESP
  4489.  
  4490.        MOV EDI,[EBP+16]
  4491.        MOV CL,[EDI+0]
  4492.        INC EDI
  4493.        XOR CH,CH
  4494.        CALLN32 !Str2Float
  4495.        MOV EDI,[EBP+12]
  4496.        FSTPD [EDI+0]
  4497.  
  4498.        MOV EDI,[EBP+8]      ;Result
  4499.        MOVW [EDI+0],0
  4500.        CMPW _FPUResult,0
  4501.        JE !!__fex1
  4502.        MOVW [EDI+0],1
  4503. !!__fex1:
  4504.        LEAVE
  4505.        RETN32 12
  4506. !Str2Real ENDP
  4507.  
  4508. !Str2Double PROC NEAR32
  4509.        PUSH EBP
  4510.        MOV EBP,ESP
  4511.  
  4512.        MOV EDI,[EBP+16]
  4513.        MOV CL,[EDI+0]
  4514.        INC EDI
  4515.        XOR CH,CH
  4516.        CALLN32 !Str2Float
  4517.        MOV EDI,[EBP+12]
  4518.        FSTPQ [EDI+0]
  4519.  
  4520.        MOV EDI,[EBP+8]     ;Result
  4521.        MOVW [EDI+0],0
  4522.        CMPW _FPUResult,0
  4523.        JE !!__fex11
  4524.        MOVW [EDI+0],1
  4525. !!__fex11:
  4526.        LEAVE
  4527.        RETN32 12
  4528. !Str2Double ENDP
  4529.  
  4530. !Str2Extended PROC NEAR32
  4531.        PUSH EBP
  4532.        MOV EBP,ESP
  4533.  
  4534.        MOV EDI,[EBP+16]
  4535.        MOV CL,[EDI+0]
  4536.        INC EDI
  4537.        XOR CH,CH
  4538.        CALLN32 !Str2FLoat
  4539.        MOV EDI,[EBP+12]
  4540.        FSTPT [EDI+0]
  4541.  
  4542.        MOV EDI,[EBP+8]   ;Result
  4543.        MOVW [EDI+0],0
  4544.        CMPW _FPUResult,0
  4545.        JE !!__fex111
  4546.        MOVW [EDI+0],1
  4547. !!__fex111:
  4548.        LEAVE
  4549.        RETN32 12
  4550. !Str2Extended ENDP
  4551.  
  4552.  
  4553. !ValReal PROC NEAR32
  4554. ;Input EDI Destination string
  4555. ;      ST(0) Float value
  4556. ;      AX Nachkommastellen 0..9  (FFFF=alle bis zu einer 0)
  4557.        PUSH EBP
  4558.        MOV EBP,ESP
  4559.        SUB ESP,48
  4560.  
  4561.        PUSH EDI
  4562.        INC EDI
  4563.  
  4564.        FSTPT [EBP-10]    ;Store original value
  4565.  
  4566.        FLDT [EBP-10]    ;original value
  4567.        FLDCW !FPURound  ;Load control word
  4568.        FWAIT
  4569.        db 0d9h,0fch             ;FRNDINT
  4570.        FLDCW !FPUControl ;Load control word
  4571.        FWAIT
  4572.        FSTPT [EBP-20]    ;Store Ganzzahl
  4573.  
  4574.        FLDT [EBP-10]    ;original value
  4575.        FLDT [EBP-20]    ;Ganzzahl
  4576.        db 0deh,0e9h             ;FSUBP ST(1),ST
  4577.  
  4578.        ;gebrochener Anteil nun in ST(0)
  4579.        db 0d9h,0e8h     ;FLD1
  4580.        db 0d8h,0d9h             ;FCOMP ST(1)
  4581.        FWAIT
  4582.        FSTSW [EBP-48]
  4583.        MOV AX,[EBP-48]
  4584.        SAHF
  4585.        JNE !!!ne_1              ;Nachkommastellen<1.0
  4586.        ;Kommastellen wurden aufgerundet --> korrigieren
  4587.        db 0ddh,0c0h            ;FFREE ST
  4588.        FLDT [EBP-20]           ;Ganzzahl
  4589.        db 0d9h,0e8h     ;FLD1
  4590.        db 0deh,0c1h            ;FADDP ST(1),ST  1 addieren
  4591.        FSTPT [EBP-20]          ;Store Ganzzahl
  4592.        db 0d9h,0eeh            ;FLDZ Nachkommastellen sind 0
  4593. !!!ne_1:
  4594.        MOV ESI,OFFSET(!DivTab)
  4595.        CMP AX,0FFFFh
  4596.        JNE !!!no_std
  4597.        ;alle Stellen bis zu einer 0
  4598.        ADD ESI,36
  4599.        JMP !!!pp
  4600. !!!no_std:
  4601.        CMP AX,9
  4602.        JBE !!!pp1
  4603.        MOV AX,9
  4604. !!!pp1:
  4605.        MOV BX,AX
  4606.        SHL BX,1
  4607.        SHL BX,1
  4608.        MOVZX EBX,BX
  4609.        ADD ESI,EBX
  4610. !!!pp:
  4611.        MOV [EBP-32],AX  ;Nachkommastellen
  4612.        FILDD [ESI+0]
  4613.        db 0deh,0c9h             ;FMULP ST(1),ST Kommastellen erweitern
  4614.        db 0d9h,0e1h    ;FABS
  4615.        FSTPT [EBP-30]   ;Kommastellen
  4616.  
  4617.        FLDT [EBP-10]    ;original value
  4618.        db 0d9h,0e4h             ;FTST
  4619.        FWAIT
  4620.        FSTSW [EBP-48]
  4621.        MOV AX,[EBP-48]
  4622.        SAHF
  4623.        JAE !!!_eq
  4624.        MOV AL,'-'
  4625.        CLD
  4626.        STOSB
  4627. !!!_eq:
  4628.        db 0ddh,0c0h            ;FFREE ST
  4629.        MOV ESI,OFFSET(!DivTab)
  4630.        ADD ESI,4
  4631.        FLDT [EBP-20]    ;Ganzzahl
  4632.        db 0d9h,0e1h    ;FABS
  4633.        MOV CX,0
  4634. !!!_Rep:
  4635.        FILDD [ESI+0]
  4636.        db 0deh,0f9h             ;FDIVP ST(1),ST Divide by 10
  4637.        FSTPT [EBP-42]
  4638.  
  4639.        FLDT [EBP-42]
  4640.        FLDT [EBP-42]
  4641.        FLDCW !FPURound  ;Load control word
  4642.        FWAIT
  4643.        db 0d9h,0fch             ;FRNDINT
  4644.        FLDCW !FPUControl ;Load control word
  4645.        FWAIT
  4646.        db 0deh,0e9h             ;FSUBP ST(1),ST Kommastellen
  4647.        FILDD [ESI+0]
  4648.        db 0deh,0c9h             ;FMULP ST(1),ST Multiply with 10
  4649.        FISTPD [EBP-46]
  4650.        MOV AX,[EBP-46]          ;Zahl
  4651.        ADD AX,48
  4652.        PUSH AX
  4653.        INC CX
  4654.  
  4655.        FLDT [EBP-42]
  4656.        FLDCW !FPURound  ;Load control word
  4657.        FWAIT
  4658.        db 0d9h,0fch             ;FRNDINT
  4659.        FLDCW !FPUControl ;Load control word
  4660.        FWAIT
  4661.        db 0d9h,0e4h             ;FTST
  4662.        FWAIT
  4663.        FSTSW [EBP-48]
  4664.        MOV AX,[EBP-48]
  4665.        SAHF
  4666.        JNE !!!_Rep                ;Until Zero
  4667.  
  4668.        CMP CX,0
  4669.        JE !!!_nk
  4670.  
  4671.        db 0ddh,0c0h            ;FFREE ST
  4672.        MOVZX ECX,CX
  4673.        CLD
  4674. !!!llo:
  4675.        POP AX
  4676.        STOSB
  4677.        LOOP !!!llo
  4678.  
  4679.        MOV AL,'.'
  4680.        STOSB
  4681. !!!_nk:
  4682.        FLDT [EBP-30]    ;Kommastellen
  4683.        MOV ECX,0
  4684.        db 0d9h,0e4h             ;FTST   -- Kommastellen 0 ???
  4685.        FWAIT
  4686.        FSTSW [EBP-48]
  4687.        MOV AX,[EBP-48]
  4688.        SAHF
  4689.        JNE !!!_Rep1             ;Not Zero
  4690.        MOV ECX,9                ;Fill it up with 9 zeros
  4691.        PUSH 48  ;'0'
  4692.        PUSH 48  ;'0'
  4693.        PUSH 48  ;'0'
  4694.        PUSH 48  ;'0'
  4695.        PUSH 48  ;'0'
  4696.        PUSH 48  ;'0'
  4697.        PUSH 48  ;'0'
  4698.        PUSH 48  ;'0'
  4699.        PUSH 48  ;'0'
  4700.        JMP !!!zzz
  4701. !!!_Rep1:
  4702.        FILDD [ESI+0]
  4703.        db 0deh,0f9h             ;FDIVP ST(1),ST Divide by 10
  4704.        FSTPT [EBP-42]
  4705.  
  4706.        FLDT [EBP-42]
  4707.        FLDT [EBP-42]
  4708.        FLDCW !FPURound  ;Load control word
  4709.        FWAIT
  4710.        db 0d9h,0fch                ;FRNDINT
  4711.        FLDCW !FPUControl ;Load control word
  4712.        FWAIT
  4713.        db 0deh,0e9h             ;FSUBP ST(1),ST Kommastellen
  4714.        FILDD [ESI+0]
  4715.        db 0deh,0c9h             ;FMULP ST(1),ST  Multiply with 10
  4716.        FISTPD [EBP-46]
  4717.        MOV AX,[EBP-46]          ;Zahl
  4718.        ADD AX,48
  4719.        PUSH AX
  4720.        INC CX
  4721.  
  4722.        FLDT [EBP-42]
  4723.        FLDCW !FPURound  ;Load control word
  4724.        FWAIT
  4725.        db 0d9h,0fch             ;FRNDINT
  4726.        FLDCW !FPUControl ;Load control word
  4727.        FWAIT
  4728.        db 0d9h,0e4h             ;FTST
  4729.        FWAIT
  4730.        FSTSW [EBP-48]
  4731.        MOV AX,[EBP-48]
  4732.        SAHF
  4733.        JNE !!!_Rep1                ;Until Zero
  4734. !!!zzz:
  4735.        db 0ddh,0c0h             ;FFREE ST
  4736.        CMP CX,0
  4737.        JE !!!_nk1
  4738.        MOVZX ECX,CX
  4739.  
  4740.        CMP CX,9
  4741.        JAE !!!llo1
  4742.        ;there must be inserted zeros after the point
  4743.        PUSH ECX
  4744.        MOV EBX,9
  4745.        SUB EBX,ECX
  4746.        MOV ECX,EBX
  4747.        CLD
  4748. !!!llo1_1:
  4749.        MOV AX,48   ;'0'
  4750.        STOSB
  4751.        LOOP !!!llo1_1
  4752.        POP ECX
  4753. !!!llo1:
  4754.        POP AX
  4755.        STOSB
  4756.        LOOP !!!llo1
  4757. !!!_nk1:
  4758.        POP EDX                  ;original EDI
  4759.        MOV EBX,EDI
  4760.        DEC EBX
  4761.        SUB EBX,EDX
  4762.        MOV AL,0
  4763.        STOSB                   ;Abschluß PChar
  4764.        MOV EDI,EDX
  4765.        MOV AL,BL
  4766.        STOSB
  4767.  
  4768.        LEAVE
  4769.        RETN32
  4770. !ValReal ENDP
  4771.  
  4772. !Real2Str PROC NEAR32
  4773.         PUSH EBP
  4774.         MOV EBP,ESP
  4775.  
  4776.         MOV EDI,[EBP+12]
  4777.         FLDD [EDI+0]   ;Load real value
  4778.         MOV EDI,[EBP+8]
  4779.         MOV AX,0ffffh                ;alle Nachkommastellen
  4780.         CALLN32 !ValReal
  4781.  
  4782.         LEAVE
  4783.         RETN32 8
  4784. !Real2Str ENDP
  4785.  
  4786. !Double2Str PROC NEAR32
  4787.         PUSH EBP
  4788.         MOV EBP,ESP
  4789.  
  4790.         MOV EDI,[EBP+12]
  4791.         FLDQ [EDI+0]   ;Load double value
  4792.         MOV EDI,[EBP+8]
  4793.         MOV AX,0ffffh                ;alle Nachkommastellen
  4794.         CALLN32 !ValReal
  4795.  
  4796.         LEAVE
  4797.         RETN32 8
  4798. !Double2Str ENDP
  4799.  
  4800. !Extended2Str PROC NEAR32
  4801.         PUSH EBP
  4802.         MOV EBP,ESP
  4803.  
  4804.         MOV EDI,[EBP+12]
  4805.         FLDT [EDI+0]    ;Load extended value
  4806.         MOV EDI,[EBP+8]
  4807.         MOV AX,0ffffh                ;alle Nachkommastellen
  4808.         CALLN32 !ValReal
  4809.  
  4810.         LEAVE
  4811.         RETN32 8
  4812. !Extended2Str ENDP
  4813.  
  4814. !WriteExtended PROC NEAR32   ;Writes extended in ST
  4815.           PUSH EBP
  4816.           MOV EBP,ESP
  4817.           SUB ESP,260
  4818.           FSTPT [EBP-260]
  4819.  
  4820.           LEA EAX,[EBP-260]
  4821.           PUSH EAX
  4822.           LEA EAX,[EBP-250]
  4823.           PUSH EAX
  4824.           CALLN32 !Extended2Str
  4825.  
  4826.           LEA EAX,[EBP-250]
  4827.           PUSH EAX
  4828.           PUSH [EBP+8]       ;Format value
  4829.           CALLN32 !WriteStr
  4830.  
  4831.           LEAVE
  4832.           RETN32 2
  4833. !WriteExtended ENDP
  4834.  
  4835. !FPULoadLong PROC NEAR32
  4836.             PUSH EBP
  4837.             MOV EBP,ESP
  4838.             FILDD [EBP+8]
  4839.             LEAVE
  4840.             RETN32 4
  4841. !FPULoadLong ENDP
  4842.  
  4843.  
  4844. !Sin PROC NEAR32   ;calculate SIN in ST(0)
  4845.     CALLN32 !RadArc
  4846.     db d9h,feh  ;FSIN
  4847.     RETN32
  4848. !Sin ENDP
  4849.  
  4850. !Cos PROC NEAR32   ;calculate COS in ST(0)
  4851.     CALLN32 !RadArc
  4852.     db d9h,ffh  ;FCOS
  4853.     RETN32
  4854. !Cos ENDP
  4855.  
  4856. !Tan PROC NEAR32
  4857.        PUSH EBP
  4858.        MOV EBP,ESP
  4859.        SUB ESP,12
  4860.        MOVW _FPUResult,0
  4861.        FSTPT [EBP-10]
  4862.        FLDT [EBP-10]
  4863.        CALLN32 !Sin
  4864.        FLDT [EBP-10]
  4865.        CALLN32 !Cos
  4866.        DB d9h,e4h    ;FTST
  4867.        FSTSW [EBP-12]
  4868.        FWAIT
  4869.        MOV AH,[EBP-11]
  4870.        SAHF
  4871.        JNE !!!_l50
  4872.        db 0ddh,0d8h          ;FSTP ST(0)
  4873.        db 0ddh,0d8h          ;FSTP ST(0)
  4874.        DB d9h,eeh            ;FLDZ
  4875.        MOVW _FPUResult,2
  4876.        JMP !!!_l51
  4877. !!!_l50:
  4878.        DB deh,f9h   ;FDIVP ST(1),ST
  4879. !!!_l51:
  4880.        LEAVE
  4881.        RETN32
  4882. !Tan ENDP
  4883.  
  4884. !Cot PROC NEAR32
  4885.        PUSH EBP
  4886.        MOV EBP,ESP
  4887.        SUB ESP,12
  4888.        MOVW _FPUResult,0
  4889.        FSTPT [EBP-10]
  4890.        FLDT [EBP-10]
  4891.        CALLN32 !Cos
  4892.        FLDT [EBP-10]
  4893.        CALLN32 !Sin
  4894.        DB d9h,e4h    ;FTST
  4895.        FSTSW [EBP-12]
  4896.        FWAIT
  4897.        MOV AH,[EBP-11]
  4898.        SAHF
  4899.        JNE !!!_l53
  4900.        db 0ddh,0d8h          ;FSTP ST(0)
  4901.        db 0ddh,0d8h          ;FSTP ST(0)
  4902.        DB d9h,eeh            ;FLDZ
  4903.        MOVW _FPUResult,2
  4904.        JMP !!!_l54
  4905. !!!_l53:
  4906.        DB deh,f9h   ;FDIVP ST(1),ST
  4907. !!!_l54:
  4908.        LEAVE
  4909.        RETN32
  4910. !Cot ENDP
  4911.  
  4912. !ArcTan PROC NEAR32
  4913.        PUSH EBP
  4914.        MOV EBP,ESP
  4915.        SUB ESP,2
  4916.        MOVW _FPUResult,0
  4917.        DB d9h,e5h  ;FXAM     ;Type of ST(0)
  4918.        FWAIT
  4919.        FSTSW [EBP-2]
  4920.        MOV AH,[EBP-1]
  4921.        SAHF
  4922.        XCHG CX,AX
  4923.        JB !!!_l30
  4924.        JNE !!!_l31
  4925.        JMP !!!_l32
  4926. !!!_l30:
  4927.        JE !!!_l32
  4928.        JNP !!!_l32
  4929.        db 0ddh,0d8h          ;FSTP ST(0)
  4930.        FLDT !fl3
  4931.        JMP !!!_l33
  4932. !!!_l31:
  4933.        DB d9h,e1h   ;FABS
  4934.        DB d9h,e8h   ;FLD1
  4935.        DB d8h,d1h   ;FCOM ST(1)
  4936.        FWAIT
  4937.        FSTSW [EBP-2]
  4938.        MOV AH,[EBP-1]
  4939.        SAHF
  4940.        JNE !!!_l34
  4941.        DB deh,d9h   ;FCOMPP ST(1)
  4942.        FLDT !fl2
  4943.        JMP !!!_l33
  4944. !!!_l34:
  4945.        JNB !!!_l35
  4946.        DB d9h,c9h   ;FXCH ST(1)
  4947. !!!_l35:
  4948.        DB d9h,f3h   ;FPATAN
  4949.        JNB !!!_l33
  4950.        FLDT !fl3
  4951.        DB deh,e9h   ;FSUBP ST(1),ST
  4952.        XOR CH,2
  4953. !!!_l33:
  4954.        TEST CH,2
  4955.        JE !!!_l32
  4956.        DB d9h,e0h   ;FCHS
  4957.        FWAIT
  4958. !!!_l32:
  4959.        CALLN32 !NormRad
  4960.        LEAVE
  4961.        RETN32
  4962. !ArcTan ENDP
  4963.  
  4964. !Sqrt PROC NEAR32
  4965.        DB d9h,fah   ;FSQRT
  4966.        RETN32
  4967. !Sqrt ENDP
  4968.  
  4969. !ln PROC NEAR32
  4970.       PUSH EBP
  4971.       MOV EBP,ESP
  4972.       SUB ESP,10
  4973.       MOVW _FPUResult,0
  4974.       DB d9h,edh   ;FLDLN2
  4975.       DB d9h,c9h   ;FXCH ST(1)
  4976.       DB d9h,e5h   ;FXAM
  4977.       FWAIT
  4978.       FSTSW [EBP-10]
  4979.       MOV AH,[EBP-9]
  4980.       SAHF
  4981.       JB !!!_l20
  4982.       JE !!!_l21
  4983.       TEST AH,2
  4984.       JE !!!_l22
  4985. !!!_l21:
  4986.       db 0ddh,0d8h          ;FSTP ST(0)
  4987.       JMP !!!_l23
  4988. !!!_l20:
  4989.       db 0ddh,0d8h          ;FSTP ST(0)
  4990.       JE !!!_l24
  4991.       JNP !!!_l24
  4992. !!!_l23:
  4993.       db 0ddh,0d8h          ;FSTP ST(0)
  4994.       FLDD !fl1
  4995. !!!_l24:
  4996.       DB d9h,e4h   ;FTST
  4997.       JMP !!!_l29
  4998. !!!_l22:
  4999.       DB d9h,c0h   ;FLD ST(0)
  5000.       FSTPT [EBP-10]
  5001.       CMPW [EBP-2],3fffh
  5002.       JNE !!!_l25
  5003.       CMPW [EBP-4],8000h
  5004.       JNE !!!_l25
  5005.       DB d9h,e8h    ;FLD1
  5006.       DB deh,e9h    ;FSUBP ST(1),ST
  5007.       DB d9h,f9h    ;FYL2XP1
  5008.       JMP !!!_l29
  5009. !!!_l25:
  5010.       DB d9h,f1h    ;FYL2X
  5011. !!!_l29:
  5012.       LEAVE
  5013.       RETN32
  5014. !ln ENDP
  5015.  
  5016. !Exp PROC NEAR32
  5017.       PUSH EBP
  5018.       MOV EBP,ESP
  5019.       SUB ESP,16
  5020.       MOVW _FPUResult,0
  5021.       DB d9h,eah   ;FLD2E
  5022.       DB d9h,c9h   ;FXCH ST(1)
  5023.       DB d9h,e5h   ;FXAM
  5024.       FWAIT
  5025.       FSTSW [EBP-6]
  5026.       DB d9h,c9h   ;FXCH ST(1)
  5027.       MOV AH,[EBP-5]
  5028.       SAHF
  5029.       XCHG BX,AX
  5030.       JB !!!_l40
  5031.       JNE !!!_l41
  5032.       db 0ddh,0d8h          ;FSTP ST(0)
  5033.       db 0ddh,0d8h          ;FSTP ST(0)
  5034.       DB d9h,e8h     ;FLD1
  5035.       JMP !!!_l43
  5036. !!!_l40:
  5037.       db 0ddh,0d8h          ;FSTP ST(0)
  5038.       JE !!!_l44
  5039.       JNP !!!_l44
  5040. !!!_l48:
  5041.       db 0ddh,0d8h          ;FSTP ST(0)
  5042.       FLDD !fl4
  5043. !!!_l44:
  5044.       DB d9h,e4h    ;FTST
  5045.       JMP !!!_l43
  5046. !!!_l41:
  5047.       DB deh,c9h    ;FMULP ST(1),ST
  5048.       DB d9h,e1h    ;FABS
  5049.       FLDD !fl5
  5050.       DB d9h,c9h   ;FXCH ST(1)
  5051.       FSTPT [EBP-16]
  5052.       FLDT [EBP-16]
  5053.       DB deh,d9h    ;FCOMPP ST(1)
  5054.       FWAIT
  5055.       FSTSW [EBP-6]
  5056.       FLDT [EBP-16]
  5057.       TESTB [EBP-5],41h
  5058.       JE !!!_l46
  5059.       DB d9h,f0h    ;F2XM1
  5060.       DB d9h,e8h    ;FLD1
  5061.       DB deh,c1h    ;FADDP ST(1),ST
  5062.       JMP !!!_l47
  5063. !!!_l46:
  5064.       DB d9h,e8h    ;FLD1
  5065.       DB d9h,c1h    ;FLD ST(1)
  5066.       FWAIT
  5067.       FSTCW [EBP-6]
  5068.       DB d9h,fdh    ;FSCALE
  5069.       ORB [EBP-5],0fh
  5070.       FLDCW [EBP-6]
  5071.       FWAIT
  5072.       DB d9h,fch    ;FRNDINT
  5073.       ANDB [EBP-5],f3h
  5074.       FLDCW [EBP-6]
  5075.       FWAIT
  5076.       FISTD [EBP-4]
  5077.       DB d9h,c9h    ;FXCH ST(1)
  5078.       DB d9h,e0h    ;FCHS
  5079.       DB d9h,c9h    ;FXCH ST(1)
  5080.       DB d9h,fdh    ;FSCALE
  5081.       DB ddh,d9h    ;FSTP ST(1)
  5082.       DB deh,e9h    ;FSUBP ST(1),ST
  5083.       CMPW [EBP-2],0
  5084.       JG !!!_l48
  5085.       DB d9h,f0h    ;F2XM1
  5086.       DB d9h,e8h    ;FLD1
  5087.       DB deh,c1h    ;FADDP ST(1),ST
  5088.       MOV CX,[EBP-4]
  5089.       SHR CX,1
  5090.       MOV [EBP-4],CX
  5091.       JNB !!!_l49
  5092.       FLDT !fl6
  5093.       DB deh,c9h    ;FMULP ST(1),ST
  5094. !!!_l49:
  5095.       FILDW [EBP-4]
  5096.       DB d9h,c9h    ;FXCH ST(1)
  5097.       DB d9h,fdh    ;FSCALE
  5098.       DB ddh,d9h    ;FSTP ST(1)
  5099. !!!_l47:
  5100.       TEST BH,2
  5101.       JE !!!_l43
  5102.       DB d9h,e8h    ;FLD1
  5103.       DB deh,f1h    ;FDIVRP ST(1),ST
  5104. !!!_l43:
  5105.       LEAVE
  5106.       RETN32
  5107. !Exp ENDP
  5108.  
  5109. !Frac PROC NEAR32
  5110.       PUSH EBP
  5111.       MOV EBP,ESP
  5112.       SUB ESP,12
  5113.       FSTPT [EBP-10]
  5114.       FLDT [EBP-10]
  5115.       FLDCW !FPURound  ;Load control word
  5116.       FWAIT
  5117.       db 0d9h,0fch             ;FRNDINT
  5118.       FLDCW !FPUControl ;Load control word
  5119.       FWAIT
  5120.       FLDT [EBP-10]
  5121.       DB d9h,c9h    ;FXCH ST(1)
  5122.       DB deh,e9h    ;FSUBP ST(1),ST
  5123.       LEAVE
  5124.       RETN32
  5125. !Frac ENDP
  5126.  
  5127. !Int PROC NEAR32
  5128.       FLDCW !FPURound  ;Load control word
  5129.       FWAIT
  5130.       db 0d9h,0fch             ;FRNDINT
  5131.       FLDCW !FPUControl ;Load control word
  5132.       FWAIT
  5133.       RETN32
  5134. !Int ENDP
  5135.  
  5136. !Round PROC NEAR32
  5137.       PUSH EBP
  5138.       MOV EBP,ESP
  5139.       SUB ESP,10
  5140.       db 0d9h,0fch             ;FRNDINT
  5141.       FISTPD [EBP-10]
  5142.       MOV EAX,[EBP-10]
  5143.       LEAVE
  5144.       RETN32
  5145. !Round ENDP
  5146.  
  5147. !Trunc PROC NEAR32
  5148.       PUSH EBP
  5149.       MOV EBP,ESP
  5150.       SUB ESP,10
  5151.       FLDCW !FPURound  ;Load control word
  5152.       FWAIT
  5153.       db 0d9h,0fch             ;FRNDINT
  5154.       FLDCW !FPUControl ;Load control word
  5155.       FWAIT
  5156.       FISTPD [EBP-10]
  5157.       MOV EAX,[EBP-10]
  5158.       LEAVE
  5159.       RETN32
  5160. !Trunc ENDP
  5161.  
  5162. !Sqr PROC NEAR32
  5163.       DB d9h,c0h   ;FLD St(0)
  5164.       Db deh,c9h   ;FMULP ST(1),ST
  5165.       RETN32
  5166. !Sqr ENDP
  5167.  
  5168. !ArcSin PROC NEAR32
  5169.        PUSH EBP
  5170.        MOV EBP,ESP
  5171.        SUB ESP,12
  5172.        MOVW _FPUResult,0
  5173.  
  5174.        DB d9h,c0h   ;FLD St(0)
  5175.        DB d9h,e1h   ;FABS
  5176.        DB d9h,e8h   ;FLD1
  5177.        DB deh,d9h   ;FCOMPP ST(1)
  5178.        FWAIT
  5179.        FSTSW [EBP-12]
  5180.        MOV AH,[EBP-11]
  5181.        SAHF
  5182.        JB !!!_l60
  5183.        JNE !!!_l62
  5184.        ;ArcSin(1.0)=w*pi/2
  5185.        FLDT !fl7    ;1.5707...
  5186.        DB deh,c9h   ;FMULP ST(1),ST
  5187.        JMP !!!_l61
  5188. !!!_l62:
  5189.        DB d9h,c0h   ;FLD St(0)
  5190.        FSTPT [EBP-10]
  5191.        DB d9h,c0h   ;FLD St(0)
  5192.        Db deh,c9h   ;FMULP ST(1),ST
  5193.        DB d9h,e8h   ;FLD1
  5194.        DB deh,e1h   ;FSUBP ST(1),ST
  5195.        DB d9h,fah   ;FSQRT
  5196.        FLDT [EBP-10]
  5197.        DB d9h,c9h    ;FXCH ST(1)
  5198.        DB deh,f9h   ;FDIVP ST(1),ST
  5199.        CALLN32 !ArcTan
  5200.        JMP !!!_l61
  5201. !!!_l60:
  5202.        MOVW _FPUResult,3
  5203. !!!_l61:
  5204.        CALLN32 !NormRad
  5205.        LEAVE
  5206.        RETN32
  5207. !ArcSin ENDP
  5208.  
  5209. !ArcCos PROC NEAR32
  5210.        MOVW _FPUResult,0
  5211.        CALLN32 !ArcSin
  5212.        FLDT !fl7   ;PI/2
  5213.        DB d9h,c9h    ;FXCH ST(1)
  5214.        DB deh,e9h  ;FSUBP ST(1),ST
  5215.        CALLN32 !NormRad
  5216.        RETN32
  5217. !ArcCos ENDP
  5218.  
  5219. !ArcCot PROC NEAR32
  5220.        MOVW _FPUResult,0
  5221.        CALLN32 !ArcTan
  5222.        FLDT !fl7   ;PI/2
  5223.        DB d9h,c9h    ;FXCH ST(1)
  5224.        DB deh,e9h  ;FSUBP ST(1),ST
  5225.        CALLN32 !NormRad
  5226.        RETN32
  5227. !ArcCot ENDP
  5228.  
  5229. !Sinh PROC NEAR32
  5230.        MOVW _FPUResult,0
  5231.        CALLN32 !Exp
  5232.        DB d9h,c0h   ;FLD St(0)
  5233.        DB d9h,e8h   ;FLD1
  5234.        DB d9h,c9h   ;FXCH ST(1)
  5235.        DB deh,f9h   ;FDIVP ST(1),ST
  5236.        DB d9h,c9h   ;FXCH ST(1)
  5237.        DB deh,e1h   ;FSUBP ST(1),ST
  5238.        FLDT !fl8
  5239.        DB deh,c9h   ;FMULP ST(1),ST
  5240.        RETN32
  5241. !Sinh ENDP
  5242.  
  5243. !Cosh PROC NEAR32
  5244.        MOVW _FPUResult,0
  5245.        CALLN32 !Exp
  5246.        DB d9h,c0h   ;FLD St(0)
  5247.        DB d9h,e8h   ;FLD1
  5248.        DB d9h,c9h   ;FXCH ST(1)
  5249.        DB deh,f9h   ;FDIVP ST(1),ST
  5250.        DB deh,c1h   ;FADDP ST(1),ST
  5251.        FLDT !fl8
  5252.        DB deh,c9h   ;FMULP ST(1),ST
  5253.        RETN32
  5254. !Cosh ENDP
  5255.  
  5256. !Tanh PROC NEAR32
  5257.        MOVW _FPUResult,0
  5258.        FLDT !fl9   ;2.0
  5259.        DB deh,c9h  ;FMULP ST(1),ST
  5260.        CALLN32 !Exp
  5261.        DB d9h,e8h  ;FLD1
  5262.        DB deh,c1h  ;FADDP ST(1),ST
  5263.        FLDT !fl9   ;2.0
  5264.        DB d9h,c9h   ;FXCH ST(1)
  5265.        DB deh,f9h   ;FDIVP ST(1),ST
  5266.        DB d9h,e8h  ;FLD1
  5267.        DB deh,e1h   ;FSUBP ST(1),ST
  5268.        RETN32
  5269. !Tanh ENDP
  5270.  
  5271. !Coth PROC NEAR32
  5272.        PUSH EBP
  5273.        MOV EBP,ESP
  5274.        SUB ESP,12
  5275.        MOVW _FPUResult,0
  5276.        DB d9h,c0h   ;FLD St(0)
  5277.        FSTPT [EBP-10]
  5278.        CALLN32 !Sinh
  5279.        DB d9h,e4h   ;FTST
  5280.        FWAIT
  5281.        FSTSW [EBP-12]
  5282.        MOV AH,[EBP-11]
  5283.        SAHF
  5284.        JE !!!_l70
  5285.        FLDT [EBP-10]
  5286.        CALLN32 !Cosh
  5287.        DB d9h,c9h   ;FXCH ST(1)
  5288.        DB deh,f9h   ;FDIVP ST(1),ST
  5289.        JMP !!!_l71
  5290. !!!_l70:
  5291.        MOVW _FPUResult,4
  5292. !!!_l71:
  5293.        LEAVE
  5294.        RETN32
  5295. !Coth ENDP
  5296.  
  5297. !lg PROC NEAR32
  5298.        MOVW _FPUResult,0
  5299.        CALLN32 !ln
  5300.        FLDT !fl10
  5301.        DB deh,f9h   ;FDIVP ST(1),ST
  5302.        RETN32
  5303. !lg ENDP
  5304.  
  5305. !lb PROC NEAR32
  5306.        MOVW _FPUResult,0
  5307.        CALLN32 !ln
  5308.        FLDT !fl11
  5309.        DB deh,f9h   ;FDIVP ST(1),ST
  5310.        RETN32
  5311. !lb ENDP
  5312.  
  5313. !ReadReal PROC NEAR32
  5314.        PUSH EBP
  5315.        MOV EBP,ESP
  5316.        SUB ESP,262
  5317.        LEA EAX,[EBP-260]
  5318.        PUSH EAX
  5319.        CALLN32 !ReadStr
  5320.        LEA EAX,[EBP-260]
  5321.        PUSH EAX
  5322.        PUSHL [EBP+8]
  5323.        LEA EAX,[EBP-262]
  5324.        PUSH EAX
  5325.        CALLN32 !Str2Real
  5326.        LEAVE
  5327.        RETN32 4
  5328. !ReadReal ENDP
  5329.  
  5330. !ReadDouble PROC NEAR32
  5331.        PUSH EBP
  5332.        MOV EBP,ESP
  5333.        SUB ESP,262
  5334.        LEA EAX,[EBP-260]
  5335.        PUSH EAX
  5336.        CALLN32 !ReadStr
  5337.        LEA EAX,[EBP-260]
  5338.        PUSH EAX
  5339.        PUSHL [EBP+8]
  5340.        LEA EAX,[EBP-262]
  5341.        PUSH EAX
  5342.        CALLN32 !Str2Double
  5343.        LEAVE
  5344.        RETN32 4
  5345. !ReadDouble ENDP
  5346.  
  5347. !ReadExtended PROC NEAR32
  5348.        PUSH EBP
  5349.        MOV EBP,ESP
  5350.        SUB ESP,262
  5351.        LEA EAX,[EBP-260]
  5352.        PUSH EAX
  5353.        CALLN32 !ReadStr
  5354.        LEA EAX,[EBP-260]
  5355.        PUSH EAX
  5356.        PUSHL [EBP+8]
  5357.        LEA EAX,[EBP-262]
  5358.        PUSH EAX
  5359.        CALLN32 !Str2Extended
  5360.        LEAVE
  5361.        RETN32 4
  5362. !ReadExtended ENDP
  5363.  
  5364. END;
  5365.  
  5366.  
  5367.  
  5368. BEGIN
  5369. END.
  5370.  
  5371. ASSEMBLER
  5372. !TempChar db 0     ;Uses for !CharOut
  5373. !TempWord dw 0,0   ;Used temporary
  5374. !TempRet  dw 0,0   ;Used for Output via DosWrite as return value
  5375. !TempCR   db 13,10 ;Used by !WritelnEnd
  5376. !ErrorMsg db 'Speed-386 Runtime error     at:XXXXXXXXXXXXX',0 ;Error Message
  5377. !TempString   db 0,ds 255,0   ; for temporary string operations
  5378. !TempString1  db 0,ds 255,0   ; for temporary string operations
  5379. !TempString2  db 0,ds 255,0   ;  ''   ''            ''
  5380. !TempString3  db 0,ds 255,0   ;  ''   ''            ''
  5381. !RandSeed dw 0,0              ;Temp for Random
  5382. !Factor dw 8405h              ; konstanter Faktor for Random
  5383.  
  5384. !FPUControl DW 133fh
  5385. !FPURound DW 1f3fh
  5386. !C10 db 10,0,0,0
  5387. !DivTab db 1,0,0,0
  5388.        db 10,0,0,0
  5389.        db 100,0,0,0
  5390.        db 0e8h,3,0,0
  5391.        db 10h,27h,0,0
  5392.        db 0a0h,86h,1,0
  5393.        db 40h,42h,0fh,0
  5394.        db 80h,96h,98h,0
  5395.        db 0,0e1h,0f5h,5
  5396.        db 0,0cah,9ah,3bh  ;1E+9
  5397. !Power10Tab db 0,0,0,0,0,20h,0bch,0beh,19h,40h                ;1.0E+8
  5398.            db 0,0,0,4,0bfh,0c9h,1bh,8eh,34h,40h              ;1.0E+16
  5399.            db 9eh,0b5h,70h,2bh,0a8h,0adh,0c5h,9dh,69h,40h    ;1.0E+32
  5400.            db 0d5h,0a6h,0cfh,0ffh,49h,1fh,78h,0c2h,0d3h,40h  ;1.0E+64
  5401.            db 0e0h,8ch,0e9h,80h,0c9h,47h,0bah,93h,0a8h,41h   ;1.0E+128
  5402.            db 8eh,0deh,0f9h,9dh,0fbh,0ebh,7eh,0aah,51h,43h   ;1.0E+256
  5403.            db 0c7h,91h,0eh,0a6h,0aeh,0a0h,19h,0e3h,0a3h,46h  ;1.0E+512
  5404.            db 17h,0ch,75h,81h,86h,75h,76h,0c9h,48h,4dh       ;1.0E+1024
  5405.            db 0e5h,5dh,3dh,0c5h,5dh,3bh,8bh,9eh,92h,5ah      ;1.0E+2048
  5406.            db 9bh,97h,20h,8ah,2,52h,60h,0c4h,25h,75h         ;1.0E+4096
  5407. !Exponent dw 0
  5408. !FCompp dw 0  ;Flags nach FCompp
  5409. !fl1 db 0,42h,c0h,ffh
  5410. !fl2 db 35h,c2h,68h,21h,a2h,dah,0fh,c9h,feh,3fh  ;0.7853...
  5411. !fl3 db 35h,c2h,68h,21h,a2h,dah,0fh,c9h,ffh,3fh
  5412. !fl4 db 0,4ah,c0h,ffh
  5413. !fl5 db 0,0,0,3fh
  5414. !fl6 db 85h,64h,deh,f9h,33h,f3h,4,b5h,ffh,3fh
  5415. !fl7 db 48h,7eh,2ah,92h,a2h,dah,0fh,c9h,ffh,3fh  ;PI/2
  5416. !fl8 db 0,0,0,0,0,0,0,80h,feh,3fh                ;0.5
  5417. !fl9 db 0,0,0,0,0,0,0,80h,0,40h                  ;2.0
  5418. !fl10 db 83h,abh,4bh,ach,ddh,8dh,5dh,93h,0,40h   ;ln(10)
  5419. !fl11 db 7eh,c0h,68h,77h,0dh,18h,72h,b1h,feh,3fh ;ln(2)
  5420.  
  5421. END; {ASSEMBLER}
  5422.