home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / spdos2.zip / LIBSRC / SYSTEM.PAS < prev   
Pascal/Delphi Source File  |  1994-06-21  |  86KB  |  3,360 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.      MAXINT       =32767;
  20.      MININT       =-32768;
  21.      MAXLONGINT  =$7FFFFFFF;
  22.      MINLONGINT  =$80000001;
  23.  
  24. TYPE
  25.      PCHAR=PSTRING;      {Pointer to Zero terminated string}
  26.  
  27.      HWND=LONGWORD;
  28.      HPS=LONGWORD;
  29.      HMODULE=LONGWORD;
  30.      PSZ=PString;   {Pointer to zero terminated string}
  31.  
  32.      PPOINTL=^POINTL;
  33.      POINTL=RECORD
  34.                   x:LONGINT;
  35.                   y:LONGINT;
  36.             END;
  37.  
  38.      PRECTL=^RECTL;
  39.      RECTL=RECORD
  40.                 xLeft:LONGINT;
  41.                 yBottom:LONGINT;
  42.                 xRight:LONGINT;
  43.                 yTop:LONGINT;
  44.            END;
  45.  
  46.      PQMSG=^QMSG;
  47.      QMSG=RECORD
  48.               _hwnd:HWND;
  49.               msg:LONGWORD;
  50.               mp1:POINTER;
  51.               mp2:POINTER;
  52.               time:LONGWORD;
  53.               ptl:POINTL;
  54.               reserved:LONGWORD;
  55.           END;
  56.  
  57.      PSWP=^SWP;
  58.      SWP=RECORD
  59.                fl:LONGWORD;
  60.                cy:LONGWORD;
  61.                cx:LONGWORD;
  62.                y:LONGWORD;
  63.                x:LONGWORD;
  64.                hwndInsertBehind:HWND;
  65.                _hwnd:HWND;
  66.                ulReserved1:LONGWORD;
  67.                ulReserved2:LONGWORD;
  68.          END;
  69.  
  70.     PSWPBUF=^TSWPBUF;
  71.     TSWPBUF=ARRAY[0..20] OF SWP;
  72.  
  73.  
  74.     PLONGBUF=^TLONGBUF;
  75.     TLONGBUF=ARRAY[0..65530] OF LONGWORD;
  76.  
  77.     PScreenBuf=^ScreenBuf;
  78.     ScreenBuf=array[0..30] of string;
  79.  
  80.     PAnose=record
  81.                  bFamilyType:BYTE;
  82.                  bSerifStyle:BYTE;
  83.                  bWeight:BYTE;
  84.                  bProportion:BYTE;
  85.                  bContrast:BYTE;
  86.                  bStrokeVariation:BYTE;
  87.                  bArmStyle:BYTE;
  88.                  bLetterform:BYTE;
  89.                  bMidline:BYTE;
  90.                  bXHeight:BYTE;
  91.                  fbPassedISO:BYTE;
  92.                  fbFailedISO:BYTE;
  93.            end;
  94.  
  95.     PFontMetrics=^FontMetrics;
  96.     FontMetrics=record
  97.                         szFamilyname:ARRAY[0..31] OF CHAR;
  98.                         szFacename:ARRAY[0..31] OF CHAR;
  99.                         idRegistry:WORD;
  100.                         usCodePage:WORD;
  101.                         lEmHeight:LONGWORD;
  102.                         lXHeight:LONGWORD;
  103.                         lMaxAscender:LONGWORD;
  104.                         lMaxDescender:LONGWORD;
  105.                         lLowerCaseAscent:LONGWORD;
  106.                         lLowerCaseDescent:LONGWORD;
  107.                         lInternalLeading:LONGWORD;
  108.                         lExternalLeading:LONGWORD;
  109.                         lAveCharWidth:LONGWORD;
  110.                         lMaxCharInc:LONGWORD;
  111.                         lEmInc:LONGWORD;
  112.                         lMaxBaselineExt:LONGWORD;
  113.                         sCharSlope:INTEGER;
  114.                         sInlineDir:INTEGER;
  115.                         sCharRot:INTEGER;
  116.                         usWeightClass:INTEGER;
  117.                         usWidthClass:INTEGER;
  118.                         sXDeviceRes:INTEGER;
  119.                         sYDeviceRes:INTEGER;
  120.                         sFirstChar:INTEGER;
  121.                         sLastChar:INTEGER;
  122.                         sDefaultChar:INTEGER;
  123.                         sBreakChar:INTEGER;
  124.                         sNominalPointSize:INTEGER;
  125.                         sMinimumPointSize:INTEGER;
  126.                         sMaximumPointSize:INTEGER;
  127.                         fsType:INTEGER;
  128.                         fsDefn:INTEGER;
  129.                         fsSelection:INTEGER;
  130.                         fsCapabilities:INTEGER;
  131.                         lSubscriptXSize:LONGWORD;
  132.                         lSubscriptYSize:LONGWORD;
  133.                         lSubscriptXOffset:LONGWORD;
  134.                         lSubscriptYOffset:LONGWORD;
  135.                         lSuperscriptXSize:LONGWORD;
  136.                         lSuperscriptYSize:LONGWORD;
  137.                         lSuperscriptXOffset:LONGWORD;
  138.                         lSuperscriptYOffset:LONGWORD;
  139.                         lUnderscoreSize:LONGWORD;
  140.                         lUnderscorePosition:LONGWORD;
  141.                         lStrikeoutSize:LONGWORD;
  142.                         lStrikeoutPosition:LONGWORD;
  143.                         sKerningPairs:INTEGER;
  144.                         sFamilyClass:INTEGER;
  145.                         lMatch:LONGWORD;
  146.                         FamilyNameAtom:LONGWORD;
  147.                         FaceNameAtom:LONGWORD;
  148.                         _panose:PANOSE;
  149.                 END;
  150.  
  151.     TYPE PFATTRS=^FATTRS;
  152.     FATTRS=record
  153.                usRecordLength:WORD;
  154.                fsSelection:WORD;
  155.                lMatch:LONGWORD;
  156.                szFacename:array[0..31] of char;
  157.                idRegistry:WORD;
  158.                usCodePage:WORD;
  159.                lMaxBaselineExt:LONGWORD;
  160.                lAveCharWidth:LONGWORD;
  161.                fsType:WORD;
  162.                fsFontUse:WORD;
  163.            end;
  164.  
  165. VAR PMScrBuf:PScreenBuf;
  166.  
  167. CONST
  168.      { Standard Window Messages }
  169.      WM_NULL                  =$0000;
  170.      WM_CREATE                =$0001;
  171.      WM_DESTROY               =$0002;
  172.      WM_ENABLE                =$0004;
  173.      WM_SHOW                  =$0005;
  174.      WM_MOVE                  =$0006;
  175.      WM_SIZE                  =$0007;
  176.      WM_ADJUSTWINDOWPOS       =$0008;
  177.      WM_CALCVALIDRECTS        =$0009;
  178.      WM_SETWINDOWPARAMS       =$000a;
  179.      WM_QUERYWINDOWPARAMS     =$000b;
  180.      WM_HITTEST               =$000c;
  181.      WM_ACTIVATE              =$000d;
  182.      WM_SETFOCUS              =$000f;
  183.      WM_SETSELECTION          =$0010;
  184.      WM_PPAINT                =$0011;
  185.      WM_PSETFOCUS             =$0012;
  186.      WM_PSYSCOLORCHANGE       =$0013;
  187.      WM_PSIZE                 =$0014;
  188.      WM_PACTIVATE             =$0015;
  189.      WM_PCONTROL              =$0016;
  190.      WM_COMMAND               =$0020;
  191.      WM_SYSCOMMAND            =$0021;
  192.      WM_HELP                  =$0022;
  193.      WM_PAINT                 =$0023;
  194.      WM_TIMER                 =$0024;
  195.      WM_SEM1                  =$0025;
  196.      WM_SEM2                  =$0026;
  197.      WM_SEM3                  =$0027;
  198.      WM_SEM4                  =$0028;
  199.      WM_CLOSE                 =$0029;
  200.      WM_QUIT                  =$002a;
  201.      WM_SYSCOLORCHANGE        =$002b;
  202.      WM_SYSVALUECHANGED       =$002d;
  203.      WM_APPTERMINATENOTIFY    =$002e;
  204.      WM_PRESPARAMCHANGED      =$002f;
  205.  
  206.      { Control notification messages }
  207.      WM_CONTROL               =$0030;
  208.      WM_VSCROLL               =$0031;
  209.      WM_HSCROLL               =$0032;
  210.      WM_INITMENU              =$0033;
  211.      WM_MENUSELECT            =$0034;
  212.      WM_MENUEND               =$0035;
  213.      WM_DRAWITEM              =$0036;
  214.      WM_MEASUREITEM           =$0037;
  215.      WM_CONTROLPOINTER        =$0038;
  216.      WM_QUERYDLGCODE          =$003a;
  217.      WM_INITDLG               =$003b;
  218.      WM_SUBSTITUTESTRING      =$003c;
  219.      WM_MATCHMNEMONIC         =$003d;
  220.      WM_SAVEAPPLICATION       =$003e;
  221.  
  222.      { Frame window related messages }
  223.  
  224.      WM_FLASHWINDOW           =$0040;
  225.      WM_FORMATFRAME           =$0041;
  226.      WM_UPDATEFRAME           =$0042;
  227.      WM_FOCUSCHANGE           =$0043;
  228.  
  229.      WM_SETBORDERSIZE         =$0044;
  230.      WM_TRACKFRAME            =$0045;
  231.      WM_MINMAXFRAME           =$0046;
  232.      WM_SETICON               =$0047;
  233.      WM_QUERYICON             =$0048;
  234.      WM_SETACCELTABLE         =$0049;
  235.      WM_QUERYACCELTABLE       =$004a;
  236.      WM_TRANSLATEACCEL        =$004b;
  237.      WM_QUERYTRACKINFO        =$004c;
  238.      WM_QUERYBORDERSIZE       =$004d;
  239.      WM_NEXTMENU              =$004e;
  240.      WM_ERASEBACKGROUND       =$004f;
  241.      WM_QUERYFRAMEINFO        =$0050;
  242.      WM_QUERYFOCUSCHAIN       =$0051;
  243.      WM_OWNERPOSCHANGE        =$0052;
  244.      WM_CALCFRAMERECT         =$0053;
  245.      WM_WINDOWPOSCHANGED      =$0055;
  246.      WM_ADJUSTFRAMEPOS        =$0056;
  247.      WM_QUERYFRAMECTLCOUNT    =$0059;
  248.      WM_QUERYHELPINFO         =$005B;
  249.      WM_SETHELPINFO           =$005C;
  250.      WM_ERROR                 =$005D;
  251.      WM_REALIZEPALETTE        =$005E;
  252.  
  253.      { Key/Character input messages }
  254.      WM_CHAR                  =$007a;
  255.      WM_VIOCHAR               =$007b;
  256.  
  257.      { Mouse input messages }
  258.      WM_MOUSEFIRST            =$0070;
  259.      WM_MOUSELAST             =$0079;
  260.      WM_BUTTONCLICKFIRST      =$0071;
  261.      WM_BUTTONCLICKLAST       =$0079;
  262.      WM_MOUSEMOVE             =$0070;
  263.      WM_BUTTON1DOWN           =$0071;
  264.      WM_BUTTON1UP             =$0072;
  265.      WM_BUTTON1DBLCLK         =$0073;
  266.      WM_BUTTON2DOWN           =$0074;
  267.      WM_BUTTON2UP             =$0075;
  268.      WM_BUTTON2DBLCLK         =$0076;
  269.      WM_BUTTON3DOWN           =$0077;
  270.      WM_BUTTON3UP             =$0078;
  271.      WM_BUTTON3DBLCLK         =$0079;
  272.      WM_MOUSEMAP              =$007D;
  273.      WM_EXTMOUSEFIRST         =$0410;
  274.      WM_EXTMOUSELAST          =$0419;
  275.      WM_CHORD                 =$0410;
  276.      WM_BUTTON1MOTIONSTART    =$0411;
  277.      WM_BUTTON1MOTIONEND      =$0412;
  278.      WM_BUTTON1CLICK          =$0413;
  279.      WM_BUTTON2MOTIONSTART    =$0414;
  280.      WM_BUTTON2MOTIONEND      =$0415;
  281.      WM_BUTTON2CLICK          =$0416;
  282.      WM_BUTTON3MOTIONSTART    =$0417;
  283.      WM_BUTTON3MOTIONEND      =$0418;
  284.      WM_BUTTON3CLICK          =$0419;
  285.      WM_MOUSETRANSLATEFIRST   =$0420;
  286.      WM_MOUSETRANSLATELAST    =$0428;
  287.      WM_BEGINDRAG             =$0420;
  288.      WM_ENDDRAG               =$0421;
  289.      WM_SINGLESELECT          =$0422;
  290.      WM_OPEN                  =$0423;
  291.      WM_CONTEXTMENU           =$0424;
  292.      WM_CONTEXTHELP           =$0425;
  293.      WM_TEXTEDIT              =$0426;
  294.      WM_BEGINSELECT           =$0427;
  295.      WM_ENDSELECT             =$0428;
  296.      WM_PENFIRST              =$04C0;
  297.      WM_PENLAST               =$04FF;
  298.      WM_MMPMFIRST             =$0500;
  299.      WM_MMPMLAST              =$05FF;
  300.  
  301. VAR CheckBreak:BOOLEAN;        {Enables/Disables Ctrl-Break checks}
  302.     ExitCode:WORD;             {The exitcode from main process}
  303.     ErrorAddr:LONGWORD;        {32 Bit linear error adress}
  304.     ExitProc:POINTER;          {Exit procedures chain}
  305.     IORESULT:LONGWORD;         {In/Out result}
  306.     SEEKMODE:LongWord;         {Mode for file seek operations}
  307.     FILEMODE:LongWord;         {Mode for file open operations}
  308.     HeapOrg:Pointer;           {Bottom of heap}
  309.     HeapEnd:Pointer;           {End of heap}
  310.     HeapPtr:Pointer;           {Actual heap position}
  311.     HeapSize:LONGWORD;         {Size of heap}
  312.     PMCrtWindow:LONGWORD;      {CRT Window for text output}
  313.     PMCrtFrameHandle:LONGWORD; {Frame handle for CRT Window}
  314.     PMCrtTitle:STRING;         {Title for CRT Window}
  315.     DrawLocX,DrawLocY:LONGWORD;{Actual drawing position}
  316.     Apphandle:LONGWORD;        {Main application PM anchor handle}
  317.     AppQueueHandle:LONGWORD;   {Main application queue handle}
  318.     AlternateExit:BOOLEAN;     {Set if PMObject is active for WM_QUIT Message}
  319.     MaxLines:LONGWORD;         {Maximal count of crt lines}
  320.     TextCol,TextBackCol:LONGWORD;  {Current colors for text output}
  321.     CrtKeyCount:Byte;
  322.     KeyBuffer:array[0..33] of char;
  323.     CursorVisible:LONGWORD;    {indicates that cursor is visible/invisible}
  324.     MaxDrawStarty,MaxDrawLeny:LONGWORD;
  325.     ArgStart:POINTER; {Pointer to program arguments}
  326.     BlockReadResult:LONGWORD;
  327.     BlockWriteResult:LONGWORD;
  328.     DllModule:LONGWORD;  {When the module is a DLL Init Module at main BEGIN}
  329.     DllTerminating:LONGWORD; {When the module is a DLL Terminating flag at main BEGIN}
  330.     DllInitTermResult:LONGWORD; {indicates success of DLL init/term}
  331.     ModuleCount:BYTE; {If it is a DLL modules currently using this DLL}
  332.  
  333. CONST
  334.     {Keyboard scancodes}
  335.     kbCLeft       =99;
  336.     kbCRight      =100;
  337.     kbCUp         =97;
  338.     kbCDown       =102;
  339.     kbDel         =105;
  340.     kbInsert      =104;
  341.     kbEnd         =101;
  342.     kbPos1        =96;
  343.     kbPageDown    =103;
  344.     kbPageUp      =98;
  345.     kbBS          =8;
  346.     kbCR          =13;
  347.     kbF1          =59;
  348.     kbF2          =60;
  349.     kbF3          =61;
  350.     kbF4          =62;
  351.     kbF5          =63;
  352.     kbF6          =64;
  353.     kbF7          =65;
  354.     kbF8          =66;
  355.     kbF9          =67;
  356.     kbF10         =68;
  357.     kbESC         =1;
  358.     kbCtrl        =29;
  359.  
  360.     kbCtrlA       =286;
  361.     kbCtrlB       =304;
  362.     kbCtrlC       =302;
  363.     kbCtrlD       =288;
  364.     kbCtrlE       =274;
  365.     kbCtrlF       =289;
  366.     kbCtrlG       =290;
  367.     kbCtrlH       =291;
  368.     kbCtrlI       =279;
  369.     kbCtrlJ       =292;
  370.     kbCtrlK       =293;
  371.     kbCtrlL       =294;
  372.     kbCtrlM       =306;
  373.     kbCtrlN       =305;
  374.     kbCtrlO       =280;
  375.     kbCtrlP       =281;
  376.     kbCtrlQ       =272;
  377.     kbCtrlR       =275;
  378.     kbCtrlS       =287;
  379.     kbCtrlT       =276;
  380.     kbCtrlU       =278;
  381.     kbCtrlV       =303;
  382.     kbCtrlW       =273;
  383.     kbCtrlX       =301;
  384.     kbCtrlY       =300;
  385.     kbCtrlZ       =277;
  386.     kbCtrlF1      =315;
  387.     kbCtrlF2      =316;
  388.     kbCtrlF3      =317;
  389.     kbCtrlF4      =318;
  390.     kbCtrlF5      =319;
  391.     kbCtrlF6      =320;
  392.     kbCtrlF7      =321;
  393.     kbCtrlF8      =322;
  394.     kbCtrlF9      =323;
  395.     kbCtrlF10     =324;
  396.  
  397.  
  398.  
  399. FUNCTION  MAXAVAIL:LongWord;
  400. FUNCTION  MEMAVAIL:LongWord;
  401. PROCEDURE GETMEM(var p:Pointer;size:LongWord);
  402. PROCEDURE FREEMEM(var p:pointer;size:LongWord);
  403. PROCEDURE NewSystemHeap;  {free the whole (!) heap and generate new heap}
  404.  
  405. PROCEDURE BYTEMOVE(var source;var dest;size:LongWord);
  406. PROCEDURE MOVE(var source;var dest;size:LongWord);
  407. PROCEDURE FILLCHAR(var dest;size:LongWord;value:byte);
  408.  
  409. FUNCTION POS(item:string;source:string):Byte;
  410. FUNCTION COPY(source:string;start,ende:Byte):String;
  411. PROCEDURE SUBSTR(VAR source:string;start,ende:Byte);
  412. PROCEDURE Str(l:LongInt;var s:string);
  413. PROCEDURE Val(s:string;var l:longint;var result:Byte);
  414. FUNCTION ToStr(l:longint):string;
  415. FUNCTION  UPCASE(item:char):Char;
  416. PROCEDURE Insert(Source:String;VAR s:string;Ind:Byte);
  417. PROCEDURE Delete(Var s:string;Ind:byte;len:byte);
  418. PROCEDURE CopyStrPChar(s:String;VAR p:PCHAR);
  419. PROCEDURE CopyPCharStr(p:PChar;VAR s:STRING);
  420. PROCEDURE Beep(Freq,duration:LONGWORD);
  421.  
  422. PROCEDURE Seek(var f:file;n:LongWord);
  423. FUNCTION FilePos(var f:file):LongWord;
  424. FUNCTION FileSize(var f:file):LongWord;
  425. PROCEDURE Reset(var f:file;recsize:LongWord);
  426. PROCEDURE Rewrite(var f:file;recsize:LongWord);
  427. PROCEDURE BlockWrite(VAR f:file;var Buf;Count:LongWord);
  428. PROCEDURE BlockRead(VAR f:file;var Buf;Count:LongWord);
  429. PROCEDURE Rename(VAR f:file;Newname:String);
  430. PROCEDURE CLOSE(VAR f:file);
  431. PROCEDURE ASSIGN(VAR f:file;s:String);
  432. FUNCTION Eof(VAR f:FILE):Boolean;
  433. PROCEDURE Erase(name:STRING);
  434. PROCEDURE CHDIR(path:string);
  435. PROCEDURE GETDIR(drive:byte;var path:string);
  436. PROCEDURE RMDIR(dir:string);
  437. PROCEDURE MKDIR(dir:string);
  438.  
  439. PROCEDURE ClrScr;
  440. FUNCTION KeyPressed: Boolean;
  441. FUNCTION ReadKey: Char;
  442. PROCEDURE CreateLogFont(_HPS:LONGWORD;VAR facename:STRING;hei,len:LONGWORD);
  443. PROCEDURE GOTOXY(x,y:LONGWORD);
  444.  
  445. FUNCTION  PARAMSTR(item:Byte):string;
  446. FUNCTION  PARAMCOUNT:Byte;
  447. PROCEDURE PutMemPtr(p:Pointer;Offset:LONGWORD;Value:BYTE);
  448. FUNCTION GetMemPtr(p:Pointer;Offset:LONGWORD):BYTE;
  449. PROCEDURE Halt(code:BYTE);
  450. PROCEDURE RunError(Code:BYTE);
  451.  
  452.  
  453. PROCEDURE MainDispatchLoop;
  454.  
  455. FUNCTION LongToPointer(l:LONGWORD):POINTER;
  456. FUNCTION PointerToLong(p:POINTER):LONGWORD;
  457.  
  458. IMPLEMENTATION
  459.  
  460. PROCEDURE NewSystemHeap;  {delete old system heap and create new one}
  461. BEGIN
  462.     {Free old system heap and generate new}
  463.     ASM
  464.        ;Free old system heap
  465.        PUSHL _HeapOrg
  466.        MOV AL,1
  467.        CALLDLL DosCalls,347   ;DosSubUnsetMem
  468.        ADD ESP,4
  469.        PUSHL _HeapOrg
  470.        MOV AL,1
  471.        CALLDLL DosCalls,304   ;DosFreeMem
  472.        ADD ESP,4
  473.  
  474.        ;generate new system heap
  475.        MOV EAX,8192    ;Allocate 8MB private memory
  476.        MOV EBX,1024
  477.        MUL EBX
  478.        MOV _HeapSize,EAX
  479.        PUSHL 3         ;Flags PAG_READ|PAG_WRITE
  480.        PUSH EAX        ;Length of memory
  481.        PUSHL OFFSET(_Heaporg)
  482.        MOV AL,3             ;3 Parameters
  483.        CALLDLL DosCalls,299 ;DosAllocMem
  484.        ADD ESP,12            ;Clear Stack
  485.  
  486.        ;Prepare the memory block for suballocation
  487.        PUSHL _HeapSize      ;Size of Heap
  488.        PUSHL 5              ;Flags DOSSUB_INIT|DOSSUB_SPARSE_OBJ
  489.        PUSHL _Heaporg
  490.        MOV AL,3
  491.        CALLDLL DosCalls,344 ;DosSubSetMem
  492.        ADD ESP,12            ;Clear Stack
  493.  
  494.        ;Set the system pointers
  495.        MOV EAX,_HeapOrg
  496.        MOV _HeapPtr,EAX
  497.        ADD EAX,_HeapSize
  498.        MOV _HeapEnd,EAX
  499.     END;
  500. END;
  501.  
  502. FUNCTION LongToPointer(l:LONGWORD):POINTER;ASM;
  503. BEGIN
  504.      ASM
  505.         MOV EBX,ESP
  506.         MOV EAX,[EBX+4]
  507.         RETN32 4
  508.      END;
  509. END;
  510.  
  511. FUNCTION PointerToLong(p:POINTER):LONGWORD;ASM;
  512. BEGIN
  513.      ASM
  514.         MOV EBX,ESP
  515.         MOV EAX,[EBX+4]
  516.         RETN32 4
  517.      END;
  518. END;
  519.  
  520.  
  521. PROCEDURE PutMemPtr(p:Pointer;Offset:LONGWORD;Value:BYTE);
  522. BEGIN
  523.      ASM
  524.         MOV EDI,$p
  525.         ADD EDI,$Offset
  526.         MOV AL,$Value
  527.         MOV [EDI+0],AL
  528.      END;
  529. END;
  530.  
  531. FUNCTION GetMemPtr(p:Pointer;Offset:LONGWORD):BYTE;ASM;
  532. BEGIN
  533.      ASM
  534.         PUSH EBP
  535.         MOV EBP,ESP
  536.         MOV EDI,$p
  537.         ADD EDI,$Offset
  538.         MOV AL,[EDI+0]
  539.         LEAVE
  540.         RETN32 8
  541.      END;
  542. END;
  543.  
  544.  
  545.  
  546.  
  547. ASSEMBLER
  548.  
  549. !ParaInfo PROC NEAR32  ;(AL=Function - 1 count of parameters to CL
  550.                        ;               2 Pointer to parameter CL to ESI
  551.                        ;Input:argument start in ESI
  552.          MOV BX,0      ;we start with parameter 0
  553.          CMP AL,2      ;get parameter name ?
  554.          JNE !no_name
  555.          PUSH ESI
  556.          CMP CL,0      ;parameter 0 required ?
  557.          JE !no_args   ;Thats cool (or it sucks)
  558.          POP ESI
  559. !no_name:
  560.          ;Overread the EXE file name
  561.          CLD
  562.          PUSH AX
  563. !rrloop:
  564.          LODSB
  565.          CMP AL,0
  566.          JNE !rrloop
  567.          POP AX
  568.  
  569.          CMP AL,2   ;get parameter name ?
  570.          JE !get_argname
  571.          MOV CL,255 ;impossible parameter
  572. !get_argname:
  573.          XOR CH,CH
  574.          MOV BX,1      ;now finally we start with parameter 1
  575.  
  576.          LODSB
  577.          ;check whether the first character is a separator
  578.          CMP AL,' '
  579.          JE !aagain
  580.          CMP AL,0   ;is this already the end -->Urrgh !
  581.          JNE !al2
  582.          PUSHL 0    ;The (nonexistent) parameters -->Throw it away guy !
  583.          MOV BL,0   ;No parameters
  584.          JMP !no_args
  585. !al2:
  586.          DEC ESI    ;restore old position
  587. !aagain:
  588.          PUSH ESI   ;save last adress
  589.          CMP CL,BL  ;is the parameter reached ??
  590.          JE !no_args
  591. !readloop:
  592.          LODSB
  593.          CMP AL,0
  594.          JE !no_args1  ;No more arguments detected
  595.          ;check all separators possible
  596.          CMP AL,' '
  597.          JE !separator
  598.          ;No separator --> normal character
  599.          JMP !readloop
  600. !separator:
  601.          ;Check whether more separators follow
  602.          LODSB
  603.          CMP AL,' '
  604.          JE !one_more
  605.          CMP AL,0      ;A zero parameter is stupid
  606.          JNE !no_more
  607.          POP EAX       ;Clear stack
  608.          PUSHL 0       ;The (nonexistent) parameter -->Throw it away guy !
  609.          JMP !no_args
  610. !one_more:
  611.          JMP !separator
  612. !no_more:
  613.          DEC ESI
  614.          INC BX        ;Increment parameter count
  615.          POP EAX       ;clear stack
  616.          JMP !aagain
  617. !no_args1:
  618.          ;Argument index was invalid
  619.          POP ESI   ;Clear Stack
  620.          PUSHL 0   ;Pointer to parameter is NIL
  621. !no_args:
  622.          MOV CL,BL     ;Parameter count
  623.          POP ESI       ;Adress of last parameter
  624.          RETN32
  625. !ParaInfo ENDP
  626.  
  627. END;
  628.  
  629. FUNCTION  PARAMSTR(item:Byte):string;ASM;
  630. BEGIN
  631.      ASM
  632.          MOV EBX,ESP
  633.          MOV CL,[EBX+4]               ;index to CL
  634.          MOV AL,2                     ;Get Parameter name
  635.          MOV ESI,_ArgStart
  636.          CALLN32 !ParaInfo
  637.          MOVB !TempString,0          ;Result string is empty
  638.          CMP ESI,0                    ;Parameter invalid ?
  639.          JE _Lpe                      ;--> It sucks !
  640.  
  641.          MOV EDI,OFFSET(!TempString)
  642.          XOR AL,AL    ;Stringlen to 0
  643.          STOSB
  644.          MOV CL,0     ;Len is 0
  645.          CLD
  646. __lp1:
  647.          LODSB
  648.          ;Check all separators
  649.          CMP AL,' '
  650.          JE __Lps
  651.          CMP AL,0    ;Last parameter
  652.          JE __Lps
  653.          INC CL
  654.          ;No separator --> save
  655.          STOSB
  656.          JMP __lp1
  657. __Lps:
  658.          MOV !TempString,CL    ;set Stringlen
  659.          MOV Al,0               ;termionate string with zero
  660.          STOSB
  661. _lpe:
  662.          RETN32 2
  663.     END;
  664. END;
  665.  
  666.  
  667.  
  668. FUNCTION  PARAMCOUNT:Byte;ASM;
  669. BEGIN
  670.      ASM
  671.            MOV AL,1  ;get parametercount
  672.            MOV ESI,_ArgStart
  673.            CALLN32 !ParaInfo
  674.            MOV AL,CL
  675.            XOR AH,AH
  676.            RETN32
  677.      END;
  678. END;
  679.  
  680.  
  681.  
  682. PROCEDURE Beep(Freq,duration:LONGWORD);
  683. BEGIN
  684.      ASM
  685.          PUSHL $duration
  686.          PUSHL $freq
  687.          MOV AL,2
  688.          CALLDLL DOSCALLS,286  ;DosBeep
  689.          ADD ESP,8
  690.      END;
  691. END;
  692.  
  693.  
  694.  
  695. PROCEDURE MainDispatchLoop;
  696. VAR _qmsg:QMSG;
  697. BEGIN
  698.      ASM
  699. !ndis:
  700.         PUSHL 0
  701.         PUSHL 0
  702.         PUSHL 0
  703.         LEA EAX,$_qmsg
  704.         PUSH EAX
  705.         PUSHL _AppHandle
  706.         MOV AL,5
  707.         CALLDLL PMWIN,915  ;WinGetMsg
  708.         ADD ESP,20
  709.         CMP EAX,0
  710.         JE !exdis
  711.  
  712.         LEA EAX,$_qmsg
  713.         PUSH EAX
  714.         PUSHL _AppHandle
  715.         MOV AL,2
  716.         CALLDLL PMWIN,912  ;WinDispatchMsg
  717.         ADD ESP,8
  718.         JMP !ndis
  719. !exdis:
  720.      END;
  721. END;
  722.  
  723. PROCEDURE CopyStrPChar(s:String;VAR p:PCHAR);ASM;
  724. BEGIN
  725.      ASM
  726.         MOV EBX,ESP
  727.         MOV ESI,[EBX+8]  ;Source
  728.         MOV EDI,[EBX+4] ;Dest
  729.         MOV CL,[ESI+0]
  730.         INC ESI
  731.         MOVZX ECX,CL
  732.         CMP CX,0
  733.         JE !scpc
  734.         CLD
  735.         REP
  736.         MOVSB
  737. !scpc:
  738.         MOVB [EDI+0],0
  739.  
  740.         RETN32 8
  741.      END;
  742. END;
  743.  
  744. PROCEDURE CopyPCharStr(p:PChar;VAR s:String);ASM;
  745. BEGIN
  746.      ASM
  747.         MOV EBX,ESP
  748.  
  749.         MOV ESI,[EBX+8]  ;Source
  750.         MOV EDI,[EBX+4] ;Dest
  751.         PUSH EDI
  752.         INC EDI
  753.         MOV CL,0
  754.         CLD
  755. !aclo:
  756.         LODSB
  757.         CMP AL,0
  758.         JE !scpc_1
  759.         STOSB
  760.         INC CL
  761.         JMP !aclo
  762. !scpc_1:
  763.         POP EDI
  764.         MOV [EDI+0],CL
  765.  
  766.         RETN32 8
  767.      END;
  768. END;
  769.  
  770. ASSEMBLER
  771.  
  772. !Concat PROC NEAR32
  773.         MOV EBX,ESP
  774.         MOV EDI,[EBX+8]    ;s
  775.         MOV ESI,[EBX+4]    ;s1
  776.         MOVZXB ECX,[EDI+0] ;length of s
  777.         CLD
  778.         LODSB
  779.         ADD [EDI+0],AL
  780.         JNC !!ll1
  781.         MOVB [EDI+0],255
  782.         MOV AL,CL
  783.         NOT AL
  784. !!ll1:
  785.         ADD EDI,ECX
  786.         INC EDI
  787.         MOV CL,AL
  788.         REP
  789.         MOVSB
  790.         MOV AL,0      ;Abschluß PChar
  791.         STOSB
  792.         RETN32 4
  793. !Concat ENDP
  794.  
  795. END; {Assembler}
  796.  
  797. PROCEDURE Halt(code:BYTE);ASM;
  798. BEGIN
  799.      ASM
  800.         MOV EBX,ESP
  801.         MOV AL,[EBX+4]
  802.         XOR AH,AH
  803.         MOV _ExitCode,AX
  804.         CMPD _PMCrtWindow,0   ;is a CrtWindow created ?
  805.         JE !qt                ;No !
  806.         CALLN32 _MainDispatchLoop ;Wait until CRT terminates
  807. !qt:
  808.         MOV AX,_ExitCode  ;ExitCode holen
  809.         XOR AH,AH
  810.         CMP AL,0   ;Fehler aufgetreten ?
  811.         JE noexerr
  812.  
  813.         PUSH AX      ;Save Return code
  814.  
  815.         MOV EDI,OFFSET(!ErrorMsg)
  816.         ADD EDI,24   ;Focus after error
  817.         XOR AH,AH
  818.         MOV BX,10
  819.         XOR CX,CX
  820. Lw46:
  821.         XOR DX,DX
  822.         DIV BX
  823.         ADD DL,'0'
  824.         MOV [EDI+0],DL
  825.         INC EDI
  826.         INC CX
  827.         OR AX,AX
  828.         JNE Lw46
  829.  
  830.         PUSHL OFFSET(!TempRet);
  831.         PUSHL 41                 ;length of text
  832.         PUSHL OFFSET(!ErrorMsg)
  833.         PUSHL 1                  ;to Standard output
  834.         MOV AL,4                 ;4 Parameters
  835.         CALLDLL DosCalls,282     ;DosWrite
  836.         ADD ESP,16               ;Parameters from stack
  837.         POP AX     ;Get Return Code
  838. noexerr:
  839.         PUSH AX
  840.  
  841.         MOV EAX,_PMCrtWindow
  842.         CMP EAX,0
  843.         JE !nodel
  844.  
  845.         PUSHL _PMCrtWindow
  846.         MOV AL,1
  847.         CALLDLL PMWIN,728   ;WinDestroyWindow
  848.         ADD ESP,4
  849. !nodel:
  850.         ;Free system heap
  851.         PUSHL _HeapOrg
  852.         MOV AL,1
  853.         CALLDLL DosCalls,347   ;DosSubUnsetMem
  854.         ADD ESP,4
  855.         PUSHL _HeapOrg
  856.         MOV AL,1
  857.         CALLDLL DosCalls,304   ;DosFreeMem
  858.         ADD ESP,4
  859.  
  860.         PUSHL _AppQueueHandle
  861.         MOV AL,1
  862.         CALLDLL PMWIN,726   ;WinDestroyMsgQueue
  863.         ADD ESP,4
  864.         PUSHL _AppHandle
  865.         MOV AL,1
  866.         CALLDLL PMWIN,888   ;WinTerminate
  867.         ADD ESP,4
  868.  
  869.         POP AX
  870.         MOVZX EAX,AX
  871.         PUSHL 1               ;Exit the whole process
  872.         PUSH EAX              ;Return Code
  873.         MOV AL,2
  874.         CALLDLL DosCalls,234  ;DosExit
  875.         ADD ESP,8
  876.         RETN32
  877.     END; {asm}
  878. END;
  879.  
  880. PROCEDURE RunError(Code:BYTE);ASM;
  881. BEGIN
  882.      ASM
  883.         MOV EBX,ESP
  884.         MOV AL,[EBX+4]
  885.         POP ECX         ;Adress of CALLN32 _Runerror
  886.         POP ECX         ;Error Adress
  887.         MOV _ErrorAddr,ECX
  888.         XOR AH,AH
  889.         MOV _ExitCode,AX
  890. exloop:
  891.         PUSHL OFFSET(@raddr) ;Return adress for ExitProc
  892.         PUSHL _ExitProc    ;ExitProc on Stack
  893.         RETN32             ;jump into ExitProc
  894. @raddr
  895.         JMP exloop  ;until termination
  896.      END; {asm}
  897. END;
  898.  
  899. ASSEMBLER
  900.  
  901. !PCharCopy PROC NEAR32
  902.          MOV EBX,ESP
  903.          MOV ESI,[EBX+8]
  904.          MOV EDI,[EBX+4]
  905.          CLD
  906. !re:
  907.          LODSB
  908.          STOSB
  909.          CMP AL,0
  910.          JNE !re
  911.          CLD
  912.          RETN32 8
  913. !PCharCopy ENDP
  914.  
  915. END;
  916.  
  917. PROCEDURE GetAPIMem(VAR p:POINTER;size:LONGWORD);
  918. BEGIN
  919.      ASM
  920.         PUSHL 19        ;Flags PAG_READ|PAG_WRITE|PAG_COMMIT
  921.         PUSHL $size     ;Length of memory
  922.         PUSHL $p
  923.         MOV AL,3             ;3 Parameters
  924.         CALLDLL DosCalls,299 ;DosAllocMem
  925.         ADD ESP,12            ;Clear Stack
  926.         CMP EAX,0
  927.         JE !eok
  928.         MOV AX,214
  929.         CALLN32 _Runerror      ;Illegal pointer operation
  930. !eok:
  931.      END;
  932. END;
  933.  
  934. PROCEDURE FreeAPIMem(VAR p:POINTER;size:LONGWORD);
  935. BEGIN
  936.      ASM
  937.         MOV ESI,$p
  938.         PUSHL [ESI+0]
  939.         MOV AL,1
  940.         CALLDLL DosCalls,304   ;DosFreeMem
  941.         ADD ESP,4
  942.         CMP EAX,0
  943.         JE !eok_1
  944.         MOV AX,214
  945.         CALLN32 _Runerror      ;Illegal pointer operation
  946. !eok_1:
  947.      END;
  948. END;
  949.  
  950.  
  951. PROCEDURE GETMEM(var p:Pointer;size:LongWord);
  952. BEGIN
  953.      ASM
  954.         MOV EAX,[EBP+8]       ;Size
  955.         ADD EAX,7
  956.         AND AL,F8h            ;Align on 8 byte boundary
  957.         PUSH EAX
  958.         PUSHL [EBP+12]
  959.         PUSHL _HeapOrg
  960.         MOV AL,3
  961.         CALLDLL DosCalls,345   ;DosSubAllocMem
  962.         ADD ESP,12             ;Clear Stack
  963.         CMP EAX,0
  964.         JE !wg
  965.         MOV AX,214
  966.         CALLN32 _Runerror      ;Illegal pointer operation
  967. !wg:
  968.         MOV ESI,[EBP+12]
  969.         MOV EAX,[ESI+0]        ;Adresse
  970.         ADD EAX,[EBP+8]
  971.         CMP EAX,_HeapPtr
  972.         JB !eg
  973.         MOV _HeapPtr,EAX
  974. !eg:
  975.      END;
  976. END;
  977.  
  978. PROCEDURE FREEMEM(var p:pointer;size:LongWord);
  979. BEGIN
  980.      ASM
  981.          mov esi,[EBP+12]      ;Addr
  982.          mov esi,[esi+0]
  983.  
  984.          MOV EAX,[EBP+8]       ;Size
  985.          ADD EAX,7
  986.          AND AL,F8h            ;Align on 8 byte boundary
  987.          PUSH EAX
  988.          MOV ESI,[EBP+12]
  989.          MOV EAX,[ESI+0]
  990.          MOVD [ESI+0],0       ;Invalidate pointer
  991.          MOV EBX,EAX
  992.          ADD EBX,[EBP+8]
  993.          CMP EBX,_HeapPtr
  994.          JB !nf
  995.          MOV _HeapPtr,EAX
  996. !nf:
  997.          PUSH EAX              ;Adress of block
  998.          PUSHL _HeapOrg
  999.          MOV AL,3
  1000.          CALLDLL DosCalls,346  ;DosSubFreeMem
  1001.          ADD ESP,12
  1002.          CMP EAX,0
  1003.          JE !ef
  1004.          MOV AX,214           ;Illegal pointer operation
  1005.          CALLN32 _RunError
  1006. !ef:
  1007.      END;
  1008. END;
  1009.  
  1010. FUNCTION  MAXAVAIL:LongWord;ASM;
  1011. BEGIN
  1012.      ASM
  1013.         MOV EAX,_HeapEnd
  1014.         SUB EAX,_HeapPtr
  1015.         RETN32
  1016.      END;
  1017. END;
  1018.  
  1019.  
  1020. FUNCTION  MEMAVAIL:LongWord;ASM;
  1021. BEGIN
  1022.      ASM
  1023.         MOV EAX,_HeapEnd
  1024.         SUB EAX,_HeapPtr
  1025.         RETN32
  1026.      END;
  1027. END;
  1028.  
  1029. PROCEDURE BYTEMOVE(var source;var dest;size:LongWord);ASM;
  1030. BEGIN
  1031.      ASM
  1032.          MOV EBX,ESP
  1033.          MOV ESI,[EBX+12]
  1034.          MOV EDI,[EBX+8]
  1035.          MOV ECX,[EBX+4]
  1036.          CLD
  1037.          CMP ESI,EDI
  1038.          JAE !Mo1
  1039.          ADD ESI,ECX
  1040.          ADD EDI,ECX
  1041.          DEC ESI
  1042.          DEC EDI
  1043.          STD
  1044. !Mo1:
  1045.          REP
  1046.          MOVSB
  1047.          CLD
  1048.          RETN32 12
  1049.     END;
  1050. END;
  1051.  
  1052.  
  1053. PROCEDURE MOVE(var source;var dest;size:LongWord);ASM;
  1054. BEGIN
  1055.      ASM
  1056.         MOV EBX,ESP
  1057.         MOV ESI,[EBX+12]
  1058.         MOV EDI,[EBX+8]
  1059.         MOV ECX,[EBX+4]
  1060.         CLD
  1061.         CMP ESI,EDI
  1062.         JB !Mo2
  1063.         CMP ECX,0
  1064.         JE __L12_1
  1065.         TEST ECX,1
  1066.         JE __L11_1         ;schon gerade Anzahl
  1067.         MOVSB
  1068.         JMP !Mo2_1
  1069. !Mo2:
  1070.         ADD ESI,ECX
  1071.         ADD EDI,ECX
  1072.         DEC ESI
  1073.         DEC EDI
  1074.         STD
  1075.         CMP ECX,0
  1076.         JE __L12_1
  1077.         TEST ECX,1
  1078.         JNE __L__11_1         ;schon gerade Anzahl ??
  1079.         DEC EDI               ;ja !!
  1080.         DEC ESI
  1081.         JMP __L11_1
  1082. __L__11_1:
  1083.         MOVSB
  1084.         DEC ESI
  1085.         DEC EDI
  1086. !Mo2_1:
  1087.         DEC ECX            ;count auf gerade Anzahl
  1088.         CMP ECX,0
  1089.         JE __L12_1
  1090. __L11_1:
  1091.         SHR ECX,1         ;da wortweises Übertragen
  1092.         REP
  1093.         db 66h            ;no double word
  1094.         MOVSW
  1095. __L12_1:
  1096.         RETN32 12
  1097.      END;
  1098. END;
  1099.  
  1100.  
  1101. PROCEDURE FILLCHAR(var dest;size:LongWord;value:byte);ASM;
  1102. BEGIN
  1103.     ASM
  1104.         CLD
  1105.         MOV EBX,ESP
  1106.         MOV EDI,[EBX+10]   ;Destination pointer
  1107.         MOV ECX,[EBX+6]    ;count
  1108.         CMP ECX,0          ;count=0 ??
  1109.         JE __L12
  1110.         MOV AL,[EBX+4]     ;value
  1111.         MOV AH,AL
  1112.  
  1113.         CMP ECX,0
  1114.         JE __L12
  1115.         TEST ECX,1
  1116.         JE __L11           ;schon gerade Anzahl
  1117.         STOSB
  1118.         DEC ECX            ;count auf gerade Anzahl
  1119.         CMP ECX,0
  1120.         JE __L12
  1121. __L11:
  1122.         SHR ECX,1         ;da wortweises Übertragen
  1123.         REP
  1124.         db 66h            ;no double word
  1125.         STOSW
  1126. __L12:
  1127.         RETN32 10
  1128.      END;
  1129. END;
  1130.  
  1131.  
  1132.  
  1133. ASSEMBLER
  1134.  
  1135. ;***************************************************
  1136. ;String Support routines
  1137. ;***************************************************
  1138.  
  1139. !StrCopy PROC NEAR32
  1140.                 CLD
  1141.                 MOV EBX,ESP
  1142.                 MOV ESI,[EBX+10]     ;Source String
  1143.                 MOV EDI,[EBX+6]     ;Destination String
  1144.                 MOV CL,[EBX+4]       ;Maximum length
  1145.                 MOVZX ECX,CL
  1146.                 LODSB
  1147.                 CMP AL,CL
  1148.                 JBE _L1
  1149.                 MOV AL,CL
  1150. _L1:
  1151.                 STOSB
  1152.                 MOV CL,AL
  1153.                 MOVZX ECX,CL
  1154.                 CMP ECX,0
  1155.                 JE _eee1
  1156.  
  1157.                 TEST ECX,1
  1158.                 JE __L11_2         ;schon gerade Anzahl
  1159.                 MOVSB
  1160.                 DEC ECX            ;count auf gerade Anzahl
  1161.                 CMP ECX,0
  1162.                 JE _eee1
  1163. __L11_2:
  1164.                 SHR ECX,1         ;da wortweises Übertragen
  1165.                 REP
  1166.                 db 66h            ;no double word
  1167.                 MOVSW
  1168. _eee1:
  1169.                 MOV AL,0          ;Abschluß PChar
  1170.                 STOSB
  1171.                 RETN32 10
  1172. !StrCopy ENDP
  1173.  
  1174.  
  1175. !StrCopyTemp PROC NEAR32
  1176.                 CLD
  1177.                 MOV EBX,ESP
  1178.                 PUSHA
  1179.                 MOV ESI,[EBX+4]          ;Source String
  1180.                 MOV EDI,OFFSET(!TempString) ;Destination String
  1181.                 LODSB                       ;Length of source string
  1182.                 STOSB                       ;save
  1183.                 MOV CL,AL                   ;set counter
  1184.                 MOVZX ECX,CL
  1185.  
  1186.                 CMP ECX,0
  1187.                 JE __L12_3
  1188.                 TEST ECX,1
  1189.                 JE __L11_3         ;schon gerade Anzahl
  1190.                 MOVSB
  1191.                 DEC ECX            ;count auf gerade Anzahl
  1192.                 CMP ECX,0
  1193.                 JE __L12_3
  1194. __L11_3:
  1195.                 SHR ECX,1         ;da wortweises Übertragen
  1196.                 REP
  1197.                 db 66h            ;no double word
  1198.                 MOVSW
  1199. __L12_3:
  1200.                 MOV EDI,OFFSET(!TempString)
  1201.                 MOV AL,[EDI+0]
  1202.                 XOR AH,AH
  1203.                 MOVZX EAX,AX
  1204.                 ADD EDI,EAX
  1205.                 MOVB [EDI+1],0  ;Abschluß PChar
  1206.                 POPA
  1207.                 RETN32 4
  1208. !StrCopyTemp ENDP
  1209.  
  1210. !AddString PROC NEAR32
  1211.         MOV EBX,ESP
  1212.         MOV EDI,OFFSET(!TempString3)
  1213.         MOV ESI,[EBX+4]    ;s1
  1214.         MOVZXB ECX,[EDI+0] ;length of s
  1215.         CLD
  1216.         LODSB
  1217.         ADD [EDI+0],AL
  1218.         JNC !!lll1
  1219.         MOVB [EDI+0],255
  1220.         MOV AL,CL
  1221.         NOT AL
  1222. !!lll1:
  1223.         ADD EDI,ECX
  1224.         INC EDI
  1225.         MOV CL,AL
  1226.         REP
  1227.         MOVSB
  1228.         MOV AL,0      ;Abschluß PChar
  1229.         STOSB
  1230.         RETN32 4
  1231. !AddString ENDP
  1232.  
  1233. !CopyString PROC NEAR32
  1234.         CLD
  1235.     SUB    EDX,EBX
  1236.     CMP    EAX,EBX
  1237.     JB    LA1
  1238.         MOV    EAX,EBX
  1239. LA1:
  1240.         STOSB
  1241.     MOV    ECX,EAX
  1242.     ADD    EBX,ESI
  1243.         CMP     ECX,0
  1244.         JE __L12_4
  1245.  
  1246.         TEST ECX,1
  1247.         JE __L11_4         ;schon gerade Anzahl
  1248.         MOVSB
  1249.         DEC ECX            ;count auf gerade Anzahl
  1250.         CMP ECX,0
  1251.         JE __L12_4
  1252. __L11_4:
  1253.         SHR ECX,1         ;da wortweises Übertragen
  1254.         REP
  1255.         db 66h            ;no double word
  1256.         MOVSW
  1257. __L12_4:
  1258.     MOV    ESI,EBX
  1259.     RETN32
  1260. !CopyString ENDP
  1261.  
  1262. END;
  1263.  
  1264. FUNCTION  UPCASE(item:char):Char;ASM;
  1265. BEGIN
  1266.      ASM
  1267.          MOV EBX,ESP
  1268.          MOV AL,[EBX+4]
  1269.          CMP AL,61h
  1270.          JB L32
  1271.          CMP AL,7ah
  1272.          JA L32
  1273.          SUB AL,20h
  1274. L32:
  1275.          RETN32 2
  1276.       END;
  1277. END;
  1278.  
  1279. FUNCTION COPY(source:string;start,ende:Byte):String;ASM;
  1280. BEGIN
  1281.      ASM
  1282.         PUSH EBP
  1283.         MOV EBP,ESP
  1284.  
  1285.         MOV ESI,[EBP+12]             ;Source string
  1286.         MOV EDI,OFFSET(!TempString)  ;Destination string
  1287.  
  1288.         MOVZXB AX,[ESI+0]            ;Length of source
  1289.         MOVZXB ECX,$Start            ;Index
  1290.         OR ECX,ECX
  1291.         JG !_Lab1
  1292.         MOV ECX,1
  1293. !_Lab1:
  1294.         ADD ESI,ECX
  1295.         SUB AX,CX
  1296.         JB !_Lab3
  1297.         INC AX
  1298.         MOVZXB CX,$Ende             ;Count
  1299.         OR CX,CX
  1300.         JGE !_Lab2
  1301.         XOR CX,CX
  1302. !_Lab2:
  1303.         CMP AX,CX
  1304.         JBE !_Lab4
  1305.         MOV AX,CX
  1306.         JMP !_Lab4
  1307. !_Lab3:
  1308.         XOR AX,AX
  1309. !_Lab4:
  1310.         STOSB
  1311.         MOVZX ECX,AX
  1312.         CMP ECX,0
  1313.         JE !_Lab5
  1314.         REP
  1315.         MOVSB
  1316. !_Lab5:
  1317.         MOV EDI,[EBP+12]
  1318.         MOVZXB EAX,[EDI+0]
  1319.         ADD EDI,EAX
  1320.         MOVB [EDI+1],0  ;Abschluß PChar
  1321.  
  1322.         LEAVE
  1323.         RETN32 8
  1324.      END;
  1325. END;
  1326.  
  1327. PROCEDURE SUBSTR(VAR source:string;start,ende:Byte);ASM;
  1328. BEGIN
  1329.       ASM
  1330.         PUSH EBP
  1331.         MOV EBP,ESP
  1332.  
  1333.         MOV ESI,[EBP+12]             ;Source string
  1334.         MOV EDI,ESI                  ;Destination string
  1335.  
  1336.         MOVZXB AX,[ESI+0]            ;Length of source
  1337.         MOVZXB ECX,$Start            ;Index
  1338.         OR ECX,ECX
  1339.         JG !_Lab1_1
  1340.         MOV ECX,1
  1341. !_Lab1_1:
  1342.         ADD ESI,ECX
  1343.         SUB AX,CX
  1344.         JB !_Lab3_1
  1345.         INC AX
  1346.         MOVZXB CX,$Ende             ;Count
  1347.         OR CX,CX
  1348.         JGE !_Lab2_1
  1349.         XOR CX,CX
  1350. !_Lab2_1:
  1351.         CMP AX,CX
  1352.         JBE !_Lab4_1
  1353.         MOV AX,CX
  1354.         JMP !_Lab4_1
  1355. !_Lab3_1:
  1356.         XOR AX,AX
  1357. !_Lab4_1:
  1358.         STOSB
  1359.         MOVZX ECX,AX
  1360.         CMP ECX,0
  1361.         JE !_Lab5_1
  1362.         REP
  1363.         MOVSB
  1364. !_Lab5_1:
  1365.         MOV EDI,[EBP+12]
  1366.         MOVZXB EAX,[EDI+0]
  1367.         ADD EDI,EAX
  1368.         MOVB [EDI+1],0  ;Abschluß PChar
  1369.         LEAVE
  1370.         RETN32 8
  1371.      END;
  1372. END;
  1373.  
  1374.  
  1375. PROCEDURE Str(l:LongInt;var s:string);ASM;
  1376. BEGIN
  1377.      ASM
  1378.         MOV EBX,ESP
  1379.         MOV EAX,[EBX+8]
  1380.         MOV EDI,[EBX+4]
  1381.         PUSH EDI
  1382.         POP ESI
  1383.         MOVB [EDI+0],0
  1384.         MOV EBX,10
  1385.         XOR ECX,ECX
  1386.         CMP EAX,0
  1387.         JNL Lw46_1
  1388.         NEG EAX
  1389.         MOVB [EDI+0],1
  1390.         INC EDI
  1391.         MOVB [EDI+0],'-'
  1392. Lw46_1:
  1393.         XOR EDX,EDX
  1394.         DIV EBX
  1395.         PUSH DX
  1396.         INC CX
  1397.         OR EAX,EAX
  1398.         JNE Lw46_1
  1399. Lw47:
  1400.         POP AX
  1401.         ADD AL,'0'
  1402.         INCB [ESI+0]
  1403.         INC EDI
  1404.         MOV [EDI+0],AL
  1405.         LOOP Lw47
  1406.  
  1407.         MOV EBX,ESP
  1408.         MOV EDI,[EBX+4]
  1409.         MOV AL,[EDI+0]
  1410.         MOVZX EAX,AL
  1411.         ADD EDI,EAX
  1412.         MOVB [EDI+1],0  ;Abschluß PChar
  1413.         RETN32 8
  1414.      END;
  1415. END;
  1416.  
  1417. PROCEDURE Val(s:string;var l:longint;var result:Byte);ASM;
  1418. BEGIN
  1419.      ASM
  1420.         PUSH EBP
  1421.         MOV EBP,ESP
  1422.         SUB ESP,10
  1423.         MOV EDI,[EBP+16]   ;s
  1424.         MOV CL,[EDI+0]     ;Länge
  1425.         MOVZX ECX,CL
  1426.         MOVB [EBP-6],0
  1427.  
  1428.         MOVD [EBP-10],10   ;Base
  1429.         MOV AL,[EDI+1]
  1430.         ADD EDI,ECX
  1431.         CMP AL,'$'         ;Hexadecimal ??
  1432.         JNE !nohex
  1433.         MOVD [EBP-10],16   ;Base
  1434.         DEC ECX
  1435. !nohex:
  1436.         CMP AL,'-'
  1437.         JNE !q2
  1438.         DEC ECX
  1439.         MOVB [EBP-6],1
  1440. !q2:
  1441.         MOV EBX,1
  1442.         MOVW EAX,0
  1443.         MOV [EBP-4],EAX
  1444. !q1:
  1445.         MOV AL,[EDI+0]
  1446.         DEC EDI
  1447.         CMP AL,48
  1448.         JB !qerr
  1449.         CMP AL,57
  1450.         JNA !noqerr
  1451.  
  1452.         CMP AL,102
  1453.         JA !qerr
  1454.         CMP AL,65
  1455.         JB !qerr
  1456.         CMP AL,70
  1457.         JBE !hexnum
  1458.         CMP AL,97
  1459.         JB !qerr
  1460.         SUB AL,32    ;To upper
  1461. !hexnum:
  1462.         SUB AL,7
  1463. !noqerr:
  1464.         SUB AL,48
  1465.         MOVZX EAX,AL
  1466.         MUL EBX
  1467.         MOV EDX,[EBP-4]
  1468.         ADD EDX,EAX
  1469.         MOV [EBP-4],EDX
  1470.         MOV EAX,EBX
  1471.         MOV EBX,[EBP-10]  ;Base
  1472.         MUL EBX
  1473.         MOV EBX,EAX
  1474.         LOOP !q1
  1475. !qerr:
  1476.         MOV EDI,[EBP+8]     ;result
  1477.         MOV [EDI+0],CL
  1478.         MOV EAX,[EBP-4]
  1479.         CMPB [EBP-6],1
  1480.         JNE !q3
  1481.         NEG EAX
  1482. !q3:
  1483.         MOV EDI,[EBP+12]    ;l
  1484.         MOV [EDI+0],EAX
  1485.         LEAVE
  1486.         RETN32 12
  1487.      END;
  1488. END;
  1489.  
  1490. FUNCTION ToStr(l:longint):string;ASM;
  1491. BEGIN
  1492.      ASM
  1493.         MOV EBX,ESP
  1494.         PUSHL [EBX+4]
  1495.         PUSHL OFFSET(!TempString)
  1496.         CALLN32 _Str
  1497.         RETN32 4
  1498.      END;
  1499. END;
  1500.  
  1501. ASSEMBLER
  1502.  
  1503. !StringCmp PROC NEAR32
  1504.               MOV EBX,ESP
  1505.               CLD
  1506.               MOV ESI,[EBX+8]
  1507.               MOV EDI,[EBX+4]
  1508.               LODSB
  1509.               MOV AH,[EDI+0]
  1510.               INC EDI
  1511.               MOV CL,AL
  1512.               CMP CL,AH
  1513.               JBE _nl1
  1514.               MOV CL,AH
  1515. _nl1:
  1516.               OR CL,CL
  1517.               JE _nl2
  1518.               MOVZX ECX,CL
  1519.               CLD
  1520.               REP
  1521.               CMPSB
  1522.               JNE _nl3
  1523. _nl2:
  1524.               CMP AL,AH
  1525. _nl3:
  1526.               RETN32 8
  1527. !StringCmp ENDP
  1528.  
  1529. !PStringCmp PROC NEAR32
  1530.               MOV EBX,ESP
  1531.               CLD
  1532.               MOV ESI,[EBX+8]  ;2.String
  1533.               MOV EDI,[EBX+4]
  1534.               PUSH EDI
  1535.               PUSH ESI
  1536.               MOV AL,0
  1537. !syy:
  1538.               CMPB [ESI+0],0
  1539.               JE !sxx
  1540.               INC AL
  1541.               INC ESI
  1542.               JMP !syy
  1543. !sxx:
  1544.               MOV AH,0
  1545. !syy1:
  1546.               CMPB [EDI+0],0
  1547.               JE !sxx1
  1548.               INC AH
  1549.               INC EDI
  1550.               JMP !syy1
  1551. !sxx1:
  1552.               POP ESI
  1553.               POP EDI
  1554.               MOV CL,AL
  1555.               CMP CL,AH
  1556.               JBE _nl1_1
  1557.               MOV CL,AH
  1558. _nl1_1:
  1559.               OR CL,CL
  1560.               JE _nl2_1
  1561.               MOVZX ECX,CL
  1562.               CLD
  1563.               REP
  1564.               CMPSB
  1565.               JNE _nl3_1
  1566. _nl2_1:
  1567.               CMP AL,AH
  1568. _nl3_1:
  1569.               RETN32 8
  1570. !PStringCmp ENDP
  1571.  
  1572. END;
  1573.  
  1574. FUNCTION POS(item:string;source:string):Byte;ASM;
  1575. BEGIN
  1576.      ASM
  1577.          PUSH EBP
  1578.          MOV EBP,ESP
  1579.          MOV ESI,[EBP+12]   ;item
  1580.          CLD
  1581.          LODSB
  1582.          OR AL,AL
  1583.          JE !lab2
  1584.          MOVZXB EAX,AL
  1585.          MOV EDX,EAX
  1586.          MOV EDI,[EBP+8]    ;source
  1587.          MOVZXB ECX,[EDI+0]
  1588.          SUB ECX,EDX
  1589.          JB !lab2
  1590.          INC ECX
  1591.          INC EDI
  1592. !lab1:
  1593.          LODSB
  1594.          REPNE
  1595.          SCASB
  1596.          JNE !lab2
  1597.          MOV EAX,EDI
  1598.          MOV EBX,ECX
  1599.          MOV ECX,EDX
  1600.          DEC ECX
  1601.          REPE
  1602.          CMPSB
  1603.          JE !lab3
  1604.          MOV EDI,EAX
  1605.          MOV ECX,EBX
  1606.          MOV ESI,[EBP+12]   ;item
  1607.          INC ESI
  1608.          JMP !lab1
  1609. !Lab2:
  1610.          XOR EAX,EAX
  1611.          JMP !Lab4
  1612. !lab3:
  1613.          DEC EAX
  1614.          SUB EAX,[EBP+8]    ;source
  1615. !Lab4:
  1616.          LEAVE
  1617.          RETN32 8
  1618.      END;
  1619. END;
  1620.  
  1621. PROCEDURE Insert(Source:String;VAR s:string;Ind:Byte);
  1622. var OldLen:Byte;
  1623.     SourceLen:Byte;
  1624. Begin
  1625.      asm
  1626.         CMPB [EBP+8],0
  1627.         JE !exx2
  1628.         LEA EDI,!TempString
  1629.         MOV ESI,[EBP+10]
  1630.         INC EDI
  1631.         MOV CL,[ESI+0]
  1632.         XOR CH,CH
  1633.         MOV [EBP-2],CL   ;OldLen
  1634.         MOV CL,[EBP+8]   ;ab dieser Position
  1635.         CMP CL,[EBP-2]
  1636.         JNA !no
  1637.         MOV CL,[EBP-2]
  1638.         MOV [EBP+8],CL
  1639.         INC CL
  1640. !no:
  1641.         INC ESI
  1642.         CMP CL,0
  1643.         JE !nc1
  1644.         DEC CL
  1645.         MOVZX ECX,CL
  1646.         CLD
  1647.         REP
  1648.         MOVSB             ;var s in TempString kopieren
  1649. !nc1:
  1650.         PUSH ESI          ;alte Position merken
  1651.         MOV ESI,[EBP+14]  ;Source
  1652.         MOV CL,[Esi+0]
  1653.         XOR CH,CH
  1654.         MOV [EBP-4],CL    ;SourceLen
  1655.         iNC ESI
  1656.         CMP CL,0
  1657.         JE !nc2
  1658.         MOVZX ECX,CL
  1659.         CLD
  1660.         REP
  1661.         MOVSB
  1662. !nc2:
  1663.         POP ESI         ;alte Position holen
  1664.         MOV CL,[EBP-2]  ;Oldlen
  1665.         MOV AL,[EBP+8]  ;Index
  1666.         DEC AL
  1667.         SUB CL,AL
  1668.         CMP CL,0
  1669.         JE !nc3
  1670.         MOVZX ECX,CL
  1671.         REP
  1672.         MOVSB
  1673. !nc3:
  1674.         MOV AL,[EBP-2]  ;Oldlen
  1675.         ADD AL,[EBP-4]
  1676.  
  1677.         MOV !TempString,AL  ;Länge setzen
  1678.         MOV EDI,[EBP+10]
  1679.         LEA ESI,!TempString
  1680.         MOV CL,AL
  1681.         INC CL
  1682.         MOVZX ECX,CL
  1683.         CLD
  1684.         REP
  1685.         MOVSB
  1686.         MOV EDI,[EBP+10]
  1687.         XOR CH,CH
  1688.         MOV CL,AL
  1689.         MOVZX ECX,CL
  1690.         ADD EDI,ECX
  1691.         MOVB [EDI+1],0  ;Abschluß PChar
  1692. !exx2:
  1693.     end;
  1694. End;
  1695.  
  1696. PROCEDURE Delete(Var s:string;Ind:byte;len:byte);
  1697. var newlen:Byte;
  1698. BEGIN
  1699.      ASM
  1700.         MOV EDI,$s        ;var s
  1701.         MOV AL,[EDI+0]    ;Length of the string
  1702.         MOV CL,$Ind       ;Index in the string
  1703.         CMP CL,AL
  1704.         JA !exx3
  1705.         CMP CL,0
  1706.         JE !exx1
  1707.  
  1708.         MOVZX ECX,CL      ;Index in the string
  1709.         ADD EDI,ECX       ;add the index
  1710.         MOV ESI,$s        ;var s
  1711.         ADD ESI,ECX       ;add the index
  1712.         MOV CL,$len       ;len
  1713.         ADD CL,$ind       ;index
  1714.         CMP CL,AL         ;greater than maximal length ??
  1715.         JNA !cp
  1716.         ;len=maximal length-Index
  1717.         MOV CL,$Len       ;len
  1718.         MOV BL,AL         ;maximal length to bl
  1719.         SUB BL,CL
  1720.         MOV $Len,CL       ;set len anew
  1721. !cp:
  1722.         MOV CL,$Len       ;len
  1723.         MOVZX ECX,CL
  1724.         ADD ESI,ECX       ;add len
  1725.         ADD CL,$Ind       ;Index
  1726.         DEC CL
  1727.         SUB AL,CL
  1728.         MOV CL,AL         ;to transmit
  1729.         CMP CL,0
  1730.         JE !exx1          ;zero bytes
  1731.  
  1732.         MOVZX ECX,CL
  1733.         CLD
  1734.         REP
  1735.         MOVSB
  1736. !exx1:
  1737.         MOV EDI,$s        ;var s
  1738.         MOV AL,[EDI+0]    ;current len
  1739.         SUB AL,$Len       ;len
  1740.         MOV [EDI+0],AL    ;Länge neu setzen
  1741.         MOVZX EAX,AL
  1742.         ADD EDI,EAX
  1743.         MOVB [EDI+1],0 ;PChar Abschluß
  1744. !exx3:
  1745.      end;
  1746. END;
  1747.  
  1748. {*************************************************************************
  1749. *                                                                        *
  1750. *                                                                        *
  1751. *             Procedures and functions for file handling                 *
  1752. *                                                                        *
  1753. *                                                                        *
  1754. **************************************************************************}
  1755.  
  1756. PROCEDURE CHDIR(path:string);ASM;
  1757. BEGIN
  1758.      ASM
  1759.         MOV EBX,ESP
  1760.         MOV EAX,[EBX+4]
  1761.         INC EAX
  1762.         PUSH EAX
  1763.         MOV AL,1
  1764.         CALLDLL DosCalls,255  ;DosSetCurrentDir
  1765.         ADD ESP,4
  1766.         MOV _IoResult,EAX
  1767.         RETN32
  1768.      END;
  1769. END;
  1770.  
  1771. PROCEDURE GETDIR(drive:byte;var path:string);ASM;
  1772. BEGIN
  1773.      ASM
  1774.         PUSH EBP
  1775.         MOV EBP,ESP
  1776.         SUB ESP,8
  1777.  
  1778.         MOV AL,$drive
  1779.         CMP AL,0      ;actual drive required ??
  1780.         JA !nad
  1781.  
  1782.         LEA EAX,[EBP-4]    ;DriveMap
  1783.         PUSH EAX
  1784.         LEA EAX,[EBP-8]    ;Current drive
  1785.         PUSH EAX
  1786.         MOV AL,2
  1787.         CALLDLL DosCalls,275 ;DosQueryCurrentDisk
  1788.         ADD ESP,8
  1789.  
  1790.         MOV _IoResult,EAX
  1791.         CMPD _IoResult,0
  1792.         JNE !egd
  1793.         MOV AL,[EBP-8]
  1794. !nad:
  1795.         MOV EDI,[EBP+8]    ;Path
  1796.         INC EDI
  1797.         CLD
  1798.         ADD AL,64
  1799.         STOSB
  1800.         MOV AL,':'
  1801.         STOSB
  1802.         MOV AL,'\'
  1803.         STOSB
  1804.  
  1805.         MOVD [EBP-4],250   ;max length of dir
  1806.         LEA EAX,[EBP-4]
  1807.         PUSH EAX
  1808.         MOV EAX,[EBP+8]    ;Path
  1809.         ADD EAX,4          ;dispatch drive letter and :\
  1810.         PUSH EAX
  1811.         MOV AL,[EBP+12]    ;Drive number
  1812.         MOVZX EAX,AL
  1813.         PUSH EAX
  1814.         MOV AL,3
  1815.         CALLDLL DosCalls,274     ;DosQueryCurrentDir
  1816.         ADD ESP,12
  1817.         MOV _IoResult,EAX
  1818.  
  1819.         CMPD _IoResult,0
  1820.         JNE !egd
  1821.  
  1822.         MOV CL,255
  1823.         MOV ESI,[EBP+8]
  1824.         INC ESI
  1825.         CLD
  1826. !lgd:
  1827.         INC CL
  1828.         LODSB
  1829.         CMP AL,0
  1830.         JNE !lgd
  1831.  
  1832.         MOV ESI,[EBP+8]
  1833.         MOV [ESI+0],CL   ;set string length
  1834. !egd:
  1835.         LEAVE
  1836.         RETN32 6
  1837.      END;
  1838. END;
  1839.  
  1840. PROCEDURE RMDIR(dir:string);ASM;
  1841. BEGIN
  1842.      ASM
  1843.         MOV EBX,ESP
  1844.         MOV EAX,[EBX+4]
  1845.         INC EAX
  1846.         PUSH EAX
  1847.         MOV AL,1
  1848.         CALLDLL DosCalls,226    ;DosDeleteDir
  1849.         ADD ESP,4
  1850.         MOV _IoResult,EAX
  1851.         RETN32 4
  1852.      END;
  1853. END;
  1854.  
  1855. PROCEDURE MKDIR(dir:string);ASM;
  1856. BEGIN
  1857.      ASM
  1858.         MOV EBX,ESP
  1859.         PUSHL 0         ;No extended attributes
  1860.         MOV EAX,[EBX+4]
  1861.         INC EAX
  1862.         PUSH EAX
  1863.         MOV AL,2
  1864.         CALLDLL DosCalls,270  ;DosCreateDir
  1865.         ADD ESP,8
  1866.         MOV _IoResult,EAX
  1867.         RETN32 4
  1868.      END;
  1869. END;
  1870.  
  1871. PROCEDURE Erase(name:STRING);ASM;
  1872. BEGIN
  1873.      ASM
  1874.          MOV EBX,ESP
  1875.          MOV EAX,[EBX+4]
  1876.          INC EAX
  1877.          PUSH EAX
  1878.          MOV AL,1
  1879.          CALLDLL DosCalls,259   ;DosDelete
  1880.          ADD ESP,4
  1881.          MOV _IoResult,EAX
  1882.          RETN32
  1883.      END;
  1884. END;
  1885.  
  1886. PROCEDURE Seek(var f:file;n:LongWord);ASM;
  1887. BEGIN
  1888.      ASM
  1889.          PUSH EBP
  1890.          MOV EBP,ESP
  1891.          SUB ESP,4
  1892.          LEA EAX,[EBP-4]
  1893.          PUSH EAX
  1894.          PUSHL _SeekMode   ;from where to Seek
  1895.          PUSHL [EBP+8]     ;Bytes to move
  1896.          MOV EDI,[EBP+12]  ;var f
  1897.          PUSHL [EDI+0]     ;Handle
  1898.          MOV AL,4
  1899.          CALLDLL DosCalls,256 ;DosSetFilePtr
  1900.          ADD ESP,16
  1901.          MOV _IoResult,EAX
  1902.          LEAVE
  1903.          RETN32 8
  1904.       END;
  1905. END;
  1906.  
  1907. FUNCTION FilePos(var f:file):LongWord;ASM;
  1908. BEGIN
  1909.      ASM
  1910.          PUSH EBP
  1911.          MOV EBP,ESP
  1912.          SUB ESP,4
  1913.          LEA EAX,[EBP-4]
  1914.          PUSH EAX
  1915.          PUSHL 1                ;from current position
  1916.          PUSHL 0
  1917.          MOV EDI,[EBP+8]        ;var f
  1918.          PUSHL [EDI+0]     ;Handle
  1919.          MOV AL,4
  1920.          CALLDLL DosCalls,256 ;DosSetFilePtr
  1921.          ADD ESP,16
  1922.          MOV _IoResult,EAX
  1923.          MOV EAX,[EBP-4]   ;result
  1924.          LEAVE
  1925.          RETN32 4
  1926.       END;
  1927. END;
  1928.  
  1929.  
  1930. FUNCTION FileSize(var f:file):LongWord;ASM;
  1931. BEGIN
  1932.      ASM
  1933.          PUSH EBP
  1934.          MOV EBP,ESP
  1935.          SUB ESP,8
  1936.          MOV EDI,[EBP+8]  ;Var f
  1937.          PUSH EDI
  1938.          CALLN32 _FilePos
  1939.          PUSH EAX
  1940.          CMPD,_ioresult,0
  1941.          JNE L_19_1   ;Error occured
  1942.  
  1943.          LEA EAX,[EBP-8]
  1944.          PUSH EAX
  1945.          PUSHL 2                ;_End of file
  1946.          PUSHL 0
  1947.          MOV EDI,[EBP+8]        ;var f
  1948.          PUSHL [EDI+0]          ;Handle
  1949.          MOV AL,4
  1950.          CALLDLL DosCalls,256   ;DosSetFilePtr
  1951.          ADD ESP,16
  1952.          CMPD _IoResult,0
  1953.          JNE L_19_1   ;Error occured
  1954.  
  1955.          POP EBX   ;alte Fileposition
  1956.          LEA EAX,[EBP-4]
  1957.          PUSH EAX
  1958.          PUSHL 0                ;Start of file
  1959.          PUSH EBX
  1960.          MOV EDI,[EBP+8]        ;var f
  1961.          PUSHL [EDI+0]     ;Handle
  1962.          MOV AL,4
  1963.          CALLDLL DosCalls,256 ;DosSetFilePtr
  1964.          ADD ESP,16
  1965.          MOV _IoResult,EAX
  1966. L_19_1:
  1967.          MOV EAX,[EBP-8]
  1968.          LEAVE
  1969.          RETN32 4
  1970.       END;
  1971. END;
  1972.  
  1973.  
  1974.  
  1975. PROCEDURE Reset(var f:file;recsize:LongWord);ASM;
  1976. BEGIN
  1977.       ASM
  1978.          PUSH EBP
  1979.          MOV EBP,ESP
  1980.          SUB ESP,4         ;Action Taken
  1981.          MOV EDI,[EBP+12]  ;Var f
  1982.          MOV EAX,[EBP+8]   ;Recsize
  1983.          MOV [EDI+4],EAX
  1984.          PUSHL [EDI+88]    ;extended Attributes
  1985.          PUSHL _FileMode
  1986.          PUSHL 1           ;Open If file exists
  1987.          PUSHL 0           ;No attributes required
  1988.          PUSHL 0
  1989.          LEA EAX,[EBP-4]
  1990.          PUSH EAX
  1991.          LEA EAX,[EDI+0]   ;Handle
  1992.          PUSH EAX
  1993.          LEA EAX,[EDI+8]   ;Filename
  1994.          PUSH EAX
  1995.          MOV AL,8
  1996.          CALLDLL DosCalls,273  ;DosOpen
  1997.          ADD ESP,32
  1998.          MOV _IoResult,EAX
  1999.          CMPD _IoResult,0
  2000.          JNE !ers
  2001.          MOV ESI,[EBP+12]
  2002.          MOV EAX,_FileMode
  2003.          MOV [EDI+92],EAX  ;Patch file mode
  2004. !ers:
  2005.          LEAVE
  2006.          RETN32 8
  2007.       END;
  2008. END;
  2009.  
  2010. PROCEDURE Rewrite(var f:file;recsize:Longword);ASM;
  2011. BEGIN
  2012.      ASM
  2013.          PUSH EBP
  2014.          MOV EBP,ESP
  2015.          SUB ESP,4         ;Action Taken
  2016.          MOV EDI,[EBP+12]  ;Var f
  2017.          MOV EAX,[EBP+8]   ;Recsize
  2018.          MOV [EDI+4],EAX
  2019.          PUSHL [EDI+88]    ;extended Attributes
  2020.          PUSHL _FileMode
  2021.          PUSHL  18         ;Create if not exist,replace if exist
  2022.          PUSHL 20h         ;ARCHIVE
  2023.          PUSHL 0
  2024.          LEA EAX,[EBP-4]
  2025.          PUSH EAX
  2026.          LEA EAX,[EDI+0]   ;Handle
  2027.          PUSH EAX
  2028.          LEA EAX,[EDI+8]   ;Filename
  2029.          PUSH EAX
  2030.          MOV AL,8
  2031.          CALLDLL DosCalls,273  ;DosOpen
  2032.          ADD ESP,32
  2033.          MOV _IoResult,EAX
  2034.          CMPD _IoResult,0
  2035.          JNE !ers_1
  2036.          MOV ESI,[EBP+12]
  2037.          MOV EAX,_FileMode
  2038.          MOV [EDI+92],EAX  ;Patch file mode
  2039. !ers_1:
  2040.          LEAVE
  2041.          RETN32 8
  2042.       END;
  2043. END;
  2044.  
  2045. PROCEDURE BlockWrite(VAR f:file;var Buf;Count:LongWord);ASM;
  2046. BEGIN
  2047.      ASM
  2048.          PUSH EBP
  2049.          MOV EBP,ESP
  2050.          CMPD [EBP+8],0  ;Bufferlen
  2051.          JE !ebw
  2052.          MOV EDI,[EBP+16]  ;VAR f
  2053.          PUSHL OFFSET(_BlockWriteResult)    ;result
  2054.          MOV EAX,[EBP+8]  ;BufferLen
  2055.          MOV EBX,[EDI+4]   ;RecSize
  2056.          MUL EBX
  2057.          PUSH EAX
  2058.          PUSHL [EBP+12]    ;Buffer
  2059.          PUSHL [EDI+0]     ;Handle
  2060.          MOV AL,4
  2061.          CALLDLL DosCalls,282 ;DosWrite
  2062.          ADD ESP,16
  2063.          MOV _IoResult,EAX
  2064. !ebw:
  2065.          LEAVE
  2066.          RETN32 12
  2067.      END;
  2068. END;
  2069.  
  2070. PROCEDURE BlockRead(VAR f:file;var Buf;Count:LongWord);ASM;
  2071. BEGIN
  2072.      ASM
  2073.          PUSH EBP
  2074.          MOV EBP,ESP
  2075.          CMPD [EBP+8],0  ;Bufferlen
  2076.          JE !ebr
  2077.          MOV EDI,[EBP+16]  ;VAR f
  2078.          PUSHL OFFSET(_BlockreadResult)  ;result
  2079.          MOV EAX,[EBP+8]  ;BufferLen
  2080.          MOV EBX,[EDI+4]   ;RecSize
  2081.          MUL EBX
  2082.          PUSH EAX
  2083.          PUSHL [EBP+12] ;Buffer
  2084.          PUSHL [EDI+0]  ;Handle
  2085.          MOV AL,4
  2086.          CALLDLL DosCalls,281 ;DosRead
  2087.          ADD ESP,16
  2088.          MOV _IoResult,EAX
  2089. !ebr:
  2090.          LEAVE
  2091.          RETN32 12
  2092.      END;
  2093. END;
  2094.  
  2095. PROCEDURE Rename(VAR f:file;NewName:String);
  2096. BEGIN
  2097.      ASM
  2098.         LEA EAX,$NewName
  2099.         INC EAX
  2100.         PUSH EAX
  2101.         MOV ESI,$f
  2102.         LEA EAX,[ESI+8]   ;old filename
  2103.         PUSH EAX
  2104.         MOV AL,2
  2105.         CALLDLL DosCalls,271  ;DosMove
  2106.         ADD ESP,8
  2107.         MOV _Ioresult,EAX
  2108.      END;
  2109. END;
  2110.  
  2111. PROCEDURE CLOSE(VAR f:file);ASM;
  2112. BEGIN
  2113.      ASM
  2114.         PUSH EBP
  2115.         MOV EBP,ESP
  2116.         MOV EDI,[EBP+8]
  2117.         CMPD [EDI+0],0  ;Get file Handle
  2118.         JNE !nce
  2119.         MOVD _IoResult,6 ;Invalid Handle
  2120.         JMP !edc
  2121. !nce:
  2122.         PUSHL [EDI+0]  ;Handle
  2123.         MOV AL,1
  2124.         CALLDLL DosCalls,257  ;DosClose
  2125.         ADD ESP,4
  2126.         CMPD _IoResult,0
  2127.         JNE !edc
  2128.         MOV EDI,[EBP+8]
  2129.         MOVD [EDI+92],0  ;Mark file as closed
  2130. !edc:
  2131.         LEAVE
  2132.         RETN32 4
  2133.       END;
  2134. END;
  2135.  
  2136.  
  2137. PROCEDURE ASSIGN(VAR f:file;s:String);ASM;
  2138. BEGIN
  2139.      ASM
  2140.        PUSH EBP
  2141.        MOV EBP,ESP
  2142.        MOV EDI,[EBP+12]  ;File variable
  2143.        MOV AL,0
  2144.        MOV ECX,100       ;Length of file structure
  2145.        REP
  2146.        STOSB
  2147.        MOV EDI,[EBP+12]  ;File variable
  2148.  
  2149.        MOV ESI,[EBP+8]   ;String
  2150.        MOV CL,[ESI+0]    ;Length
  2151.        INC ESI
  2152.        CMP CL,79
  2153.        JBE L_1
  2154. L_2:
  2155.        MOV CL,79
  2156.        JMP L_3
  2157. L_1:
  2158.        CMP CL,0
  2159.        JE L_2__1    ;Skip empty file name
  2160. L_3:
  2161.        MOVZX ECX,CL
  2162.        ADD EDI,8    ;Set on filename
  2163.        CLD
  2164.        REP
  2165.        MOVSB
  2166. L_2__1:
  2167.        LEAVE
  2168.        RETN32 8
  2169.    END;
  2170. END;
  2171.  
  2172. ASSEMBLER
  2173.  
  2174. !TextRead PROC NEAR32  ;[EBP+12]-->FileVar  Result to !TempString
  2175.                        ;[EBP+8]-->BufferString
  2176.           PUSH EBP
  2177.           MOV EBP,ESP
  2178.           SUB ESP,4    ;for old file position
  2179.           PUSHA        ;PUSHAD
  2180.  
  2181.           PUSHL [EBP+12]    ;FileVar
  2182.           CALLN32 _Filepos
  2183.           MOV EBX,_IoResult
  2184.           CMP EBX,0
  2185.           JNE !end_read
  2186.  
  2187.           MOV [EBP-4],EAX   ;Save file position
  2188.  
  2189.           PUSHL [EBP+12]    ;Filevar
  2190.           MOV EDX,[EBP+8]   ;Buffer
  2191.           INC EDX
  2192.           PUSH EDX
  2193.           PUSHL 255         ;Length
  2194.           CALLN32 _BlockRead
  2195.           CMPD _IoResult,0
  2196.           JNE L_14x
  2197.  
  2198.           MOV EAX,_BlockReadresult    ;Result
  2199.           MOV ESI,[EBP+8]
  2200.           MOV [ESI+0],AL   ;Bytes read
  2201.           JMP L_16x
  2202. L_14x:
  2203. L_12x:
  2204.           MOV ESI,[EBP+8]
  2205.           MOVB [ESI+0],0   ;No records transmitted
  2206. L_16x:
  2207.           MOV EAX,_IoResult
  2208.           CMPW EAX,0
  2209.           JNE !end_read
  2210.           XOR CX,CX
  2211.           MOV ESI,[EBP+8]
  2212.           CLD
  2213.           LODSB
  2214.           CMP AL,0
  2215.           JE !end_read
  2216.           XOR AH,AH
  2217.           MOV DX,AX     ;old len
  2218. !lox1:
  2219.           LODSB
  2220.           INC CX
  2221.           CMP AL,13
  2222.           JE !end_lox
  2223.           CMP AL,10
  2224.           JE !end_lox
  2225.           CMP CX,DX       ;greater then bytes read ?
  2226.           JAE !end_read
  2227.           CMP CX,255
  2228.           JB !lox1
  2229.           JMP !end_read   ;NO CR found
  2230. !end_lox:
  2231.           MOV AX,CX
  2232.           DEC AX
  2233.           PUSH EDI
  2234.           MOV EDI,[EBP+8]
  2235.           MOV [EDI+0],AL  ;Set new length
  2236.           CMPB [EDI+1],13
  2237.           jne !ner
  2238.           MOVB [EDI+0],0
  2239. !ner:
  2240.           POP EDI
  2241.           LODSB
  2242.           CMP AL,10
  2243.           JNE !no_i
  2244.           INC CX
  2245. !no_i:
  2246.           MOV AX,CX
  2247.           MOVZX EAX,AL
  2248.           MOV EBX,[EBP-4]       ;old file-position
  2249.           ADD EBX,EAX
  2250.           MOV EAX,[EBP+12]       ;FileVar
  2251.           PUSH EAX
  2252.           PUSH EBX
  2253.           CALLN32 _Seek
  2254. !end_read:
  2255.           POPA                  ;POPAD
  2256.           LEAVE
  2257.           RETN32 4               ;Do not remove parameters !!!
  2258. !TextRead ENDP
  2259.  
  2260. !TextWrite PROC NEAR32  ;[BP+12]-->FileVar [BP+8] String to write
  2261.           PUSH EBP
  2262.           MOV EBP,ESP
  2263.  
  2264.           MOV EDI,[EBP+12]  ;Filevar
  2265.           PUSH EDI
  2266.           MOV EDI,[EBP+8]   ;String
  2267.           MOV CL,[EDI+0]
  2268.           MOVZX ECX,CL
  2269.           INC EDI
  2270.           PUSH EDI
  2271.           PUSH ECX          ;Length
  2272.           CALLN32 _BlockWrite
  2273.           CMPD _IoResult,0
  2274.           JNE !no_1
  2275.  
  2276.           MOV EDI,[EBP+12]   ;Filevar
  2277.           PUSH EDI
  2278.           MOV EDX,OFFSET(@creoln)
  2279.           PUSH EDX
  2280.           PUSHL 2            ;length
  2281.           CALLN32 _BlockWrite
  2282. !no_1:
  2283.           LEAVE
  2284.           RETN32 4    ;Do not remove FileVar parameter !!!
  2285. @creoln db 13,10
  2286. !TextWrite ENDP
  2287.  
  2288. END;
  2289.  
  2290. FUNCTION Eof(var f:file):Boolean;ASM;
  2291. BEGIN
  2292.      ASM
  2293.         PUSH EBP
  2294.         MOV EBP,ESP
  2295.  
  2296.         MOV EDI,[EBP+8] ;var f
  2297.         CMPD [EDI+0],0  ;FileHandle
  2298.         JE L_21
  2299.  
  2300.         PUSHL [EBP+8]  ;var f
  2301.         CALLN32 _Filepos
  2302.         PUSH EAX       ;Save current position
  2303.  
  2304.         PUSHL [EBP+8]  ;var f
  2305.         CALLN32 _FileSize
  2306.  
  2307.         POP EBX        ;Get current position
  2308.         CMP EBX,EAX
  2309.         JB L_22
  2310.         MOV AL,1       ;its EOF
  2311.         LEAVE
  2312.         RETN32 4
  2313. L_22:
  2314.         XOR AL,AL      ;its not EOF
  2315.         LEAVE
  2316.         RETN32 4
  2317. L_21:
  2318.         MOVD _IoResult,6  ;Invalid handle
  2319.         XOR EAX,EAX
  2320.         JMP L_22
  2321.       END;
  2322. END;
  2323.  
  2324.  
  2325.  
  2326.  
  2327. {*************************************************************************
  2328. *                                                                        *
  2329. *                                                                        *
  2330. *          Procedures and functions for outputting text in a PM Screen   *
  2331. *                                                                        *
  2332. **************************************************************************}
  2333.  
  2334. PROCEDURE CreateLogFont(_HPS:LONGWORD;VAR facename:STRING;hei,len:LONGWORD);
  2335. VAR fa:FATTRS;
  2336. BEGIN
  2337.      move(facename[1],fa.szFaceName,length(facename)+1);
  2338.      fa.usRecordLength:=sizeof(FATTRS);
  2339.      fa.fsSelection:=0;
  2340.      fa.lMatch:=1;
  2341.      fa.idRegistry:=0;
  2342.      fa.usCodePage:=0; {default}
  2343.      fa.lMaxbaseLineExt:=hei;
  2344.      fa.lAveCharWidth:=len;
  2345.      fa.fsType:=0;
  2346.      fa.fsFontUse:=0;
  2347.      ASM
  2348.         LEA EAX,$fa
  2349.         PUSH EAX
  2350.         PUSHL 1   ;Font ID
  2351.         PUSHL 0
  2352.         PUSHL $_hps
  2353.         MOV AL,4
  2354.         CALLDLL PMGPI,368    ;GpiCreateLogFont
  2355.         ADD ESP,16
  2356.  
  2357.         PUSHL 1   ;Font ID
  2358.         PUSHL $_hps
  2359.         MOV AL,2
  2360.         CALLDLL PMGPI,513   ;GpiSetCharSet
  2361.         ADD ESP,8
  2362.      END;
  2363. END;
  2364.  
  2365. PROCEDURE InvalidatePMCrtWindow;
  2366. VAR rc:RECTL;
  2367. BEGIN
  2368.      ASM
  2369.         LEA EAX,$rc
  2370.         PUSH EAX
  2371.         PUSHL _PMCrtWindow
  2372.         MOV AL,2
  2373.         CALLDLL PMWIN,840  ;WinQueryWindowRect
  2374.         ADD ESP,8
  2375.  
  2376.         PUSHL 0
  2377.         LEA EAX,$rc
  2378.         PUSH EAX
  2379.         PUSHL _PMCrtWindow
  2380.         MOV AL,3
  2381.         CALLDLL PMWIN,765   ;WinInvalidateRect
  2382.         ADD ESP,12
  2383.      END;
  2384. END;
  2385.  
  2386.  
  2387. PROCEDURE PMCrtScrollDown;
  2388. BEGIN
  2389.      ASM
  2390.         MOV EDI,_PMScrBuf
  2391.         MOV ESI,EDI
  2392.         ADD ESI,256
  2393.         MOV ECX,1920   ;30 Lines a 256 chars=7680 (DIV 4 --> MOVSD)
  2394.         CLD
  2395.         REP
  2396.         MOVSW          ;MOVSD
  2397.      END;
  2398.      Dec(DrawLocY);
  2399.      PmScrBuf^[DrawLocY]:='';
  2400.      {prepare whole window for repaint}
  2401.      MaxDrawStarty:=0;
  2402.      MaxDrawLeny:=MaxLines;
  2403. END;
  2404.  
  2405. PROCEDURE PMCrtRedraw(_hps:HPS);
  2406. VAR pt:pointl;
  2407.     rec:RECTL;
  2408.     Adresse:LONGWORD;
  2409.     t:Word;
  2410.     Metrics:FontMetrics;
  2411.     YAddFont:LONGWORD;
  2412.     Size:LONGWORD;
  2413.     cusizex,cusizey,cux,cuy:LONGWORD;
  2414.     facename:string;
  2415. BEGIN
  2416.      Size:=sizeof(FontMetrics);
  2417.      facename:='System VIO';
  2418.      CreateLogFont(_hps,facename,16,8);
  2419.      ASM
  2420.         LEA EAX,$Metrics
  2421.         PUSH EAX
  2422.         PUSHL $Size
  2423.         PUSHL $_hps
  2424.         MOV AL,3
  2425.         CALLDLL PMGPI,453  ;QueryFontMetrics
  2426.         ADD ESP,12
  2427.  
  2428.         LEA EAX,$rec
  2429.         PUSH EAX
  2430.         PUSHL _PMCrtWindow
  2431.         MOV AL,2
  2432.         CALLDLL PMWIN,840  ;WinQueryWindowRect
  2433.         ADD ESP,8
  2434.      END;
  2435.      YAddFont:=Metrics.lMaxAscender+Metrics.lMaxDescender;
  2436.      cusizex:=Metrics.lAveCharWidth;
  2437.      cusizey:=2;
  2438.      cux:=2+DrawLocx*cusizex;
  2439.      cuy:=rec.yTop-(DrawLocy+1)*YAddFont;
  2440.      ASM
  2441.         ;Set window cursor
  2442.         PUSHL 0      ;whole window
  2443.         PUSHL 8004h  ;CURSOR_SETPOS
  2444.         PUSHL $cusizey
  2445.         PUSHL $cusizex
  2446.         PUSHL $cuy
  2447.         PUSHL $cux
  2448.         PUSHL _PMCrtWindow
  2449.         MOV AL,7
  2450.         CALLDLL PMWIN,715  ;WinCreateCursor
  2451.         ADD ESP,28
  2452.  
  2453.         PUSHL _CursorVisible
  2454.         PUSHL _PMCrtWindow
  2455.         MOV AL,2
  2456.         CALLDLL PMWIN,880     ;WinShowCursor
  2457.         ADD ESP,8
  2458.  
  2459.         PUSHL _TextCol        ;TextColor
  2460.         PUSHL $_hps
  2461.         MOV AL,2
  2462.         CALLDLL PMGPI,517    ;GpiSetColor
  2463.         ADD ESP,8
  2464.  
  2465.         PUSHL _TextBackCol   ;Text BackGround
  2466.         PUSHL $_hps
  2467.         MOV AL,2
  2468.         CALLDLL PMGPI,504    ;GpiSetBackColor
  2469.         ADD ESP,8
  2470.  
  2471.         PUSHL 2      ;BM_OVERPAINT
  2472.         PUSHL $_hps
  2473.         MOV AL,2
  2474.         CALLDLL PMGPI,505    ;GpiSetBackMix
  2475.         ADD ESP,8
  2476.  
  2477.         MOV EAX,_MaxDrawStarty
  2478.         MOV EBX,256
  2479.         MUL EBX
  2480.         MOV EBX,_PmScrBuf
  2481.         ADD EAX,EBX
  2482.         MOV $Adresse,EAX
  2483.     END;
  2484.  
  2485.     pt.x:=2;
  2486.     pt.y:=rec.yTop-(MaxDrawStarty+1)*yAddFont;
  2487.     t:=0;
  2488.     IF MaxDrawLeny<>MaxLines THEN
  2489.     BEGIN
  2490.          rec.yTop:=pt.y;
  2491.          rec.yBottom:=rec.yTop-(MaxDrawLeny+1)*yAddFont;
  2492.          IF MaxDrawLeny=0 THEN rec.xleft:=rec.xleft+DrawLocX*cusizex; {1 Zeile}
  2493.     END;
  2494.     ASM
  2495.        PUSHL _TextBackCol
  2496.        LEA EAX,$rec
  2497.        PUSH EAX
  2498.        PUSHL $_hps
  2499.        MOV AL,3
  2500.        CALLDLL PMWIN,743  ;WinFillRect
  2501.        ADD ESP,12
  2502.     END;
  2503.     WHILE pt.y>=rec.yBottom DO
  2504.     BEGIN
  2505.          ASM
  2506.             MOV ESI,$Adresse
  2507.             MOV AL,[ESI+0]
  2508.             CMP AL,0
  2509.             JE !no_draw
  2510.             INC ESI
  2511.             PUSH ESI
  2512.             MOVZX EAX,AL
  2513.             PUSH EAX
  2514.  
  2515.             LEA EAX,$pt
  2516.             PUSH EAX
  2517.             PUSHL $_hps
  2518.             MOV AL,4
  2519.             CALLDLL PMGPI,359   ;GpiCharStringAt
  2520.             ADD ESP,16
  2521. !no_draw:
  2522.          END;
  2523.          Inc(Adresse,256);
  2524.          dec(pt.y,yAddFont);
  2525.          inc(t);
  2526.          IF t>MaxDrawLeny THEN exit;
  2527.     END;
  2528. END;
  2529.  
  2530. FUNCTION PMCrtHandleEvent(Win:LONGWORD;Msg:LONGWORD;para1,para2:POINTER;
  2531.                           VAR Handled:BOOLEAN):LONGWORD;
  2532. VAR
  2533.     H:Boolean;
  2534.     _hps:LONGWORD;
  2535.     r:LONGWORD;
  2536.     command:WORD;
  2537.     rc:RECTL;
  2538. BEGIN
  2539.       r:=0;
  2540.       H:=TRUE;
  2541.       CASE Msg OF
  2542.           WM_QUIT:
  2543.           BEGIN
  2544.                IF PMCrtWindow<>0 THEN
  2545.                BEGIN {Destroy Crt Window}
  2546.                     ASM
  2547.                        PUSHL 5 ;QW_PARENT
  2548.                        PUSHL $Win
  2549.                        MOV AL,2
  2550.                        CALLDLL PMWIN,834  ;WinQueryWindow
  2551.                        ADD ESP,8
  2552.                        PUSH EAX
  2553.                        MOV AL,1
  2554.                        CALLDLL PMWIN,728  ;WinDestroyWindow
  2555.                        ADD ESP,4
  2556.                     END;
  2557.                     PMCrtWindow:=0;
  2558.                END;
  2559.                IF not Handled THEN H:=FALSE;
  2560.           END;
  2561.           WM_SETFOCUS:  {EingabeFocus neu setzen}
  2562.           BEGIN
  2563.                ASM
  2564.                   MOV EAX,[EBP+12]  ;para2
  2565.                   CMP EAX,0
  2566.                   JE !dc      ;Window is loosing focus
  2567.  
  2568.                   ;Window becomes focus --> Create the cursor
  2569.                   PUSHL 0  ;whole window
  2570.                   PUSHL 4  ;CURSOR_SOLID | CURSOR_FLASH
  2571.                   PUSHL 2
  2572.                   PUSHL 8
  2573.                   PUSHL 40
  2574.                   PUSHL 40
  2575.                   PUSHL _PMCrtWindow
  2576.                   MOV AL,7
  2577.                   CALLDLL PMWIN,715  ;WinCreateCursor
  2578.                   ADD ESP,28
  2579.  
  2580.                   PUSHL 1            ;Show the cursor
  2581.                   PUSHL _PMCrtWindow
  2582.                   MOV AL,2
  2583.                   CALLDLL PMWIN,880  ;WinShowCursor
  2584.                   ADD ESP,4
  2585.  
  2586.                   CALLN32 _InvalidatePMCrtWindow
  2587.  
  2588.                   JMP !ccde
  2589. !dc:
  2590.                   ;Window is loosing focus --> Destroy the cursor
  2591.                   PUSHL _PMCrtWindow
  2592.                   MOV AL,1
  2593.                   CALLDLL PMWIN,725  ;WinDestroyCursor
  2594.                   ADD ESP,4
  2595. !ccde:
  2596.                END;
  2597.           END;
  2598.           WM_CHAR:
  2599.           BEGIN
  2600.               if CrtKeyCount < 33 then
  2601.               begin
  2602.                    ASM
  2603.                       MOV AX,[EBP+16]    ;para1
  2604.                       AND AX,41h         ;KC_Char valid and KC_KEYUP
  2605.                       CMP AX,1
  2606.                       JNE !no_char
  2607.                       MOV AX,[EBP+12] ;para2
  2608.                       LEA EDI,_KeyBuffer
  2609.                       MOV BL,_CrtKeyCount
  2610.                       MOVZX EBX,BL
  2611.                       ADD EDI,EBX
  2612.                       INCB _CrtKeyCount
  2613.                       MOV [EDI+0],AL
  2614. !no_char:
  2615.                    END;
  2616.               end;
  2617.           END;
  2618.           WM_CLOSE:
  2619.           BEGIN
  2620.                PmCrtWindow:=0;
  2621.                IF not AlternateExit THEN {send WM_QUIT}
  2622.                BEGIN
  2623.                     ASM
  2624.                        PUSHL 0
  2625.                        PUSHL 0
  2626.                        PUSHL 2ah  ;WM_QUIT
  2627.                        PUSHL $win
  2628.                        MOV AL,4
  2629.                        CALLDLL PMWIN,919  ;WinPostMsg
  2630.                        ADD ESP,16
  2631.                     END;
  2632.                END
  2633.                ELSE {only destroy window}
  2634.                BEGIN
  2635.                     ASM
  2636.                        PUSHL 5 ;QW_PARENT
  2637.                        PUSHL $Win
  2638.                        MOV AL,2
  2639.                        CALLDLL PMWIN,834  ;WinQueryWindow
  2640.                        ADD ESP,8
  2641.                        PUSH EAX
  2642.                        MOV AL,1
  2643.                        CALLDLL PMWIN,728  ;WinDestroyWindow
  2644.                        ADD ESP,4
  2645.                     END;
  2646.                END;
  2647.           END;
  2648.           WM_PAINT:
  2649.           BEGIN
  2650.                MaxDrawStarty:=0;
  2651.                MaxDrawLeny:=MaxLines;
  2652.                ASM
  2653.                   LEA EAX,$rc
  2654.                   PUSH EAX
  2655.                   PUSHL 0
  2656.                   PUSHL $Win
  2657.                   MOV AL,3
  2658.                   CALLDLL PMWIN,703  ;WinbeginPaint
  2659.                   ADD ESP,12
  2660.                   MOV $_hps,EAX
  2661.                END;
  2662.                PMCrtRedraw(_hps);
  2663.                ASM
  2664.                   PUSHL $_hps
  2665.                   MOV AL,1
  2666.                   CALLDLL PMWIN,738  ;WinendPaint
  2667.                   ADD ESP,4
  2668.                END;
  2669.           END;
  2670.           WM_ERASEBACKGROUND:r:=1;
  2671.           ELSE IF not Handled THEN H:=FALSE;
  2672.       END;
  2673.       Handled:=H;
  2674.       PMCrtHandleEvent:=r;
  2675. END;
  2676.  
  2677. FUNCTION PMCrtHandler(para2,para1:POINTER;Msg,Win:LONGWORD):LONGWORD;ASM;
  2678. BEGIN
  2679.      ASM
  2680.         PUSH EBP
  2681.         MOV EBP,ESP
  2682.         SUB ESP,2
  2683.         MOVW [EBP-2],0   ;Not Handled
  2684.  
  2685.         PUSHL $Win
  2686.         PUSHL $Msg
  2687.         PUSHL $para1
  2688.         PUSHL $para2
  2689.         LEA EAX,[EBP-2]
  2690.         PUSH EAX
  2691.         CALLN32 _PMCrtHandleEvent
  2692.         MOV BL,[EBP-2]
  2693.         CMP BL,0
  2694.         JNE !hh
  2695.         ;not handled
  2696.         ;Default Window handler
  2697.         PUSHL $para2
  2698.         PUSHL $para1
  2699.         PUSHL $msg
  2700.         PUSHL $win
  2701.         MOV AL,4
  2702.         CALLDLL PMWin,911   ;WinDefWindowProc
  2703.         ADD ESP,16
  2704. !hh:
  2705.         LEAVE
  2706.         RETN32
  2707.     END;
  2708. END;
  2709.  
  2710. PROCEDURE DrawPMCrtWindow;
  2711. BEGIN
  2712.      ASM
  2713.          PUSHL _PMCrtWindow
  2714.          MOV AL,1
  2715.          CALLDLL PMWIN,757   ;WinGetPS
  2716.          ADD ESP,4
  2717.  
  2718.          PUSH EAX            ;For WinReleasePS
  2719.  
  2720.          PUSH EAX
  2721.          CALLN32 _PMCrtRedraw
  2722.  
  2723.          MOV AL,1
  2724.          CALLDLL PMWIN,848   ;WinReleasePS
  2725.          ADD ESP,4
  2726.      END;
  2727. END;
  2728.  
  2729.  
  2730. PROCEDURE CreatePMCrtWindow; {Generate a window}
  2731. VAR fr:LONGWORD;
  2732.     t:Byte;
  2733. BEGIN
  2734.      IF PMCrtWindow=0 THEN
  2735.      BEGIN
  2736.          MaxLines:=29;
  2737.          TextCol:=7;     {CLR_NEUTRAL}
  2738.          TextBackCol:=0; {CLR_BACKGROUND}
  2739.          New(PMScrBuf);
  2740.          {prepare whole window for repaint}
  2741.          MaxDrawStarty:=0;
  2742.          MaxDrawLeny:=MaxLines;
  2743.          ASM
  2744.             MOV ECX,_MaxLines
  2745.             MOV AL,0
  2746. !cloop:
  2747.             MOV EDI,_PMScrBuf
  2748.             MOV [EDI+0],AL
  2749.             ADD EDI,256
  2750.             LOOP !cloop
  2751.          END;
  2752.          DrawLocX:=0;
  2753.          DrawLocY:=0;
  2754.          ASM
  2755.             PUSHL 0
  2756.             PUSHL 4  ;CS_SizeRedraw
  2757.             MOV EAX,*_PMCrtHandler
  2758.             PUSH EAX
  2759.             PUSHL OFFSET(@CrtWinName)
  2760.             PUSHL _AppHandle
  2761.             MOV AL,5
  2762.             CALLDLL PMWIN,926  ;WinregisterClass
  2763.             ADD ESP,20
  2764.  
  2765.             PUSHL OFFSET(_PmCrtWindow)
  2766.             PUSHL 0
  2767.             PUSHL 0
  2768.             PUSHL 0
  2769.             MOV EAX,OFFSET(_PMCrtTitle)
  2770.             INC EAX
  2771.             PUSH EAX
  2772.             PUSHL OFFSET(@CrtWinName)
  2773.             MOVD $fr,0c3bh
  2774.             LEA EAX,$fr
  2775.             PUSH EAX
  2776.             PUSHL 0
  2777.             PUSHL 1  ;HWND_DESKTOP
  2778.             MOV AL,9
  2779.             CALLDLL PMWIN,908   ;WinCreateStdWindow
  2780.             ADD ESP,36
  2781.             MOV _PMCrtFrameHandle,EAX
  2782.  
  2783.             PUSHL 8bh
  2784.             PUSHL 350
  2785.             PUSHL 500
  2786.             PUSHL 100
  2787.             PUSHL 50
  2788.             PUSHL 3   ;HWND_TOP
  2789.             PUSHL _PMCrtFrameHandle
  2790.             MOV AL,7
  2791.             CALLDLL PMWIN,875   ;WinsetWindowPos
  2792.             ADD ESP,28
  2793.             LEAVE
  2794.             RETN32
  2795. @CrtWinName db 'PMCRTWIN',0
  2796.        END;
  2797.      END;
  2798. END;
  2799.  
  2800.  
  2801.  
  2802. PROCEDURE GOTOXY(x,y:LONGWORD);
  2803. BEGIN
  2804.      CreatePMCrtWindow;
  2805.      IF x>0 THEN dec(x);
  2806.      IF y>0 THEN dec(y);
  2807.      IF x>250 THEN x:=250;
  2808.      IF y>MaxLines-1 THEN y:=MaxLines-1;
  2809.      DrawLocX:=x;
  2810.      DrawLocY:=y;
  2811.      MaxDrawStarty:=DrawLocy;
  2812.      MaxDrawLeny:=0;
  2813.      DrawPMCrtWindow;
  2814. END;
  2815.  
  2816. PROCEDURE HideCursor;
  2817. BEGIN
  2818.      CreatePMCrtWindow;
  2819.      Cursorvisible:=0;
  2820.      MaxDrawStarty:=DrawLocy;
  2821.      MaxDrawLeny:=0;
  2822.      DrawPMCrtWindow;
  2823. END;
  2824.  
  2825. PROCEDURE ShowCursor;
  2826. BEGIN
  2827.      CreatePMCrtWindow;
  2828.      Cursorvisible:=1;
  2829.      MaxDrawStarty:=DrawLocy;
  2830.      MaxDrawLeny:=0;
  2831.      DrawPMCrtWindow;
  2832. END;
  2833.  
  2834. PROCEDURE ClrScr;
  2835. BEGIN
  2836.      CreatePMCrtWindow;
  2837.      DrawLocx:=0;
  2838.      DrawLocY:=0;
  2839.      ASM
  2840.         MOV ECX,_MaxLines
  2841.         MOV AL,0
  2842. !cloop_1:
  2843.         MOV EDI,_PMScrBuf
  2844.         MOV [EDI+0],AL
  2845.         ADD EDI,256
  2846.         LOOP !cloop_1
  2847.      END;
  2848.      {prepare whole window for repaint}
  2849.      MaxDrawStarty:=0;
  2850.      MaxDrawLeny:=MaxLines;
  2851.      DrawPMCrtWindow;
  2852. END;
  2853.  
  2854. ASSEMBLER
  2855.  
  2856. !CharOut PROC NEAR32  ;Char in AL
  2857.              PUSH AX  ;Save char
  2858.              CALLN32 _CreatePMCrtWindow
  2859.              MOV EDI,_PMScrBuf
  2860.              MOV EAX,_DrawLocY
  2861.              SHL EAX,8  ;*256
  2862.              ADD EDI,EAX
  2863.  
  2864.              MOV EBX,_DrawLocX
  2865.              CMP EBX,255
  2866.              JAE !exco    ;Skip
  2867. !next_c:
  2868.              MOV AL,[EDI+0]
  2869.              MOVZX EAX,AL
  2870.              CMP EAX,255
  2871.              JAE !exco    ;Skip
  2872.              CMP EAX,EBX        ;until positions ok
  2873.              JA !go
  2874.              MOV ESI,EDI
  2875.              ADD ESI,EAX
  2876.              INC ESI
  2877.              MOVB [ESI+0],32    ;Fill with space
  2878.              INCB [EDI+0]
  2879.              JMP !next_c
  2880. !go:
  2881.              CMP EAX,EBX
  2882.              JA !ninc
  2883.              INCB [EDI+0]
  2884. !ninc:
  2885.              POP AX             ;Get char
  2886.              INC EBX
  2887.              ADD EDI,EBX
  2888.              MOV [EDI+0],AL
  2889.              INCD _DrawLocX
  2890. !exco:
  2891.              RETN32
  2892. !CharOut ENDP
  2893.  
  2894.  
  2895. !WriteWord PROC NEAR32       ;(AX:word)           gibt 16 bit Zahl in AX aus
  2896.           MOV BX,10
  2897.           XOR ECX,ECX
  2898. L1:       XOR DX,DX
  2899.           DIV BX
  2900.           PUSH DX
  2901.           INC ECX
  2902.           OR AX,AX
  2903.           JNE L1
  2904. L2:       POP AX
  2905.           ADD AL,'0'
  2906.           PUSH ECX
  2907.           CALLN32 !CharOut
  2908.           POP ECX
  2909.           LOOP L2
  2910.           RETN32     ;keine Parameter
  2911. !WriteWord ENDP
  2912.  
  2913. !WriteInt PROC NEAR32       ;(AX:word) gibt 16 bit Zahl in AX aus mit Vorzeichen
  2914.           CMP AX,0
  2915.           JNS !novorz
  2916.           PUSH AX
  2917.           MOV AL,'-'
  2918.           CALLN32 !CharOut
  2919.           POP AX
  2920.           NEG AX
  2921. !novorz:
  2922.           CALLN32 !WriteWord
  2923.           RETN32     ;keine Parameter
  2924. !WriteInt ENDP
  2925.  
  2926.  
  2927. !WriteLongWord PROC NEAR32       ;(EAX:word)    gibt 32 bit Zahl in EAX aus
  2928.              MOV EBX,10
  2929.              MOV BX,10
  2930.              XOR ECX,ECX
  2931. L46:         XOR EDX,EDX
  2932.              DIV EBX
  2933.              PUSH DX
  2934.              INC ECX
  2935.              OR EAX,EAX
  2936.              JNE L46
  2937. L47:         POP AX
  2938.              ADD AL,'0'
  2939.              PUSH ECX
  2940.              CALLN32 !CharOut
  2941.              POP ECX
  2942.              LOOP L47
  2943.              RETN32   ;keine Parameter
  2944. !WriteLongWord ENDP
  2945.  
  2946. !WriteLongInt PROC NEAR32       ;(EAX:word)    gibt 32 bit Zahl in EAX aus
  2947.              CMP EAX,0
  2948.              JNS !novorz1
  2949.              PUSH EAX
  2950.              MOV AL,'-'
  2951.              CALLN32 !CharOut
  2952.              POP EAX
  2953.              NEG EAX
  2954. !novorz1:
  2955.              CALLN32 !WriteLongWord
  2956.              RETN32     ;keine Parameter
  2957. !WriteLongInt ENDP
  2958.  
  2959. !WriteEnd PROC NEAR32
  2960.                   MOV EAX,_DrawLocY
  2961.                   MOV _MaxDrawStarty,EAX
  2962.                   MOVD _MaxDrawLeny,0  ;draw 1 line
  2963.                   CALLN32 _DrawPMCrtWindow
  2964.                   RETN32
  2965. !WriteEnd ENDP
  2966.  
  2967.  
  2968.  
  2969. !WritelnEnd PROC NEAR32
  2970.                   CALLN32 _CreatePMCrtWindow;
  2971.                   MOV EAX,_DrawLocY
  2972.                   MOV _MaxDrawStarty,EAX
  2973.                   MOVD _MaxDrawLeny,0  ;draw 1 line
  2974.                   INC EAX
  2975.                   MOV _DrawLocY,EAX
  2976.                   CMP EAX,_MaxLines
  2977.                   JB !ns
  2978.                   ;Scroll the current window
  2979.                   CALLN32 _PMCrtScrollDown
  2980. !ns:
  2981.                   MOVD _DrawLocX,0
  2982.                   CALLN32 _DrawPMCrtWindow
  2983.                   RETN32
  2984. !WritelnEnd ENDP
  2985.  
  2986.  
  2987. !Writeln PROC NEAR32
  2988.             CALLN32 !WritelnEnd
  2989.             RETN32
  2990. !Writeln ENDP
  2991.  
  2992.  
  2993. !WriteStr PROC NEAR32        ;put out string
  2994.          PUSH EBP
  2995.          MOV EBP,ESP
  2996.          CALLN32 _CreatePMCrtWindow
  2997.  
  2998.          MOV EDI,_PMScrBuf
  2999.          MOV EAX,_DrawLocY
  3000.          SHL EAX,8  ;*256
  3001.          ADD EDI,EAX
  3002.  
  3003.          MOV EBX,_DrawLocX  ;is this the start of a line ?
  3004.          CMP EBX,0
  3005.          JNE !move          ;No --> special action required
  3006.  
  3007.          MOV ESI,[EBP+8]   ;TextString
  3008.          MOV AL,[ESI+0]
  3009.          MOVZX EAX,AL
  3010.          ADD _DrawLocX,EAX
  3011.          PUSH ESI
  3012.          PUSH EDI
  3013.          PUSH 255
  3014.          CALLN32 !StrCopy
  3015.          LEAVE
  3016.          RETN32 4
  3017. !move:
  3018. !next_c_1:
  3019.          MOV AL,[EDI+0]
  3020.          MOVZX EAX,AL
  3021.          CMP EAX,255
  3022.          JAE !exco_1    ;Skip
  3023.          CMP EAX,EBX        ;until positions ok
  3024.          JA !go_1
  3025.          MOV ESI,EDI
  3026.          ADD ESI,EAX
  3027.          INC ESI
  3028.          MOVB [ESI+0],32    ;Fill with space
  3029.          INCB [EDI+0]
  3030.          JMP !next_c_1
  3031. !go_1:
  3032.          MOV ESI,[EBP+8]    ;TextString
  3033.          MOV AL,[ESI+0]
  3034.          INC ESI
  3035.          MOVZX EAX,AL
  3036.          MOV BL,[EDI+0]
  3037.          MOVZX EBX,BL
  3038.  
  3039.          MOV ECX,EAX
  3040.          ADD ECX,EBX
  3041.          CMP ECX,255
  3042.          JB !aok
  3043.          ;Limit exceeeded --> Cut String
  3044.          MOV EAX,255
  3045.          SUB EAX,EBX
  3046. !aok:
  3047.          CMP EAX,0
  3048.          JE !exco_1        ;No bytes to transmit
  3049.          PUSH EAX
  3050.          MOV AL,[EDI+0]
  3051.          MOVZX EAX,AL
  3052.          MOV ECX,_DrawLocX
  3053.          SUB EAX,ECX
  3054.          POP EAX
  3055.          ADD ECX,EAX
  3056.          ADD [EDI+0],CL     ;increment textlen
  3057.          MOV EBX,_DrawLocX
  3058.          ADD _DrawLocX,EAX
  3059.          ADD EDI,EBX        ;set to location
  3060.          INC EDI
  3061.  
  3062.          MOV ECX,EAX
  3063.          CLD
  3064.          REP
  3065.          MOVSB
  3066. !exco_1:
  3067.          LEAVE
  3068.          RETN32 4
  3069. !WriteStr ENDP
  3070.  
  3071. END;
  3072.  
  3073.  
  3074.  
  3075. {*************************************************************************
  3076. *                                                                        *
  3077. *                                                                        *
  3078. *           SYSTEM initialization procedures                             *
  3079. *                                                                        *
  3080. *                                                                        *
  3081. **************************************************************************}
  3082.  
  3083.  
  3084. ASSEMBLER
  3085.  
  3086. !SystemEnd PROC NEAR32
  3087.            XOR AH,AH
  3088.            MOV _ExitCode,AX
  3089. exloop1:
  3090.            PUSHL OFFSET(@raddr1)  ;Returnadress for ExitProc
  3091.            PUSHL _ExitProc    ;ExitProc on Stack
  3092.            RETN32             ;jump into ExitProc
  3093. @raddr1
  3094.            JMP exloop1        ;until termination
  3095. !SystemEnd ENDP
  3096.  
  3097. !Halt1 PROC NEAR32
  3098.       MOV AX,_ExitCode
  3099.       PUSH AX
  3100.       CALLN32 _Halt
  3101. !Halt1 ENDP
  3102.  
  3103. !SystemInit PROC NEAR32
  3104.            ;allocate main memory (uncommitted) for suballocation
  3105.            ;via Getmem and Freemem
  3106.            MOV EAX,8192    ;Allocate 8MB private memory
  3107.            MOV EBX,1024
  3108.            MUL EBX
  3109.            MOV _HeapSize,EAX
  3110.            PUSHL 3         ;Flags PAG_READ|PAG_WRITE
  3111.            PUSH EAX        ;Length of memory
  3112.            PUSHL OFFSET(_Heaporg)
  3113.            MOV AL,3             ;3 Parameters
  3114.            CALLDLL DosCalls,299 ;DosAllocMem
  3115.            ADD ESP,12            ;Clear Stack
  3116.            CMP EAX,0
  3117.            JNE !ei
  3118.  
  3119.            ;Prepare the memory block for suballocation
  3120.            PUSHL _HeapSize      ;Size of Heap
  3121.            PUSHL 5              ;Flags DOSSUB_INIT|DOSSUB_SPARSE_OBJ
  3122.            PUSHL _Heaporg
  3123.            MOV AL,3
  3124.            CALLDLL DosCalls,344 ;DosSubSetMem
  3125.            ADD ESP,12            ;Clear Stack
  3126.            CMP EAX,0
  3127.            JNE !ei
  3128.  
  3129.            MOV EAX,_HeapOrg
  3130.            MOV _HeapPtr,EAX
  3131.            ADD EAX,_HeapSize
  3132.            MOV _HeapEnd,EAX
  3133.            MOV EAX,*!Halt1       ;Standard exit procedure
  3134.            MOV _ExitProc,EAX
  3135.            ;Create Application anchor handle
  3136.            PUSHL 0
  3137.            MOV AL,1
  3138.            CALLDLL PMWIN,763   ;WinInitialize
  3139.            ADD ESP,4
  3140.            MOV _AppHandle,EAX
  3141.            ;Create Application Message queue
  3142.            PUSHL 0
  3143.            PUSHL _AppHandle
  3144.            MOV AL,2
  3145.            CALLDLL PMWIN,716   ;WinCreateMsgQueue
  3146.            ADD ESP,8
  3147.            MOV _AppQueueHandle,EAX
  3148.  
  3149.            PUSH 0
  3150.            CALLN32 _ParamStr   ;Get name of program
  3151.  
  3152.            PUSHL OFFSET(!TempString)
  3153.            PUSHL OFFSET(_PMCRTTITLE)
  3154.            PUSH 255
  3155.            CALLN32 !StrCopy
  3156.            MOVD _TextBackCol,-2
  3157.            MOVD _SeekMode,0   ;FILE_BEGIN
  3158.            MOVD _FileMode,42h ;fmInOut
  3159.            MOVB _CrtKeyCount,0
  3160.            MOVD _CursorVisible,1  ;Cursor is visible
  3161.            RETN32
  3162. !ei:
  3163.            ;Error during initialization
  3164.            MOV AX,216
  3165.            CALLN32 _RunError
  3166. !SystemInit ENDP
  3167.  
  3168. !VmtCall PROC NEAR32  ;(object:Pointer;) numProc in AX
  3169.         PUSH EBP
  3170.         MOV EBP,ESP
  3171.         MOV EDI,[EBP+8]
  3172.         CMP EDI,0
  3173.         JNE !obj_init
  3174. !obj_error:
  3175.         ;Object not initialized or VMT damaged
  3176.         MOV AX,210
  3177.         CALLN32 _Runerror
  3178. !obj_init
  3179.         MOV EBX [EDI+0]
  3180.         CMP EBX,0
  3181.         JE !obj_error
  3182.         MOV EDI,[EDI+0]  ;get VMT pointer
  3183.         DEC AX
  3184.         SHL AX,2         ;VmtNummer*2
  3185.         MOVZX EAX,AX
  3186.         ADD EDI,EAX      ;add NumProc
  3187.         LEAVE
  3188.         db ffh,27h       ;JMP NEAR32 [EDI+0] --> in Methode springen
  3189.         RETN32
  3190. !VmtCall ENDP
  3191.  
  3192. END;
  3193.  
  3194.  
  3195. {*************************************************************************
  3196. *                                                                        *
  3197. *                                                                        *
  3198. *             KeyBoard Procedures and functions                          *
  3199. *                                                                        *
  3200. *                                                                        *
  3201. **************************************************************************}
  3202.  
  3203. FUNCTION KeyPressed: Boolean;
  3204. VAR _qmsg:QMSG;
  3205.     MsgIdent:LONGWORD;
  3206. begin
  3207.   CreatePMCrtWindow;
  3208.   ASM
  3209. !next_mess:
  3210.       CMPB _CrtKeyCount,0
  3211.       JA !exm
  3212.  
  3213.       PUSHL 0
  3214.       PUSHL 0
  3215.       PUSHL 0
  3216.       LEA EAX,$_qmsg
  3217.       PUSH EAX
  3218.       PUSHL _AppHandle
  3219.       MOV AL,5
  3220.       CALLDLL PMWIN,915  ;WinGetMsg
  3221.       ADD ESP,20
  3222.       CMP EAX,0
  3223.       JNE !exm_1
  3224.       MOVD _PMCrtWindow,0
  3225.       MOV AX,0
  3226.       CALLN32 !SystemEnd  ;WM_QUIT message detected
  3227. !exm_1:
  3228.       LEA EAX,$_qmsg
  3229.       PUSH EAX
  3230.       PUSHL _AppHandle
  3231.       MOV AL,2
  3232.       CALLDLL PMWIN,912  ;WinDispatchMsg
  3233.       ADD ESP,8
  3234. !exm:
  3235.   END;
  3236.   IF CrtKeyCount>0 THEN KeyPressed:=TRUE
  3237.   ELSE KeyPressed:=FALSE;
  3238. END;
  3239.  
  3240. FUNCTION ReadKey:Char;
  3241. var t:byte;
  3242. begin
  3243.     CreatePMCrtWindow;
  3244.     REPEAT UNTIL KeyPressed;
  3245.     ReadKey:=KeyBuffer[0];
  3246.     Dec(CrtKeyCount);
  3247.     FOR t:=0 to CrtKeyCount do KeyBuffer[t]:=Keybuffer[t+1];
  3248.     ASM
  3249.        ;Function result
  3250.        MOV AL,[EBP-2]
  3251.     END;
  3252. end;
  3253.  
  3254. ASSEMBLER
  3255.  
  3256. !ReadStr PROC NEAR32  ;read string from comsole [EBP+8] is output
  3257.                    PUSH EBP
  3258.                    MOV EBP,ESP
  3259.                    SUB ESP,2
  3260.                    CALLN32 _CreatePMCrtWindow
  3261.                    PUSHA         ;PUSHAD
  3262.                    MOV EDI,[EBP+8]
  3263.                    INC EDI       ;on first character
  3264.                    MOV ECX,0     ;Length is currently zero
  3265. _nez:
  3266.                    PUSHA
  3267.                    CALLN32 _ReadKey   ;read a character
  3268.                    CMP AL,0dh          ;is it a CR
  3269.                    JE !zcr             ;yes !
  3270.                    MOV [EBP-2],AL      ;save
  3271.                    CMP AL,8            ;is it a BS
  3272.                    JNE __!nbs
  3273.  
  3274.                    POPA
  3275.                    MOV EAX,[EBP+8]
  3276.                    CMP ECX,0
  3277.                    JE _nez             ;Backspace cannot be first char
  3278.                    DEC EDI
  3279.                    PUSHA
  3280.                    DECD _DrawLocX
  3281.                    MOV AL,32
  3282.                    CALLN32 !CharOut
  3283.                    DECD _DrawLocX
  3284.                    CALLN32 !WriteEnd
  3285.                    POPA
  3286.                    DEC ECX
  3287.                    JMP _nez
  3288. __!nbs:
  3289.                    CALLN32 !CharOut    ;and put out
  3290.                    CALLN32 !WriteEnd
  3291. _nv10:
  3292.                    POPA
  3293.                    MOV AL,[EBP-2]      ;get char
  3294.                    MOV [EDI+0],AL      ;and save
  3295.                    INC EDI
  3296.                    INC ECX             ;save length
  3297.                    CMP ECX,254         ;already 255 chars ?
  3298.                    JB _nez             ;no-->next char
  3299.                    PUSHA
  3300.  
  3301. !zcr:
  3302.                    POPA
  3303.                    MOV ESI,[EBP+8]
  3304.                    MOV [ESI+0],CL      ;save length
  3305.                    CALLN32 !WriteEnd
  3306.                    POPA
  3307.                    LEAVE
  3308.                    RETN32
  3309. !ReadStr ENDP
  3310.  
  3311. !ReadLongWord PROC NEAR32   ;(var value:word)   read word from console
  3312.          PUSH EBP
  3313.          MOV EBP,ESP
  3314.          SUB ESP,4
  3315.          CALLN32 _CreatePMCrtWindow
  3316.          PUSHL OFFSET(!TempString)
  3317.          CALLN32 !ReadStr   ;to !TempString
  3318.          MOV ESI,OFFSET(!TempString)
  3319.          MOVD [EBP-4],0     ;Word to 0
  3320.          MOV EBX,1           ;value to multiply
  3321.          MOV CL,[ESI+0]     ;get length
  3322.          MOVZX ECX,CL
  3323.          CMP CL,0           ;no input ??
  3324.          JE l4
  3325.          ADD ESI,ECX        ;onto first char
  3326. L3:
  3327.          MOV AL,[ESI+0]     ;get char
  3328.          DEC ESI
  3329.          SUB AL,48
  3330.          MOVZX EAX,AL
  3331.          MUL EBX
  3332.          ADD [EBP-4],EAX
  3333.          MOV EAX,EBX
  3334.          MOV EBX,10
  3335.          MUL EBX
  3336.          MOV EBX,EAX          ;Multiplikator
  3337.          LOOP L3
  3338. L4:
  3339.          MOV EAX,[EBP-4]
  3340.          LEAVE
  3341.          RETN32             ;no parameters
  3342. !ReadLongWord ENDP
  3343.  
  3344. END; {ASSEMBLER}
  3345.  
  3346.  
  3347. BEGIN
  3348. END.
  3349.  
  3350. ASSEMBLER
  3351. !TempChar db 0     ;Uses for !CharOut
  3352. !TempWord dw 0,0   ;Used temporary
  3353. !TempRet  dw 0,0   ;Used for Output via DosWrite as return value
  3354. !TempCR   db 13,10 ;Used by !WritelnEnd
  3355. !ErrorMsg db 'Speed-386 Runtime error     at:XXXXXXXX',13,10 ;Error Message
  3356. !TempString   db 0,ds 255,0   ; for temporary string operations
  3357. !TempString1  db 0,ds 255,0   ; for temporary string operations
  3358. !TempString2  db 0,ds 255,0   ;  ''   ''            ''
  3359. !TempString3  db 0,ds 255,0   ;  ''   ''            ''
  3360. END; {ASSEMBLER}