Ml functions: Difference between revisions
No edit summary |
No edit summary |
||
| (5 intermediate revisions by the same user not shown) | |||
| Line 2: | Line 2: | ||
[[programming features|Programming Features]] - <strong>ML Functions</strong> | [[programming features|Programming Features]] - <strong>ML Functions</strong> | ||
The ML functions are | The ML functions provide operations that are more flexible than ML commands or ML variables. In practice, they behave like built-in BASIC functions: some execute an ML routine and then return a computed value. Functions can return either numeric or string results (including string values that cannot be returned through ML variables). | ||
All functions begin with an "@" | All ML functions begin with an "@" followed by one or two digits (the function number). Functions are either STRING or NUMERIC, as indicated in the table. Some functions accept required and/or optional parameters, which are placed in parentheses after the function number. | ||
Example: | Example: | ||
1000 a$=@5:sr=st:a=val(a$):ifa<>0thenprint@1(a) | 1000 a$=@5:sr=st:a=val(a$):ifa<>0thenprint@1(a) | ||
1010 ifsr=.then1000 | 1010 ifsr=.then1000 | ||
In this example: | |||
* | * @5 reads a line from disk (like .01) and returns it as a string. | ||
* | * VAL() is used to test whether the returned line is numeric; if so, @1 prints the number without the leading space added by STR$ for positive values. | ||
* The | * The loop continues until end-of-file (as indicated by ST). | ||
All ML functions (@##) invoke address $4E21 for ML processing. | |||
{| class="wikitable | The table below lists the ML Functions and descriptions. | ||
{| class="wikitable" | |||
|- | |- | ||
|+ML Function Descriptions | |+ ML Function Descriptions | ||
! Function | ! Function | ||
! Format and Description | ! Format and Description | ||
|- | |- | ||
| @0 | | @0 | ||
| <strong>Format: @0 : STRING </strong> | | <strong>Input Buffer Slice (TX$/!40)</strong><br> | ||
<strong>Format: @0 : STRING</strong><br> | |||
Equivalent to <code>LEFT$(TX$,!40)</code>. Commonly used after disk input (.01) or keyed input (.02) when the input buffer is TX$ and the character count is in !40.<br> | |||
Example: <strong>.01:A$=@0 </strong> | Example: <strong>.01:A$=@0</strong> | ||
|- | |||
| @1 | |||
| <strong>STR$ Without Leading Space</strong><br> | |||
<strong>Format: @1( <number> ) : STRING</strong><br> | |||
Returns the equivalent of <code>STR$(<number>)</code> without the leading blank for positive numbers. Negative values retain the minus sign.<br> | |||
Examples:<br> | |||
<strong>@1(500)</strong> returns "500"<br> | |||
<strong>@1(-10)</strong> returns "-10" | |||
|- | |||
| @2 | |||
| <strong>Find Substring (Forward)</strong><br> | |||
<strong>Format: @2( <string1> , <string2> [ , <number> ] ) : NUMERIC</strong><br> | |||
Searches for <string1> within <string2> from left to right and returns the 1-based position. Returns 0 if not found.<br> | |||
Optional <number> behavior:<br> | |||
* If omitted: return position of first occurrence<br> | |||
* If <number> > 0: return position of the <number>th occurrence<br> | |||
* If <number> = 0: return the count of occurrences of <string1> in <string2><br> | |||
Examples:<br> | |||
<ul style="list-style: none; margin-left: 0;"> | |||
<li><strong>@2("b","abc")</strong> returns 2</li> | |||
<li><strong>@2("b","def")</strong> returns 0</li> | |||
<li><strong>@2("b","abcdabc",2)</strong> returns 6</li> | |||
<li><strong>@2("b","bobby",0)</strong> returns 3</li> | |||
</ul> | |||
The !52 variable stores the most recent find position (0 if the count form was used). | |||
|- | |||
| @3 | |||
| <strong>Repeat First Character</strong><br> | |||
<strong>Format: @3( <string> , <number> ) : STRING</strong><br> | |||
Returns a string made of the first character of <string> repeated <number> times.<br> | |||
Example: <strong>@3("A",5)</strong> returns "AAAAA"<br> | |||
<number> range: 0–255. If <string> is null, returns null. | |||
|- | |- | ||
| @ | | @4 | ||
| <strong> | | <strong>Modem GET Character</strong><br> | ||
<strong>Format: @4 : STRING</strong><br> | |||
Modem input character (GET-style). Returns one character if available; otherwise returns a null string.<br> | |||
Example: <strong>A$=@4</strong> | |||
<strong>@ | |||
< | |||
|- | |- | ||
| @ | | @5 | ||
| <strong> | | <strong>Read Disk Line (Returns String)</strong><br> | ||
<strong>Format: @5 : STRING</strong><br> | |||
Performs a disk line read (.01) and returns the resulting line as a string. Similar to @0, but executes the read first.<br> | |||
Example: <strong>A$=@5:SR=ST:PRINT#9,A$;</strong> | |||
|- | |- | ||
| @ | | @6 | ||
| <strong>Format: @ | | <strong>Extended ASC / 16-bit Extract</strong><br> | ||
<strong>Format: @6( <string1> [ , <string2> ] ) : NUMERIC</strong><br> | |||
Extended ASC for 8-bit and 16-bit extraction. Behavior depends on argument form:<br> | |||
* One string, length 0–1: returns PETSCII of first character; returns 0 if null string (no error).<br> | |||
< | Example: <strong>GET#8,A$:I=@6(A$)</strong><br> | ||
* One string, length 2: returns 16-bit value from the first two characters (low byte = 1st char, high byte = 2nd char).<br> | |||
Example: <strong>IF LEN(I$)=2 THEN L=@6(I$)</strong><br> | |||
* Two strings: treats first character of each as low/high bytes and returns a 16-bit value. Null strings are treated as 0.<br> | |||
Example: <strong>GET#8,A$,B$:L=@6(A$,B$)</strong> | |||
|- | |- | ||
| @ | | @7 | ||
| <strong>Format: @ | | <strong>Extended CHR$ (16-bit to 2 Bytes)</strong><br> | ||
<strong>Format: @7( <number> ) : STRING</strong><br> | |||
Extended CHR$. Returns a 2-character string containing the low byte then high byte of <number>. Useful for relative file positioning.<br> | |||
Example: <strong>PRINT#15,"p"CHR$(104)@7(RN)CHR$(1)</strong> | |||
Example: <strong> | |||
|- | |- | ||
| @ | | @8 | ||
| <strong>Format: @ | | <strong>Read Keyed Line (Returns String)</strong><br> | ||
<strong>Format: @8 : STRING</strong><br> | |||
Performs keyed line input (.02) and returns the resulting line as a string.<br> | |||
Example: <strong>I$=@8:P=!01:IF P=0 THEN RETURN</strong> | |||
Example: <strong> | |||
|- | |- | ||
| @ | | @9 | ||
| <strong> | | <strong>Enhanced FRE()</strong><br> | ||
<strong>Format: @9 : NUMERIC</strong><br> | |||
Enhanced FRE(). Returns free memory as a positive value and does not force garbage collection; uses an internal calculation routine.<br> | |||
Example: <strong>I=@9:IF I>3000 THEN RETURN</strong> | |||
|- | |- | ||
| @ | | @10 | ||
| <strong>Format: @ | | <strong>Strip Control/Graphics Codes</strong><br> | ||
<strong>Format: @10( <string> [ , <number> ] ) : STRING</strong><br> | |||
Returns <string> with graphics/control characters removed. Optional <number> returns only the first <number> characters (LEFT$-style).<br> | |||
<number> range: 0–255.<br> | |||
Example: <strong> | Example: <strong>A$=@10(@0,15)</strong> | ||
|- | |- | ||
| @ | | @11 | ||
| <strong>Format: @ | | <strong>Get Time String</strong><br> | ||
<strong>Format: @11 : STRING</strong><br> | |||
Returns current time as "HH:MM am" or "HH:MM pm". Updates !45 (hour) and !44 (AM/PM flag: 0=AM, non-zero=PM). | |||
|- | |- | ||
| @ | | @12 | ||
| <strong>Format: @ | | <strong>Overlay String / Replace at Position</strong><br> | ||
<strong>Format: @12( <string1> , <string2> , <number> ) : STRING</strong><br> | |||
Overlays <string1> onto <string2> starting at position <number> (1–255), replacing existing characters. Pads with spaces if needed.<br> | |||
Examples:<br> | |||
Example: <strong>I=@ | <ul style="list-style: none; margin-left: 0;"> | ||
<li><strong>@12("there","Hello",7)</strong> returns "Hello there"</li> | |||
<li><strong>@12("*","++++++++",4)</strong> returns "+++*++++"</li> | |||
</ul> | |||
Special replace mode: if <number>=0, uses the most recent find position from @2 or @25. If that value is 0 (or if @2/@25 was used in count mode), an ILLEGAL QUANTITY error will occur.<br> | |||
Example (replace all "." with "/"):<br> | |||
<strong>1000 IF @2(".",I$)>0 THEN I$=@12("/",I$,0):GOTO 1000</strong> | |||
|- | |- | ||
| @ | | @13 | ||
| <strong> | | <strong>Capture Crash Error</strong><br> | ||
<strong>Format: @13 : STRING</strong><br> | |||
Crash routine helper: returns the BASIC error message text associated with the crash. | |||
|- | |- | ||
| @ | | @14 | ||
| <strong>Format: @ | | <strong>Capture Crash Line Number</strong><br> | ||
<strong>Format: @14 : STRING</strong><br> | |||
Crash routine helper: returns the BASIC error line number as a string. | |||
|- | |- | ||
| @ | | @15 | ||
| <strong> | | <strong>Convert Date to ADN</strong><br> | ||
<strong>Format: @15( <year> , <month> , <day> ) : NUMERIC</strong><br> | |||
Returns an ADN (absolute day number) from year/month/day. Returns -1 if any parameter is invalid. | |||
<strong>@ | |||
|- | |- | ||
| @ | | @16 | ||
| <strong>Format: @ | | <strong>Convert ADN to Year (Sets Month/Day)</strong><br> | ||
<strong>Format: @16( <number> ) : NUMERIC</strong><br> | |||
Converts ADN in <number> to a date and returns the year. Updates !43 (month) and !42 (day). Invalid ADN yields undefined results. | |||
|- | |- | ||
| @ | | @17 | ||
| <strong>Format: @ | | <strong>Convert ADN to Day of Week</strong><br> | ||
<strong>Format: @17( <number> ) : NUMERIC</strong><br> | |||
Returns day-of-week from ADN in <number>: 0–6 for Sunday–Saturday. | |||
|- | |- | ||
| @ | | @18 | ||
| <strong>Format: @ | | <strong>Convert ADN to Date String</strong><br> | ||
<strong>Format: @18( <number> ) : STRING</strong><br> | |||
Returns date string "MM/DD/YYYY" from ADN in <number>. If ADN is invalid, returns "--/--/----". | |||
|- | |- | ||
| @ | | @19 | ||
| <strong>Format: @ | | <strong>Convert Date String to ADN</strong><br> | ||
<strong>Format: @19( <string> ) : NUMERIC</strong><br> | |||
Converts date string "MM/DD/YYYY" to ADN. Returns -1 if invalid. | |||
|- | |- | ||
| @ | | @20 | ||
| <strong>Format: @ | | <strong>Current Overlay Filename</strong><br> | ||
<strong>Format: @20 : STRING</strong><br> | |||
Returns the filename of the BASIC overlay currently in memory (used by crash routines). | |||
|- | |- | ||
| @ | | @21 | ||
| <strong>Format: @ | | <strong>Alpha-Only, Lowercase Filter</strong><br> | ||
<strong>Format: @21( <string> ) : STRING</strong><br> | |||
This | Returns <string> with all non-alphabetic characters removed and converts letters to lowercase.<br> | ||
Example: <strong>@21("This Is A Test")</strong> returns "thisisatest" | |||
|- | |- | ||
| @ | | @22 | ||
| <strong>Format: @ | | <strong>Compress Number for Disk</strong><br> | ||
<strong>Format: @22( <number> ) : STRING</strong><br> | |||
< | Returns a compressed numeric string for disk storage by packing two digits per byte (approximately half-length of STR$ output). Uses a special encoding to avoid producing a carriage return character.<br> | ||
Example: <strong>PRINT#8,@22(I)</strong> | |||
|- | |- | ||
| @ | | @23 | ||
| <strong>Format: @ | | <strong>Uncompress Number from Disk</strong><br> | ||
<strong>Format: @23( <string> ) : NUMERIC</strong><br> | |||
Inverse of @22: uncompresses a number stored in <string>. Invalid strings yield undefined results.<br> | |||
Example: <strong>INPUT#8,I$:I=@23(I$)</strong> | |||
|- | |- | ||
| @ | | @24 | ||
| <strong>Format: @ | | <strong>Pad/Terminate Relative Record</strong><br> | ||
<strong>Format: @24( <string> , <number> ) : STRING</strong><br> | |||
Pads/truncates a record to length <number> for relative file use.<br> | |||
* If <string> is shorter than <number>, pads with carriage returns to reach <number>.<br> | |||
Example: <strong>@ | * If <string> is >= <number>, truncates to <number>-1 and appends a carriage return.<br> | ||
Null strings or <number><2 may yield undefined results.<br> | |||
Example: <strong>F$=F$+@24("name",15)</strong> | |||
|- | |- | ||
| @ | | @25 | ||
| <strong>Format: @ | | <strong>Find Substring (Reverse)</strong><br> | ||
<strong>Format: @25( <string1> , <string2> [ , <number> ] ) : NUMERIC</strong><br> | |||
Same as @2, but searches from right to left (end of <string2> toward the beginning). | |||
|- | |- | ||
| @ | | @26 | ||
| <strong>Format: @ | | <strong>Get Delimited Field</strong><br> | ||
<strong>Format: @26( <string1> , <string2> , <number> ) : STRING</strong><br> | |||
Returns the <number>th section of <string2> separated by the delimiter in <string1>.<br> | |||
Example: <strong>@26("!","cp6!i6!cd//directory",2)</strong> returns "i6"<br> | |||
Example: <strong> | <number> must be non-zero. | ||
|- | |- | ||
| @ | | @27 | ||
| <strong>Format: @ | | <strong>Calendar Age from ADNs</strong><br> | ||
<strong>Format: @27( <number1> , <number2> ) : NUMERIC</strong><br> | |||
Returns calendar age in years between two ADNs: from <number2> to <number1>.<br> | |||
Example: <strong>AGE=@27(DA,BD)</strong> | |||
Example: <strong> | |||
|- | |- | ||
| @ | | @28 | ||
| <strong>Format: @ | | <strong>Find String in Array</strong><br> | ||
<strong>Format: @28( <string> , <array> ) : NUMERIC</strong><br> | |||
Searches a one-dimensional string array for an exact match to <string> and returns the index. Returns -1 if not found.<br> | |||
<Array> is the array name without "$" or parentheses (for example, pass <code>A</code> for <code>A$()</code>). Errors if array is missing or not 1-D.<br> | |||
Example: <strong>I=@28(A$,A):IF I<0 THEN #"not found!"</strong> | |||
|- | |- | ||
| @ | | @29 | ||
| <strong>Format: @ | | <strong>Read N Characters</strong><br> | ||
<strong>Format: @29( <number> ) : STRING</strong><br> | |||
Reads <number> characters (GET#-style). Does not stop at EOF and does not stop at the end-of-line character in !04. | |||
|- | |- | ||
| @ | | @30 | ||
| <strong>Format: @ | | <strong>Boot Drive Init Command</strong><br> | ||
<strong>Format: @30( <number> ) : STRING</strong><br> | |||
This function | This function is used in conjunction with the variables !49, !50, and !51. | ||
It returns the drive init command for one of the three boot drives: | |||
0=Boot drive, 1=Program drive, 2=External drive. | |||
|- | |- | ||
| @ | | @31 | ||
| <strong> | | <strong>Sequential Read (Enhanced)</strong><br> | ||
<strong>Format: @31 : (Undocumented)</strong><br> | |||
Newer function (not documented in the v8.0 manuscript). See [[Undocumented_8.1_commands#at31|Undocumented features: @31]]. | |||
|- | |- | ||
| @ | | @32 | ||
| <strong>Format: @ | | <strong>Retrieve File Block Count</strong><br> | ||
<strong>Format: @32 : (Undocumented)</strong><br> | |||
Newer function (not documented in the v8.0 manuscript). See [[Undocumented_8.1_commands#at32|Undocumented features: @32]]. | |||
|- | |- | ||
| @ | | @33 | ||
| <strong>Format: @ | | <strong>Return 1-Byte Null String</strong><br> | ||
<strong>Format: @33 : (Undocumented)</strong><br> | |||
Newer function (not documented in the v8.0 manuscript). Returns a single-byte null string (CHR$(0)). See [[Undocumented_8.1_commands#at33|Undocumented features: @33]]. | |||
|} | |} | ||
Latest revision as of 03:37, 1 March 2026
Programming Features - ML Functions
The ML functions provide operations that are more flexible than ML commands or ML variables. In practice, they behave like built-in BASIC functions: some execute an ML routine and then return a computed value. Functions can return either numeric or string results (including string values that cannot be returned through ML variables).
All ML functions begin with an "@" followed by one or two digits (the function number). Functions are either STRING or NUMERIC, as indicated in the table. Some functions accept required and/or optional parameters, which are placed in parentheses after the function number.
Example:
1000 a$=@5:sr=st:a=val(a$):ifa<>0thenprint@1(a) 1010 ifsr=.then1000
In this example:
- @5 reads a line from disk (like .01) and returns it as a string.
- VAL() is used to test whether the returned line is numeric; if so, @1 prints the number without the leading space added by STR$ for positive values.
- The loop continues until end-of-file (as indicated by ST).
All ML functions (@##) invoke address $4E21 for ML processing.
The table below lists the ML Functions and descriptions.
| Function | Format and Description |
|---|---|
| @0 | Input Buffer Slice (TX$/!40) Format: @0 : STRING |
| @1 | STR$ Without Leading Space Format: @1( <number> ) : STRING |
| @2 | Find Substring (Forward) Format: @2( <string1> , <string2> [ , <number> ] ) : NUMERIC
Examples:
The !52 variable stores the most recent find position (0 if the count form was used). |
| @3 | Repeat First Character Format: @3( <string> , <number> ) : STRING |
| @4 | Modem GET Character Format: @4 : STRING |
| @5 | Read Disk Line (Returns String) Format: @5 : STRING |
| @6 | Extended ASC / 16-bit Extract Format: @6( <string1> [ , <string2> ] ) : NUMERIC
Example: GET#8,A$:I=@6(A$)
Example: IF LEN(I$)=2 THEN L=@6(I$)
Example: GET#8,A$,B$:L=@6(A$,B$) |
| @7 | Extended CHR$ (16-bit to 2 Bytes) Format: @7( <number> ) : STRING |
| @8 | Read Keyed Line (Returns String) Format: @8 : STRING |
| @9 | Enhanced FRE() Format: @9 : NUMERIC |
| @10 | Strip Control/Graphics Codes Format: @10( <string> [ , <number> ] ) : STRING |
| @11 | Get Time String Format: @11 : STRING |
| @12 | Overlay String / Replace at Position Format: @12( <string1> , <string2> , <number> ) : STRING
Special replace mode: if <number>=0, uses the most recent find position from @2 or @25. If that value is 0 (or if @2/@25 was used in count mode), an ILLEGAL QUANTITY error will occur. |
| @13 | Capture Crash Error Format: @13 : STRING |
| @14 | Capture Crash Line Number Format: @14 : STRING |
| @15 | Convert Date to ADN Format: @15( <year> , <month> , <day> ) : NUMERIC |
| @16 | Convert ADN to Year (Sets Month/Day) Format: @16( <number> ) : NUMERIC |
| @17 | Convert ADN to Day of Week Format: @17( <number> ) : NUMERIC |
| @18 | Convert ADN to Date String Format: @18( <number> ) : STRING |
| @19 | Convert Date String to ADN Format: @19( <string> ) : NUMERIC |
| @20 | Current Overlay Filename Format: @20 : STRING |
| @21 | Alpha-Only, Lowercase Filter Format: @21( <string> ) : STRING |
| @22 | Compress Number for Disk Format: @22( <number> ) : STRING |
| @23 | Uncompress Number from Disk Format: @23( <string> ) : NUMERIC |
| @24 | Pad/Terminate Relative Record Format: @24( <string> , <number> ) : STRING
Null strings or <number><2 may yield undefined results. |
| @25 | Find Substring (Reverse) Format: @25( <string1> , <string2> [ , <number> ] ) : NUMERIC |
| @26 | Get Delimited Field Format: @26( <string1> , <string2> , <number> ) : STRING |
| @27 | Calendar Age from ADNs Format: @27( <number1> , <number2> ) : NUMERIC |
| @28 | Find String in Array Format: @28( <string> , <array> ) : NUMERIC |
| @29 | Read N Characters Format: @29( <number> ) : STRING |
| @30 | Boot Drive Init Command Format: @30( <number> ) : STRING |
| @31 | Sequential Read (Enhanced) Format: @31 : (Undocumented) |
| @32 | Retrieve File Block Count Format: @32 : (Undocumented) |
| @33 | Return 1-Byte Null String Format: @33 : (Undocumented) |
Next section: Basic Variables Table