(C)Copyright Frederick W. Kantor 1996. All rights reserved. FWKTL(TM) Text_program Launcher for OS/2 Protected Mode Summary: FWKTL lets you use tight, .COM_like code in protected mode in OS/2: flat, 32_bit code, able to address megabytes of memory, call OS/2 APIs, and use dynamic link libraries (.DLLs). The special_format programs loaded with FWKTL can modify themselves and their program files. A "Hello, world!" program is less than 70 bytes long. FWKTL is shareware; it must be registered for commercial, school, or government use. Assemblers A386 and IBM Assembly Language Processor (ALP) are recommended. This kit contains version 1.00 of program launcher FWKTL.EXE and program trimmer FWKTRIM.EXE; two "Hello, world!" assembly_language source files for use, respectively, with assemblers A386 and ALP; two source files for a self_overwriting program; .BAT and .CMD programs to make programs for loading with FWKTL; six examples of short "Hello, world!" programs; and two examples of self_overwriting programs. See registration information in the FWKTL100.REG file. Distribution ~~~~~~~~~~~~ Except as otherwise authorized by the author, this software may be distributed only in its original Authenticity Verified Zipfile FWKTL100.ZIP: using PKUNZIP 2.04g, this test, PKUNZIP -t FWKTL100.ZIP, must show OK -AV for every file, and must end with this statement: Authentic files Verified! # OFT466 Frederick W. Kantor (founder/information mechanics) displayed flush left. WARNING: If you receive FWKTL100.ZIP without the AV stamp described above, or if it contains any file which does not show OK -AV , do not run any of the programs. Validation: FWKCS(TM) contents_signatures for all the files but this one (FWKTL100.DOC) that belong in FWKTL100.ZIP are listed near the end of this file (see "Validation signatures"); the contents_signature for this file itself is being distributed separately. Programs ~~~~~~~~ FWKTL.EXE Text_program Launcher, Version 1.00, 1996 Mar 18. (32_bit flat protected_mode assembly_language code) For help screen, do FWKTL FWKTRIM.EXE program trimmer, used in preparing programs made using IBM Assembly Language Processor (ALP) and a 32_bit linker (e.g., LINK386). For help screen, do FWKTRIM /* MK_A386.CMD general purpose utility for making .COM programs, and optional code listing, using A386; can be used to make special programs for loading with FWKTL in one step. For help screen, do MK_A386 MK_ALP.CMD general purpose utility for making special .COM programs for loading with FWKTL, in one pass; can keep or delete intermediate files and code listing; uses ALP, LINK386, and FWKTRIM. For help screen, do MK_ALP Special versions of MK_A386 and MK_ALP are provided for use just with the "Hello, world!" templates: MKHWA386.BAT make "Hello, world!" program, using assembler A386. For help screen, do MKHWA386 MK_HWALP.CMD make "Hello, world!" program, using ALP, LINK386, FWKTRIM. For help screen, do MK_HWALP examples of "Hello, world!" and self_overwriting programs are discussed in Examples, below. Background ~~~~~~~~~~ When people study a new computer language, one of the first programs is often a skeleton program that writes "Hello, world!" to the screen. In 16_bit assembly language code under DOS 3.30 or later, that only takes 24 bytes, total, including carriage_return line_feed. In protected mode, in assembly language, the overhead of using an .EXE structure typically increases that by a factor of around 20 or more. In C, a program to write "Hello, world!" to the screen may be around 15,000 bytes long -- more than 500 times as big. Even larger "Hello, world!" programs are generated by compilers for other high_level languages. During this remarkable bloating of code, sight has often been lost of one of the most subtle and powerful programming tools: the ability of a program to redesign and rewrite itself. Meanwhile, IBM's OS/2 operating system has grown so sophisticated that many services offered by an older high level language, such as C, can now be requested from the operating system directly from assembly language, using only a few bytes of code. The supported services range from basic file handling and input/output procedures, through coprocessor emulation, geometric transforms and Bezier splines, and more. Semaphores for multithread execution are directly supported by OS/2. Assembly_language programming lets you use operating_system services, without having to wait for someone else to incorporate them into a high_level language, and without having to be burdened with large lumps of unused code inflicted by coarsely grained compilers. A small program can look, speaking metaphorically, like thin layers of glue holding together the system calls, with an occasional little block of code that carries out the special function of the program -- backed by the direct power and speed of the CPU. And, writing in assembly language helps protect against conceptual "blind spots" which may be hidden in the assumptions underlying the design of a high_level language. However, the way in which "protected mode" has been implemented, has made it difficult to use self_modifying code. And, popular tools for making programs have not only added cumbersome overhead, they have seriously obstructed people from seeing that programming can be thought about from this point of view. Protected_mode programs with self modification allowed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FWKTL launches special "text" programs (as distinct from "Presentation Manager" programs) in protected mode, in such way that each program is free to modify itself and free to modify the file from which it came. This code supports the use of small, tightly written assembly_language programs, and can launch large programs. (FWKTL itself is written in flat 32_bit assembly_language) These programs have a special header and structure, discussed in more detail below (see "Program structure"). Instead of the overhead of an .EXE file, the header for each program is only 12 bytes long. An instance of FWKTL provides initialization, making available to the newly launched program information as to where the program came from; where it is loaded in memory; where to find its command tail; and where the free memory it requested, if any, begins. FWKTL provides streamlined procedures for the newly launched program to obtain addresses for operating_system services, including a handle to use for obtaining DOSCALL API addresses. This, in turn, lets the program use system calls, load and call dynamically linked libraries, load and execute programs, etc. Because of the streamlined procedures, the incremental cost in program size to selectively fetch more than one DOSCALL API address is only two bytes per DOSCALL API. A "Hello, world!" program loaded by FWKTL can be 41 bytes long, using a simple SHOW procedure in FWKTL to send an ASCIIZ string up to, but not including, its terminal 00 to 'standard output' (defaults to screen), and append a terminal carriage_return line_feed. (to save space in this short program, the exit errorlevel is not set to zero: the errorlevel returned is the low 16 bits of the DWORD for the program's entry point.) (EXAMPLE EQU 2; included as EX2_A386.COM and EX2_ALP.COM) A "Hello, world!" program which includes the example of fetching the address for the DOS32WRITE API, using it, cleaning up, and setting the exit errorlevel to zero, is 69 bytes long. (EXAMPLE EQU 1; included as EX1_A386.COM and EX1_ALP.COM) A more complex "Hello, world!" program, which fetches a list of 25 API addresses, uses two of them (DOS32BEEP and DOS32WRITE), etc, is 142 bytes long. (EXAMPLE EQU 3; included as EX3_A386.COM and EX3_ALP.COM) A self_overwiting program, which fetches and uses 3 API addresses (for DOS32OPEN, DOS32WRITE, and DOS32CLOSE), is 232 bytes long, including the internal 32_byte array in which it can save an entry from the command tail. (source files SELFWRIT.1 and SELFWRIT.ASM for use respectively with A386 and ALP; resulting programs included as EXS_A386.COM and EXS_ALP.COM) Each program is written in assembly language, in flat 32_bit protected_mode code; conditional jumps can use 32_bit relative addresses. Using FWKTL to load and run a program ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Format: FWKTL (/option) PROGRAM.EXT command tail where the only /option which can be added and still load and run a program is /c (upper or lower case), described below. For example, to load and run EX1_ALP.COM using FWKTL, do FWKTL EX1_ALP.COM To also display where the loaded program came from, and any command tail furnished to it, use /c ; for example, FWKTL /c EX1_ALP.COM this is a command tail The program origin and command tail are written on separate lines to 'standard error' (handle 2); each line ends with 0d,0a (carriage_return line_feed); this output defaults to the screen, and can be redirected using 2> . For example, to load and run EXS_ALP.COM, saving internally up to 32 bytes from the command tail, do FWKTL EXS_ALP.COM load this command tail/w To display any current non_zero contents of EXS_ALP.COM's internal storage, do FWKTL EXS_ALP.COM EXS_ALP.COM outputs via the SHOW utility provided by FWKTL, which uses the 'standard error' handle (handle 2); SHOW removes the terminal 00 from the ASCIIZ string and adds a carriage_return line_feed (0d,0a). To redirect the output from EXS_ALP to a file FOO, do FWKTL EXS_ALP.COM 2>FOO Starting FWKTL in a DOS session under OS/2: If you start FWKTL in a DOS session under OS/2, an OS/2 session is automatically opened and execution proceeds in protected mode. However, when that OS/2 session is opened, it does not automatically default to the current DOS directory: any program you have specified for loading must either have appropriate d:\path\filename.ext, or be findable on the default OS/2 PATH (specified in CONFIG.SYS) rather than on the DOS PATH. For example, if the file is in a directory (Q) not on the OS/2 PATH, located below another directory (P) which is on the OS/2 PATH, then you only need to provide enough path\ to reach down from P to Q. For example, P\asneeded\Q\filename.ext (in this case, no ' \ ' at the beginning of path\filename.ext ). Don't assume that redirection ( < or > ) specified on the DOS command line will work under these circumstances. Filenames: If you wish to, you can rename the .COM programs .EXE : in that case, these special programs, when called directly in a DOS session, will return to the command line; and when called directly in an OS/2 (Warp) session, will result in a message saying that the program cannot be run in an OS/2 session. Any allowed filename and extension can be used for a program launched with FWKTL, including HPFS long names. If a filename has a gap in it, or a leading blank space, use quotation marks around the entire name, including any blank spaces that serve as part of the filename. Version identification ~~~~~~~~~~~~~~~~~~~~~~ To identify the version of FWKTL.EXE or FWKTRIM.EXE in a .CMD program, you can use FWKTL /ver or FWKTRIM /ver to return the version number without the decimal point as the exit errorlevel, and then branch on that errorlevel. E.g., this is version 1.00, so FWKTL /ver returns an errorlevel of 100. (in an OS/2 session, an errorlevel can be 0...65535) Also, FWKTL.EXE and FWKTRIM.EXE carry internal signatures which can be read using BLDLEVEL. E.g., do BLDLEVEL FWKTL.EXE . Program structure ~~~~~~~~~~~~~~~~~ FWKTL launches special protected_mode programs, each of which starts with a 12_byte header, can end with a RET command, and has available to it specific services and initial data described below. Program header: CODESTART: ; optional reference point for describing offsets within the ; code RET ; 32_bit header identification string C3h,46h,57h,4Bh DB 'FWK' ; DD PSETUP ; bit00 = 0 for PSETUP=0 (see P_ STRUC) ; bit00 = 1 for PSETUP=1 (see P_ STRUC) ; bits 31...01 are reserved, and must be zero for use with ; FWKTL version 1.00. DD TYPE P_ ; amount of free memory requested after code; ; in these examples, just enough to hold a P_ STRUC; ; PSETUP affects the size of P_ STRUC used ; to hold standard FWKTL initialization data; ; storage of any other data there also affects the ; size of P_ STRUC; e.g., P_ can contain buffers. ; the free memory starts DWORD aligned, zeroed. ; more memory than used in P_ STRUC can be requested; ; note that memory requested in this way is committed ; when allocated. ; for efficiency and flexibility, programs which need a ; lot of memory can use API procedures to allocate and ; free memory, rather than asking for it as part of ; installation. EXAMPLE EQ 3 loads the addresses for ; calling some memory management procedures. ; Note that this kind of program can write new code into ; the memory and then run it, or can relocate or modify ; itself and continue to run. ; this is the execution entry point ;. ;. (program follows here) ;. The first byte is a "return" command: if one of these programs is accidentally started, it simply returns to the command line. That byte, together with the next three bytes, makes a 32_bit signature for identifying the program type. The second 4_byte double_word is bit flags, of which bit00 is used in this first release; bits 31...01 are reserved and must be 0. The bit00 flag tells FWKTL whether to provide addresses for two extra functions (see P_ STRUC, below). The third 4_byte double_word specifies how much extra free space is to be initially committed when the program is loaded, starting double_word aligned after the end of the program. The entry point is offset 12 bytes into the program (counting the first position as offset 0). Program EOF: When this type of program is assembled using IBM's ALP, a linker may be needed to insert relative offsets for calls to routines within the program. The resulting .EXE or .DLL file is then stripped down to make the finished program, using FWKTRIM. For this purpose, an end_of_file designator DB 'FWKEOF',0,1 is placed at the end of the source code to mark where to strip the tail. (see HELOWRLD.ASM and SELFWRIT.ASM) When Eric Isaacson's A386 is used to assemble the program, the output is the finished code; a linker is not needed, a program end_of_file designator is not used, and FWKTRIM is not needed. (see HELOWRLD.1 and SELFWRIT.1) Initialization ~~~~~~~~~~~~~~ FWKTL loads a program and sets EAX = entry point for execution EBX = 0 if no free memory requested ELSE EBX points to start of free memory, DWORD aligned, after code ECX = number of DWORDs in initial data requested (see P_ STRUC) ESI points to start of initial_data source (matching start of P_) EDI = 0 if no free memory requested ELSE EDI = EBX = start of free memory, in case you wish to put initial data there the "direction flag" (decrement flag) is cleared (CLD) FWKTL provides initial values, and several procedures; (see P_ STRUC, below, for initial values and procedure addresses) These values are easily copied, with ESI, EDI, ECX, and CLD from FWKTL. If free memory was requested (see HELOWRLD.1 and HELOWRLD.ASM), use REP MOVSD If no free memory was requested, save initial values in the STACK: e.g., SUB ESP,TYPE J_ MOV EBP,ESP MOV EDI,EBP REP MOVSD ; using ESI, ECX, and CLD from FWKTL Transfer of control ~~~~~~~~~~~~~~~~~~~ FWKTL calls the program as a routine in Thread 1: on entry, the STACK from FWKTL provides working space for 0400h (1024 decimal) dwords, not counting space allowed for system use; the STACK will not return an exception until more than 0ABAh dwords are pushed (2746 decimal) on return to FWKTL, CS, SS, and ESP must be correct when RET is executed EAX, EBX, ECX, EDX, ESI, EDI, EBP, DS, ES, FS, GS, and flags can be changed EAX is used to return an exit errorlevel, of which the low 16 bits (AX) is returned by OS/2 Warp at the command line. to display exit errorlevels, you can use PROMPT=[$p $r] STRUCture for initial data, and FWKTL services ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PSETUP is used to control P_ STRUC and to set bit00 in the second DWORD in the program header = 0 to get the shorter initial setup data; = 1 to get the longer initial setup data which has the addresses for the SHOW and USWORDCAPS utilities ;------------------------------------------------------- ; structure for initial data: P_ STRUC ; these are provided by FWKTL during initialization, ; according to file header settings: P_LOADEDAT DD ? ; start of this memory block P_PWHENCE DD ? ; points to ASCIIZ string re where program was found P_PCOMTAIL DD ? ; points to ASCIIZ command tail P_GETFN DD ? ; address for indirect call to FWKTL GETFN function: ; ; Input: ; EAX = ProcedureOrdinal ; (maximum permitted OS/2 ordinal <= 65533) ; if EAX > 0, ESI is ignored ; OR ; EAX = 0 ; ESI points to ASCIIZ procedure_name ; ; EDX = module handle ; EDI points to target DWORD to receive ; procedure address ; ; Output: ; if no error: ; zero_flag is set ; procedure address is in target DWORD ; EAX = 0 ; ; if error: ; zero_flag is cleared ; EAX contains error number: ; 6 ERROR_INVALID_HANDLE ; 123 ERROR_INVALID_NAME ; 65079 ERROR_ENTRY_IS_CALLGATE ; ; all other CPU registers and flags are preserved P_GETFNLIST DD ? ; address for indirect call to FWKTL GETFNLIST ; function, to get the addresses for a list of ; procedures in the same module: ; ; EBX, EDX, EBP are preserved across this function ; ; Input: ; EAX = 0 if list is ASCIIZ procedure_names ; 2 if list is WORD ordinals ; 4 if list is DWORD ordinals ; (maximum permitted OS/2 ordinal = 65533) ; ECX = number of items in procedure list ; EDX = module handle ; ESI points to start of list of WORDs, DWORDs, ; or series of ASCIIZ procedure_names ; EDI points to start of target DWORDs to receive ; the corresponding procedure addresses ; ; Output: ; if no error: ; zero_flag is set ; each target DWORD contains its procedure address ; ESI: ; if EAX = 0 ; ESI points to terminal 00h of last ASCIIZ ; string; ; ELSE if EAX > 0 ; ESI points to first byte after source; ; EDI points to first byte after last target DWORD ; ; if error: ; zero_flag is cleared ; EAX contains error number: ; 6 ERROR_INVALID_HANDLE ; 123 ERROR_INVALID_NAME ; 65079 ERROR_ENTRY_IS_CALLGATE ; ECX is not decremented on failed step ; ESI points to list item identifying the procedure ; for which the failure occurred P_HDOSCALLS DD ? ; handle for DOSCALLS module as loaded by FWKTL, ; can be used in EDX for P_GETFN or P_GETFNLIST. ;------------------------- end of setup for PSETUP EQ 0 IF PSETUP EQ 1 ; two additional procedures are optionally available from FWKTL: P_SHOW DD ? ; address for FWKTL SHOW function; ; ; usage: ; ; ESI points to ASCIIZ string to show on screen ; using 'standard error' handle=2; ; this procedure drops terminal 00 and adds 0D,0A; ; all CPU registers and flags are preserved. P_USWORDCAPS DD ? ; address for FWKTL capitalization function; ; ; usage: ; ; ESI points to contiguous string > ' ' to ; capitalize, US English; ; all CPU registers and flags are preserved. ; ; (e.g., this procedure can be used when '/' or '-' ; is found in command tail, for case_insensitive ; options when you don't capitalize whole tail) ENDIF ;------------------------- end of setup for PSETUP EQ 1 P_ ENDS ; end of P_ STRUC ; (for examples, see HELOWRLD.1 and HELOWRLD.ASM) Termination ~~~~~~~~~~~ The program terminates by returning to FWKTL. For example, EXIT: XOR EAX,EAX ; set exit errorlevel to 0 BADEXIT: ; jump to here if trouble, and pass errorlevel along MOV ESP,EBP IF KEEP_EBX ; optionally remove one dword from stack POP EBX ; (see HELOWRLD.1, HELOWRLD.ASM, SELFWRIT.1, SELFWRIT.ASM) ENDIF ; (IF and ENDIF shown here are in ALP format) RET ; return to FWKTL FWKTL then releases memory it allocated for the program, and exits with the errorlevel passed to it in EAX. Examples ~~~~~~~~ "Hello, world!" programs (for self_overwrite, see below): Two "Hello, world!" program templates are included: HELOWRLD.1, and HELOWRLD.ASM. In each of these templates, three different settings of EXAMPLE can be used to control what is made. For use with Eric Isaacson's A386 assembler version 0.66 or later: HELOWRLD.1 for assembly using A386 to make HELOWRLD.COM. Running in a DOS session, this command produces the finished output: A386 HELOWRLD.1 MKHWA386.BAT uses A386 to make a detailed .LST along with HELOWRLD.COM, by running this command line: A386 +P3 +G16 +S +L39 +H127 helowrld.1 For use with IBM Assembly Language Processor Version 3.00.004 or later (ALP): MK_HWALP.CMD running in an OS/2 session, this does the following in one pass: HELOWRLD.ASM is assembled using ALP to make HELOWRLD.OBJ HELOWRLD.OBJ is linked using LINK386 and HELOWRLD.DEF (included) to make HELOWRLD.DLL HELOWRLD.DLL is trimmed using FWKTRIM.EXE (included) to make output file HELOWLD2.COM Whether using A386 or ALP, first use a text editor to set the desired value for EXAMPLE in the appropriate source file, and then build the output program. Setting EXAMPLE to its three possible values in HELOWRLD.1 and HELOWRLD.ASM results in three output programs from each. For each value of EXAMPLE, the two output files have the same length whether made using HELOWRLD.1 or HELOWRLD.ASM. However, the programs made with A386 differ from the programs made using ALP in how MOV EBP,ESP and MOV ESP,EBP are coded (this is part of the assembler "footprint" system used in A386). Copies of these six output programs are included as EX1_A386.COM EX2_A386.COM EX3_A386.COM (from HELOWRLD.1), and EX1_ALP.COM EX2_ALP.COM EX3_ALP.COM (from HELOWRLD.ASM). Self_overwrite programs: For use with Eric Isaacson's A386 assembler version 0.66 or later: SELFWRIT.1 for assembly using A386 to make SELFWRIT.COM. Running in a DOS session, this command produces the finished output: A386 SELFWRIT.1 MK_A386.BAT uses A386 to make a detailed %1.LST along with %1.COM, by running this command line: A386 +P6 +G16 +S +L39 +H127 %1 Usage: MK_A386 filename.ext k where option k is to make a code .LST (the +P6 setting is to support code up to and including Intel's Pentium Pro) For use with IBM Assembly Language Processor Version 3.00.004 or later (ALP): SELFWRIT.ASM and SELFWRIT.DEF are provided. Use MK_ALP to make SELFWRIT.COM: MK_ALP.CMD running in an OS/2 session, this does the following in one pass: %1.ASM is assembled using ALP to make %1.OBJ %1.OBJ is linked using LINK386 and %1.DEF to make %1.DLL %1.DLL is trimmed using FWKTRIM.EXE (included) to make output file %1.COM Usage: MK_ALP filename (k) where option k is to keep intermediate files, code listing, .MAP, REPORT from ALP, etc Important: use only the filename, without any extension. Note that programs assembled with A386 and those assembled using ALP will normally show differences in how various instances of the MOV command are coded. This is used in A386 as a "footprint" for the assembler; it does not change the length of the program. FWKTL help screen ~~~~~~~~~~~~~~~~~ For online description from FWKTL, type FWKTL /* The resulting help screen is written to 'standard output' (handle 1), which defaults to the screen and can be redirected using > . Here is what the FWKTL help screen looks like: ------------------------------------------------------------------------------ FWKTL(TM) Text_program Launcher, Ver. 1.00. 1996 Mar 18. OS/2 protected mode. (C)Copyright Frederick W. Kantor 1996. All rights reserved. Format: FWKTL (/option) (D:\PATH\)PROGRAM.COM (command tail) Use full filename.ext, no wildcards; if gap in filename, use quotes; can use HPFS long names. Program search defaults to current directory, then PATH. PROGRAM.COM can contain self_modifying code, and can modify its own file. option: * - show this help screen; set errorlevel = 65535 decimal ("-1"). c - show where program was found; if launched, show command tail; 2 lines. ver - set exit errorlevel per version number sans ".". exit errorlevel: FWKTL: 65533 ("-3") - file not found. 65534 ("-2") - wrong program header. 65535 ("-1") - see help screen. /ver (see above). ELSE operating_system errorlevel. ELSE returns exit errorlevel per EAX from PROGRAM.COM. ------------------------------------------------------------------------------ FWKTRIM help screen ~~~~~~~~~~~~~~~~~~~ For online description from FWKTRIM, type FWKTRIM /* The resulting help screen is written to 'standard output' (handle 1), which defaults to the screen and can be redirected using > . Here is what the FWKTRIM help screen looks like: ------------------------------------------------------------------------------ FWKTRIM(TM) Text_program Trimmer. 1.00. 1996 Mar 18. OS/2 protected mode. (C)Copyright Frederick W. Kantor 1996. All rights reserved. Format: FWKTRIM (/option) < (D:\PATH\)PROGRAM.ext > PROGRAM.COM The output file, PROGRAM.COM, is for use with FWKTL(TM): PROGRAM.COM can contain self_modifying code, and can modify its own file. option: * - show this help screen; set errorlevel = 65535 decimal ("-1"). ver - set exit errorlevel per version number sans ".". exit errorlevel: 0 - no error. 65533 ("-3") - did not find tail 'FWKEOF',0,1 . 65534 ("-2") - did not find header C3h,'FWK'. 65535 ("-1") - see help screen. /ver (see above). ELSE operating_system errorlevel. ------------------------------------------------------------------------------ MK_A386 help screen ~~~~~~~~~~~~~~~~~~~ For online description from MK_A386, type MK_A386 Here is what the MK_A386 help screen looks like: ------------------------------------------------------------------------------ Part of the FWKTL(TM) Text_program Launcher kit, version 1.00. (C)Copyright Frederick W. Kantor 1996. All rights reserved. MK_A386.BAT for use with A386 version 0.66 or later. Usage: MK_A386 FILENAME.EXT (k) "" where option k makes a .LST file (see below) "Wildcards" can be used in FILENAME.EXT. Output files: FILENAME.COM for loading with FWKTL IF k option: FILENAME.LST code list, from A386 ------------------------------------------------------------------------------ MK_ALP help screen ~~~~~~~~~~~~~~~~~~ For online description from MK_ALP, type MK_ALP Here is what the MK_ALP help screen looks like: ------------------------------------------------------------------------------ Part of the FWKTL(TM) Text_program Launcher kit, version 1.00. (C)Copyright Frederick W. Kantor 1996. All rights reserved. MK_ALP.CMD for use with IBM Assembly Language Processor (ALP), Ver. 3.00.004 or later, LINK386, and FWKTRIM.EXE, version 1.00. Usage: MK_ALP FILENAME (k) "" where option k keeps the intermediate files (see below) Important: for input, use only the filename, without any file extension Input files: FILENAME.ASM, FILENAME.DEF Output files: FILENAME.COM for loading with FWKTL IF k option: FILENAME.OBJ intermediate step, made by ALP FILENAME.LST code list, from ALP REPORT describing work done by ALP FILENAME.MAP byproduct of LINK386 FILENAME.DLL intermediate step, before stripping ------------------------------------------------------------------------------ Validation signatures ~~~~~~~~~~~~~~~~~~~~~ Here are the FWKCS contents_signatures for all the other files that belong in FWKTL100.ZIP, except for this file itself (FWKTL100.DOC): 0BC2F46A 2943A66DF04CA4FFC0DDB6A26F13095F4D EX2_A386.COMaFWKTL100.ZIPv 188A6443 8EF79095357D15E6289196871479AB4D27 EX3_ALP.COM aFWKTL100.ZIPv 215CD3FE 1C3A04A70BBC36D5845E53B974B6C29FA34 FILE_ID.DIZ aFWKTL100.ZIPv 25152BCD 611CA5283222E2A61ED0F18A8D976AF3AB6 MK_HWALP.CMDaFWKTL100.ZIPv 29BB1404 710D9F651C8E70D133E144A3A3AA6AEF5D1 FWKTRIM.EXE aFWKTL100.ZIPv 416256DF 456E92D09485626ED4FFB921A6FFAC2839 EX1_A386.COMaFWKTL100.ZIPv 444EFE05 5755E15396EB8399C2FF5AC5A35EFFFC2017 HELOWRLD.1 aFWKTL100.ZIPv 514D1538 149B27F17D36FDCDDF6F390E379C34889A68 SELFWRIT.1 aFWKTL100.ZIPv 5FBA11D4 A4871A4C43EB27AB136E01D46BD84E52D17 FWKTL.EXE aFWKTL100.ZIPv 6F48EB6C 24154169BAFF2DC680CF3D9B6361A137A37 SELFWRIT.DEFaFWKTL100.ZIPv 744DEB2B 3574497B636056D21C22CDFC6737DD8C371 MK_A386.BAT aFWKTL100.ZIPv 8C221964 E88B1E6E22000866441D3766F12360D02E EXS_ALP.COM aFWKTL100.ZIPv 940034D8 45D42C7C9E7575549EFB36A11A55DAA55D EX1_ALP.COM aFWKTL100.ZIPv 97303F08 151F682B68834AFD9D98A226240875F86117 SELFWRIT.ASMaFWKTL100.ZIPv AA73C29C 6A284773C30D91D5F885F2C577BF78DB451 FWKTL100.REGaFWKTL100.ZIPv ABF25552 56E3D432C2A68EF277AE81C10B97FBDE26C2 HELOWRLD.ASMaFWKTL100.ZIPv B8B75D26 8E3D89B84B4DBB891AE69F5531AC1330D7 EX3_A386.COMaFWKTL100.ZIPv C660EF41 78E35B94C329276A1ABDCAC8A299D9A3E2D MK_ALP.CMD aFWKTL100.ZIPv D9BD3385 E81AE572DB5E6659B483BD1FBB954F0BD0 EXS_A386.COMaFWKTL100.ZIPv E4314079 2393F0279722E5D197098C24F700BB2EA0F MKHWA386.BATaFWKTL100.ZIPv F6377BB0 29AC8E3EBD479C62ABCF942C8E8882E1CF EX2_ALP.COM aFWKTL100.ZIPv FF0D623E 241822186F595575B9138BB3E7080D254EB HELOWRLD.DEFaFWKTL100.ZIPv The FWKCS contents_signature for this file itself is being distributed separately. Support ~~~~~~~ Correspondence may be sent by Internet email to fred.kantor@factory.com See registration information in FWKTL100.REG file. ----------------------------------------------------------------------- FWKCS, FWKTL, and FWKTRIM are trademarks of Frederick W. Kantor. IBM, OS/2, Warp, Presentation Manager, and IBM Assembly Language Processor (ALP) are trademarks of International Business Machines Corporation. Intel and Pentium Pro are trademarks of Intel Corporation. A386 was written by Eric Isaacson, copyrighted 1995, 1996.