PBT history This file contains information about all features in all versions of PBT released by now. If the feature described is specific to a certain command, that command name is stated at the end of the particular paragraph. By reading this file, you can get some information about PBT's functionality. However, a few items are written using some more technical terms; they are here to describe PBT's development in detail and serve to a programmer only. Don't bother if they are not comprehensive enough for you. If you insist on understanding them, please write to me and I will try to describe them in more detail to you. V2.25: - Help screen text bound to the ?M command corrected - Fixed a bug in the P command which did not allow to jump backwards if the current file offset was equal to the file size. (P) - You can now perform bitwise/arithmetical operations when reading numbers even if processing is turned off. See PP.TXT for details. (L) - PBT now clears the screen only when displaying help screens. - Fixed a bug in calculating linear addresses while moving in memory (L) - Fixed a bug which did not allow register names in positional commands written in lowercase. (L) - PBT now allows to jump to the end of the current view area by using the '=E' positional command. Also if the numeric offset passed to the '=' command is equal to the view area size, PBT accepts it now. This behavior is useful if, for example, you want to read the last record of a file. Now you can do this by moving to the end of the file and then by rewinding the file pointer to the start of the last record. - Fixed a bug in justifying signed numbers with zeros (L) - Fixed a bug in parsing commands with arithmetic operations where PBT allowed specifying both '|' and 'O' operation codes although they represent the same operation and as PBT says, multiple operations of the same type cannot appear in a single command. (L) - PBT now displays offsets preceded by a dollar sign rather than suffixed by 'H'. (T) - You can now use the equals sign in the 'I' command in front of a value to make commands more readable. (L) - PBT has a new ability to handle command-line parameters. They can be useful especially in compiled scripts. See PP.TXT for details. - Fixed a bug in trailing ':' (ELSE) clauses resulting in a wrong error message to be displayed. (L) - New error condition added when PBT finds duplicate label definition. (L) - Added the possibility of writing DOS timestamps to files (by the DOS timestamp I mean a 4-byte packed date and time format). These timestamps can be then read using the T list command. Timestamps must be entered in the form YYYYMMDDhhmmss and suffixed by the 'T' modifier to signal time. All time components must be padded to the proper number of digits and each component can be also replaced by a 'X' character which will retrieve the current value for this component from the system clock. (P) - The WRITE command by itself now writes empty string instead of nothing (PP) - The HEXDUMP script modified so that it accepts one parameter which represents the starting offset to list from. If no parameter is specified, script works the same way as before. - Help screen has also been added with a basic explanation of parameters. V2.20: - Made minor optimizations (almost all internal variables have their values embedded in three most significant bits of their command byte). This results in one byte saving per command. (e.g. the EXEHDR script is 30 bytes smaller when compiled to LCS compared to previous PBT versions) (L) - I have just read a document about the VOC sound file format and it was clear to me that reading this file by PBT would be very awkward. For this reason, I've just added the following features: þ PBT now supports 3-byte long integers in the 'L', '+' and '-' commands. Their support must be enabled by issuing the '$L3' command and disabled by the '$L4' command. In positional commands, you can then use the 'L' modifier to read the 3-byte long integer from the current view area and use it as a jump distance. þ When you now try to use the '+', '-' and '=' commands with size modifiers in the view area 1 (registers), PBT just reads the distance offset from this area but applies it to the view area used previously (i.e. file). This can be confusing when you are not used to this behavior, but you can ask yourself whether it makes sense to read the offset from registers and jump around them (they occupy just 20 bytes). This second paragraph applies to all numeric formats used by positional commands, not just to 3-byte long integers. (L) þ PBT's preprocessor now supports the LONGSIZE variable in its SET command in order to support 3-byte long integers (PP) - Fixed a bug in the I command which did not accept labels inside the command. It was due to the fact that all colons were always considered to be ELSE clause separators. Now ELSE clauses are signaled by surrounding the colon with spaces on both sides and no colon misinterpretation is possible. (L) - PBT's preprocessor has been corrected to support this change to PBT's syntactic rules (PP) - Before obtaining file size, PBT now writes changes to the file if necessary. Writing data updates the file size so PBT always gets the correct value. Without this bug fix, PBT would always return the old file size and positional commands could emit false error messages. - PBT's preprocessor now supports the $MEMORY$ virtual file (PP) - Moving around the view area 1 (registers) is now even more restricted. If you use register names in positional commands, actual movement is executed in the previously selected view area as with size modifiers (see above). You can now move around registers using constant values only. (L) - PBT now automatically converts 32-bit pointers to linear addresses if you use the '=' command with the 'L' modifier and the $MEMORY$ file is being accessed (L) - PBT and its preprocessor now support these additional bitwise/arithmetical functions in the 'B', 'W', 'L' and 'V' commands: þ OR (|, O) - bitwise OR þ XOR (^) - bitwise XOR þ NOT (~) - bitwise NOT þ ADD (+) - addition þ SUB (M) - subtraction þ MUL (*) - multiplication þ DIV (/) - division þ MOD (%) - modulo (L, PP) - While updating code to handle new bitwise/arithmetical functions, a bug concerning variable-length numbers and applying masks to them has been fixed. (L) - You can now patch files by numbers in the range 2,147,483,648 up to 4,294,967,295, allowing you to use unsigned long integers (P) - Two help screens containing additional notes were split into three screens in order to make room for new lines (L) - All *.SCP scripts now contain commands written using mixed letter case. It can help you find out what words script commands are composed of. - PBT's preprocessor's error messages have now slightly different format than PBT errors. First, "PBT error" is replaced by "PP error". Second, error codes are not preceded by letters as in PBT. (PP) - PBT now tests premature end of file when reading offsets from view areas in positional commands (L) - PBT now performs extensive checking of overflows when converting numeric constants written in your scripts to the internal numeric representation. You will be no longer allowed to write such commands as 'B256' or 'J65536,label'. (L) - PBT now supports counting loops which can read the loop count from any view area. The process of creating such loops consists of the following steps: a) read loop count from the view area using the $U command with the 'B', 'W' or 'L' modifiers b) establish a loop point by defining a label c) execute the J command with the 'C' modifier - Modified the COMPILE.BAT batch file to be able to specify additional script commands such as switches after the input file name. Also added a special warning about trying to use PBT lite. - As listings tend to be long, several scripts now pause on each screen page. - Modified script files to reflect changes in PBT - Made minor corrections to help screens - PBT's preprocessor's documentation expanded considerably. V2.15: - Fixed a bug in the '/' patch component (P) - You can now force storage size of numbers being used as a patch by suffixing them with 'W' or 'L' modifiers, i.e. 100W will be stored as word ($64 $00), whereas $400L is written as doubleword ($00 $04 $00 $00). Making numbers smaller, i.e. $12345678W is also possible, but useless. (P) - PBT's preprocessor now accepts short assembly language commands requiring no END keyword. These commands must occupy just one line, i.e.: asm Xor AX,AX ^ Mov DS,AX This is much easier to write than: asm ^ Xor AX,AX ^ Mov DS,AX ^ end (PP) - The SETALC instruction has been removed from the PBT's preprocessor. (PP) - PBT package now includes a simple game called PBT Quiz. See PQ.TXT for details. - Fixed minor bugs concerning nested IF commands (PP) - Corrected some errors in PP.TXT V2.10: - Added the /E switch for automatic assignment of characters to byte equates. When you use this switch and enable byte equates, you can display single characters with the B command. This is accomplished by assigning ASCII characters to byte equates depending on their index, I.E. byte equate for value 65 contains letter 'A'. This feature can be used for simple decoding and displaying of text strings. (L) - Strings assigned to byte equates are now displayed anyway, if byte equates are enabled. In previous versions of PBT, when the particular string was empty, PBT displayed a number as if byte equates weren't enabled. (L) - Fixed a nasty bug in handling loop references. It was impossible to establish two loop points at the same level and use them concurrently. Nested loops were OK. Instead of writing loop point indexes to the code image, I changed this behavior to writing loop points itself. By doing this, I don't have to write loop points to a LCS/EXE file and all loop handling is safe and predictable in all cases. (L) - PBT's preprocessor now accepts the AUTOEQU keyword in the SET command. It has the same meaning as the /E switch in PBT. (PP) - The I command now returns file pointer to the original location after comparison. Thus you can reuse this location in subsequent commands without returning to it manually. (L) - Updated scripts to reflect changes made to PBT - Updated PBT's preprocessor's documentation (PP) - Fixed a bug in PBT's preprocessor which used a value of 1 if the MOVETO command was used without parameters (PP) - Help display corrected in PBT's preprocessor (PP) - Corrected another bug in loop handling when there were more nested counting loops (i.e. J16,label) (L) - PBT now issues an error message saying "premature end of file" when you try to display Pascal or terminated strings beyond the end of the file (L) - PBT's preprocessor now supports register names in the MOVEFOR, MOVEBACK and MOVETO commands. (PP) - Corrected an error in improper value loading in the 'I' command. This caused some condition tests to be false. (L) V2.00: - Fixed a bug which prevented positional commands from working if using B and L modifiers. (L) - Renumbered some error messages - Added the ability to use the keyboard input as a patch. (P) - Made some changes to COMPILE.BAT to be able to compile patches - Command-line syntax checking is now much stricter. (C) - Corrected some bugs in offset calculations. (C) - If there are no modules concatenated to PBT, it will display an informational message as part of a help screen in the "?M" command. (M) - The help screen for the C command was rewritten - Parameter processing is now much stricter also in the P command. (P) - Corrected spelling errors in PP.TXT - PBT now saves your disk space taken by compiled executable patches by concatenating data commands into one long data stream. In previous versions, PBT wrote a new patch command with each patch component in the source file. Moreover, two different commands were used for the same type of the data stream. Now, command 2 is only recognized by PBT for backward compatibility but PBT does not use it anymore. Each command takes 2 bytes code + data bytes in the compiled patch image. When several commands are concatenated together, 2 code bytes are used just at the start of the data stream and there can be up to 255 bytes of data following these 2 bytes. Then, another data stream has to be started. Although this does save only a few bytes, PBT can work more efficiently. (P) - When compiling patches, the path is now stripped from filenames in the '/' command as well. (P) - The /Q option used in the C, T, PC and U commands is now more usable. Not only does it suppress all informational messages, but it also prevents error messages from being displayed. This is due to the usage of a global variable. This variable was used in the L command only but can be reachable from all commands. So I just took it and used in other commands. - Optimized the patch file CMOS.PAT. It contained strings and decimal numbers mixed together. These numbers were regular control characters which can be represented by escape sequences in quoted strings so I included them there. PBT's byte saving mechanism implemented recently is not able to mix numbers and strings but is able to mix strings and hexadecimal streams (prefaced by the '&' characters) so I included control characters as part of strings for this to work. - The '?' command can now fill the unused portion of a string with the specified character. For example: ?15,32 accepts a maximum of 15 characters from the keyboard and uses them as a patch. However, if you typed only 10 characters, PBT would normally use only these characters as a patch. But if you specified 32 as the second parameter, PBT would patch the remaining 5 positions with the space character (ASCII value 32). You can use any ASCII value from 0 to 255. This parameter is useful in situations where you have a predefined number of positions you can use for patching. If this space contained a text string to be displayed and no filling was performed, PBT would leave other characters untouched, thus allowing the program to display garbage. (P) - PBT now ignores spaces and tabs around patch components. Previous versions of PBT emitted an error message. (P) - Added the 'PC' command which allows you to compare two files and write a difference patch file. This patch file can be then used by PBT to recreate the second file from the first file. - You can now loop data commands (starting with the apostrophe, ampersand or digit symbols) several times. For example: PBT P +a.txt [3500] '~' [12] &0d0a [120] 0 creates the file named A.TXT and writes to it: 3500 '~' characters, 12 CR/LF combinations and 120 null characters. (P) - Removed automatic justification of hex and binary numbers. Although it is generally desired to have hex and binary numbers justified for better readability, one might prefer to display them as-is, i.e. unjustified. (L) - Updated Peer's preprocessor to support IF commands with 1-4 byte quoted strings. Although PBT itself supported it, I somehow forgot to implement it in PP. (PP) - Updated example scripts to reflect automatic justification removal. (L) - PBT was given the ability to process and interpret large patch files. All PBT versions developed so far had a limit of 2048 generated bytes of code, i.e. a 5K text file containing a patch script was enough. In most cases, it seems to be sufficient. But when I implemented the PC command and tried to create a difference patch from two PBT versions, the script file was over 200K in size. This forced me to update PBT so that it accepts script files of any size. This was reached by splitting the whole operation into small data chunks. PBT reads and processes this small chunk, interprets it (or writes it to a file when the PM command is used) and again and again until the end of the file is reached. If you intend to create self-executing patches with large script files being input, bear in mind that you must have enough free conventional memory to load the entire program file (self-executor plus data) to memory. (P) - Added the U command to update modules in executable files created by PBT. Automatically recognizes if the executable file is a lister or patcher. - Improved appearance of PBT's help screens - Miscellaneous small bugs fixed V1.90: - Fixed a bug in calculating 32-bit offsets in the '=' command. (P) - Added checking of redundant symbols in commands (i.e. =1:). It can help you in recognizing syntax errors otherwise unnoticed by PBT. (L) - Fixed a bug introduced in 1.80 that caused many commands to emit an error message. (L) - PBT has now its own preprocessor which eliminates the necessity to remember PBT script commands. As a convenience, you are now provided with PLL, a script language closer to human speech. For example, consider the following script: PBT: IW!50,-1 b q:=5 s12 PLL: If Not Word = 50 then MoveBack ReadByte Quit Else MoveTo 5 ReadString Len=12 EndIf and that's it! These new scripts are processed by PP.EXE, which in turn calls PBT for processing of generated script. PP's main task is to translate PLL into PBT's terse commands. You can tell PP to save generated script to a file for reference or debugging purposes. (PP) - Updated COMPILE.BAT to support scripts written in PLL. (L) - Fixed a bug which incorrectly saved filenames with the path to the debug info stream. (L) - Added the possibility to nest I commands in PBT or IF commands if using PLL, respectively. In fact, the IF command in PLL was programmed in the way it can be nested, so I had to include this feature into PBT itself, too. (L) - Added a note about nesting as well as one error message to the PBT's help system (L) - Added routines for assembling 80x86 instructions into the PBT's preprocessor (PP) - All PBT scripts included in the distribution have now their PLL counterparts. (L) - Added the possibility to use up to 4-byte quoted strings instead of a value in the I command. Also optimized other quoted string manipulations. (L) - If no argument is specified in the MOVETO command, it supplies a value of zero, thus moving the view area pointer to the first location. (PP) - Fixed a bug which prevented byte equates from being justified when processed. In most cases, justification is not desired, but if a need arises, it is working now. (L) - Writing to the view area 0 (file) now works. It can be used for reading values, modifying them and writing results back. (L) - Corrected writing loop points to an EXE file (L) V1.78: - Added string type checking (I forgot to implement it somehow), then another error message has been also added. (L) - It was impossible to compile (and then execute) scripts in 1.76 as I forgot to recompile the interpreter module and PBT screamed that the version mismatch had occurred. (L) - Fixed fatal bugs which prevented PBT from reading and displaying real numbers correctly (L) - If you omit parameters of the R, G, D, X, C and M commands, PBT now interprets numbers using the exponential notation (i.e. 1.23456E+3) (L) - The number justification routine has been rewritten. Now it contains a considerable amount of code for defining many justification rules. (L) - PBT now displays long error messages nicely, splitting them at the word boundary V1.76: - You can now place comments anywhere on a line and PBT stops parsing the line when it encounters such a comment. (P) - Added a note about comments to the PBT's help system. (P) - Updated PBT's main help screen to mention contact info V1.75: - PBT can now execute short machine language routines entered in the $M command. Most registers (whether 16- or 8-bit) can be displayed by using the $R command. (L) - All routines used by PBT and the PBTLIST module are now shared in one unit so no errors can occur when modifications are applied to them. In previous versions, I had to modify both PBT and PBTLIST separately so minor mistakes could appear. (L) - PBT's file I/O has been sped up considerably. For example, PBT 1.71 spent 10 seconds reading 250K file. This was caused by the new file I/O module which called the read routine for each byte instead of asking for the whole block in one step. Now the problem has been solved so PBT now reads as it should. - PBT has been given the ability to use registers in place of values in the positional commands. With the '=' command, you can form an absolute address by using both segment and offset registers. Although the segment registers are designed for holding the segment part of an address, PBT has no limitations in forming addresses, so you can write something like "=AX:BX" in your scripts and PBT will do its job. (L) - Fixed many bugs in the $M command. For example, there were problems that prevented PBT from returning correct register contents, the DS register (and other registers) weren't saved before the routine call and so on. (L) - Removed the $R command as its functionality will be superseded (see below.) (l) - Added the $A command to switch view areas. In previous versions, you could view just files; now you can view registers and the temporary buffer as well. (L) - Updated the CMOS.SCR file to demonstrate machine language usage - Added the 'P' modifier to the $A command to retrieve previously-used view area (L) - Added the $V command to turn processing and displaying of numeric values in output commands on/off. If you turn processing/display off, all numeric values are just read from the current view area. You can then switch to another view area, place the pointer to a location where the value should appear and then issue the $Wn command to instruct PBT to write the last value read to the view area n at the current position. The pointer is not changed. If you are confused now, please study the CMOS.SCR file to learn how it works. (L) - You can now scramble your LCS files with the /S switch. After compiling a script with this switch enabled, your LCS gets a security envelope, still allowing you to use it normally. However, I CANNOT guarantee that the security envelope will be sufficiently strong for you. I'm sure that nobody (and nothing) can prevent hackers from manipulating software products. Although there is very little chance anyone will attempt to disassemble your LCS, it's still up to you to decide whether to trust PBT or not. (L) - Updated the LCSHDR.SCR file to reflect the /S switch presence (L) - Error messages now contain information about the file name and the current line number. This information is available only if a script file is interpreted. (L, P) - Now PBT can display file names/line numbers even if a script is converted to LCS/EXE. This is achieved by appending so called "debug info" to the LCS. Debug info contains offsets into compiled code and one such offset represents one line. As debug info also contains file names, it is scrambled as well if the /S switch is used. (L) - When scripts are compiled into executable files, input file names are stored without the path. This allows you to patch files on any drive in any directory. This means that you must be in the directory where the input file resides before running the executable patcher. The path is not stripped if you want to patch one particular file from the command line. (PM) - Fixed a bug in processing ands and shifts in the B, W and L commands. (L) V1.70: - Fixed a bug in the dec->hex conversion routine - PBT file system has been totally rewritten to be able to accept new philosophy invented by me. Due to this, *all* computer hardware components able to store data can be thought as a file. This is a great idea that offers many possibilities. As a starting point, I implemented just one virtual file called $MEMORY$. You can use this file name anywhere except the 'T' command. Accessing this file performs read/write operations on the first megabyte of memory. For example, the following command lists, on most computers, the BIOS creation date: PBT L $MEMORY$ =$FFFF5 'BIOS date: ' s8 '\N' - Some error messages made more descriptive (P) - The LM command no longer compiles scripts straight into executable files. It just makes an executable file from a LCS file (LM) - Added a help screen explaining purpose of virtual files and how to access them. A small conversion utility has been also added to convert segment:offset format addresses into linear format addresses - Error code 34 has been removed and error 41 renumbered to 34 - Added $D command that allows you to enter descriptions to LCS files. Multiple occurrences of $D are allowed. Text strings from all $Ds are concatenated, thus allowing the description to span multiple lines. The last description line is automatically terminated by the CR/LF combination. Escape sequences are allowed. This description is displayed when the LCS is compiled into EXE and the resulting program is run without parameters. - LCSHDR.SCR expanded to support description display - PBT commands on the main help screen are now sorted alphabetically V1.64: - Corrected a bug that prevented compiled scripts from working properly. For example, I had 52K binary file and when I patched it a little, it grew up to 64K. I don't know why, but now it works as usual. (PM) - Added the possibility to force file creation by adding two plus signs before the file name (P) - Corrected a mistake in the LCSHDR script that incorrectly displayed the number of loops. Now it is corrected and the number of loop points is displayed as well as number of bytes occupied by their definitions. - Fixed a spelling error in one help screen that reversed meaning of the $S1 and $S2 commands. This error was found also in the HEXDUMP script file so now it works as it should (all control chars are replaced with spaces). (L) - Added further comments to some existing scripts for clarity - Also CMOS.TXT expanded a bit - Added support for read-only files V1.62: - Escape sequences in the P command are now translated before strings are written to disk. As a result, the patching module size has been decreased to less than 5K as the escape sequence translation is no longer needed here. (P) - You can now include empty lines and comments in the patch source file. Comments must start with semicolon in column one. (P) - Added support for patching multiple files in one pass. (P) - Fixed a serious bug which was in PBT since version 1.55 and prevented the J command from working properly. (L) V1.60: - The P command is now divided into two parts in the same way like the L command. This allows you to make executable patch programs. For this function to work, a new command named PM has been added and two modules are now attached to PBT. When the executable file is created, the patching module is copied into this file and the whole file name is appended along with the code generated. This means that the resulting executable file works with just the same file that you enter at the command line and you are not needed to type the file name each time you want to patch it. PBT interprets all patch components as you would expect. There is, howewer, one thing you must take into consideration. When you want to use the '/' command to read patch data from a file, PBT won't include this file as part of the executable file so you must have it ready when you execute your compiled patcher. (P) - In order to make your patchers more powerful, you can now display any text string on the screen. This text string is included in place of a patch component and is enclosed in double quotes ("). (P) V1.55: - The '+', '-' and '=' commands can all accept 32-bit integers as offsets. In addition, PBT is smart enough to determine how much space to reserve for these values if they are constants. (L) - Forward loop references are now permitted. To resolve references to unknown labels in one pass, PBT stores code offsets and loop names and reserves space for all references. In the end, before code is interpreted or written to disk, PBT goes through all records and tries to resolve all references made. After this tedious process, code is ready to interpret/write. (L) - The J command has been given a new modifier to be able to jump unconditionally to a label. (L) - The last screen has been split into two screens. (L) - Each command now has a help screen listing its return codes with short description of each code. - All error codes are now displayed in decimal so they correspond to the error codes listed and to the value returned to DOS. - Error codes renumbered from 23-25 to 3-5. (T) - Some error code renumbering also done in the L command. (L) - Version display is now automatic. V1.50: - PBT can now handle integer variable-length numbers. These numbers can be found in MIDI files, for example. (L) - Added the LM command for creating self-executing scripts. This can be also accomplished with the COMPILE.BAT batch file, but this feature complements PBT's functionality and you are no longer forced to copy the batch file if you want to perform this function on another computer. To make this philosophy work perfectly, PBT will now have its module attached to it. Also, it will be possible to detach this module. Then, PBT will be about 30K smaller but its LM command will not be available. Note: These features will be present almost immediately after writing this paragraph so this history file will show correct information. - Seeking through a file with the '+' and '-' commands was optimized so that if there is enough data in the I/O buffer, no real seeking is performed, rather a buffer pointer is adjusted. This does not apply to the '=' command. (L) - The n value used with the '+' and '-' commands can be replaced with B or W modifiers. In this case, no value is requested from user, rather it is read from a file as byte or word and used as a relative offset. This can be used in *MANY* data files. (L) - A help screen concerning PBT's module has been added. It explains how to manipulate PBT and its module if you, for example, desire to make PBT lite from the regular PBT. - Fixed a bug in the P command which caused the '/' patch component to crash a computer. (P) - Updated COMPILE.BAT to reflect new situation. V1.44: - Added two files: FILE_ID.DIZ for BBS systems and this history file. - CMOS.SCR: the last command on the last line of the file was removed as it was found redundant. V1.42: - Now error codes in error messages are preceded by the command name; thus you can determine which command caused an error. - Opcode 26 released as it was found unnecessary. It means that another useful command can be assigned this opcode. (L) - Added new script called LCSHDR.SCR. It can list contents of your LCS file. This listing can tell you some useful information such as the PBT version used to create the LCS file, internal switches settings, code and data size etc. (L) - EXEHDR.SCR modified in the way that it emits a single beep if the initial condition evaluates to FALSE. (L) - Fixed a bug which prevented the I command to read a value of the LONGINT type. This bug would also affect the '=' command if the absolute jump position was greater than 65535. (L) V1.40: - While waiting for the next screen of help, you now have the possibility to press ESC to quit immediately without reading other screens. (L) - Three new parameters can be used with the B, W and L commands. They are '&' for bitwise AND, '<' for shifting n bits left, and '>' for shifting n bits right. Last two parameters can be represented as 'L' or 'R', respectively. This is due to a limitation of DOS and you are forced to use these letters only on the command line. (L) - The last help screen has improved appearance. This means that all notes stated here have been ordered into a multi-level bulleted list. (L) - Added a new internal variable 'Z'. It controls whether to justify numbers with zeros or not. Previous versions of PBT justified with spaces in most cases, zeros were used while displaying a hex number. Since now, PBT has started to justify all numbers with spaces and it is up to you to tell PBT when to use zeros. (L) - Created a batch file called COMPILE.BAT for compiling source scripts into executable files. (L) - Added two switches: /P pauses after each screenful of data. The /Q switch suppresses display of error messages (useful in batch files). (L) - I created a COM file to save contents of the CMOS RAM to a file. Then I translated the COM file into a script for the P command which you can use to recreate the program. Also added a text file explaining how to manipulate with a script. But the main reason for which I did these things was the fact that I planned to create another script for the L command for displaying the CMOS RAM contents. So when I had all auxiliary tools available, I could build this script afterwards. As I created the script, I fixed one minor bug in the '=' command. (L,P) V1.32: - When reading a Pascal string with the SP command, you can append a length constant. PBT will then read the given number of bytes + 1 but will interpret just the amount of data indicated by the first length byte. This is useful while reading typed files created by Pascal programs. (L) - BCD byte-size numbers supported. (L) - Fixed a bug which prevented the P command from writing a null character (ASCII value 0). (P) - Script compilation, interpretation and EXE file creation is now possible. You can create the EXE file by appending the compiled script to a file PBTLIST.BIN, which contains the PBT script interpreter. (L) - The size of the PBT script interpretation module has been decreased by 1.5K. This is due to the fact that I changed the software used to compress executables to UPX which is better than PKLite and can be used free of charge! PBT itself was also compressed. Also, one minor bug concerning script searching fixed. (L) V1.22: - The S command can handle strings terminated by a dollar sign. (L) V1.21: - Added a script for hex dump of a file. (L) - Added $P0, $P1 and $Cx commands. Also added support for byte equates. (L) - Added bit equates and the I and Q commands. (L) - Added a new script for disk directory listing. (L) - Two PBT help screens have been expanded to 4. (L) - PBT can now handle Microsoft numbers in the single and double precision. Also big-endian convention is supported for 16-bit and 32-bit integer numbers. (L) V1.20: - Added the L command for listing binary files. V1.10: - Added the P command for patching binary files. - Added the T command for truncating binary files. V1.00: - BCOPY.EXE transformed into PBT, a new product for manipulating binary files.