diff options
Diffstat (limited to 'whichbas.1')
-rw-r--r-- | whichbas.1 | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/whichbas.1 b/whichbas.1 new file mode 100644 index 0000000..b34c8fc --- /dev/null +++ b/whichbas.1 @@ -0,0 +1,280 @@ +.\" Man page generated from reStructuredText. +. +. +.nr rst2man-indent-level 0 +. +.de1 rstReportMargin +\\$1 \\n[an-margin] +level \\n[rst2man-indent-level] +level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] +- +\\n[rst2man-indent0] +\\n[rst2man-indent1] +\\n[rst2man-indent2] +.. +.de1 INDENT +.\" .rstReportMargin pre: +. RS \\$1 +. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] +. nr rst2man-indent-level +1 +.\" .rstReportMargin post: +.. +.de UNINDENT +. RE +.\" indent \\n[an-margin] +.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] +.nr rst2man-indent-level -1 +.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] +.in \\n[rst2man-indent\\n[rst2man-indent-level]]u +.. +.TH "WHICHBAS" 1 "2024-07-24" "0.2.1" "Urchlay's Atari 8-bit Tools" +.SH NAME +whichbas \- Determine BASIC variant of a tokenized Atari 8-bit program +.SH SYNOPSIS +.sp +whichbas [\-v] \fIinput\-file\fP [\fIinput\-file\fP ...] +.SH DESCRIPTION +.sp +\fBwhichbas\fP reads tokenized Atari 8\-bit BASIC, Turbo BASIC, +BASIC XL, BASIC XE, BASIC/A+, or Atari Microsoft BASIC programs and attempts to +discover which BASIC is required to run each one. +.sp +\fIinput\-file\fPs must be actual files. \fBwhichbas\fP can\(aqt read from +standard input, because it seeks in the input file. +.sp +With multiple \fIinput\-file\fPs, the output is one line per file, +with the filename, a tab, and the detected BASIC. With only one +\fIinput\-file\fP, the filename and tab are not printed. +.SH OPTIONS +.sp +\fINote\fP: none of the options \fB\-s\fP \fB\-k\fP \fB\-v\fP are allowed +when checking multiple files; they only work if there\(aqs just one +\fIinput\-file\fP argument. +.SS Detection Options +.INDENT 0.0 +.TP +.B \fB\-s\fP +Script (or silent) mode. Instead of printing a human\-readable +name like "Turbo BASIC XL" or "OSS BASIC XE" to stdout, \fBwhichbas\fP +will print nothing on standard output, but will exit with a status +indicating what it detected. The caller can check the return status +(e.g. the \fB$?\fP variable in Bourne/POSIX shells, or \fBERRORLEVEL\fP +in MS\-DOS or Windows). See \fBEXIT STATUS\fP, below. +.TP +.B \fB\-k\fP +Keep going. The default is to stop looking at the program if the +BASIC type gets narrowed down to either Turbo BASIC or BASIC XE. +This option also enables \fB\-v\fP (verbose). It\(aqs really only useful +for testing, if you\(aqre hacking on \fBwhichbas\fP itself. +.UNINDENT +.SS General Options +.INDENT 0.0 +.TP +.B \fB\-\-help\fP +Print usage message and exit. +.TP +.B \fB\-\-version\fP +Print version number and exit. +.TP +.B \fB\-v\fP +Verbose operation. When displaying a number in verbose mode, it will +be prefixed with \fI$\fP if it\(aqs in hex, or no prefix for decimal. +.UNINDENT +.SH NOTES +.sp +Atari BASIC programs are detected \fIalmost\fP 100% reliably. See \fBBUGS\fP, below, +for the gory details. +.sp +Turbo BASIC, BASIC XL, and BASIC XE are all supersets of Atari BASIC. +If you wrote a program using one of them, but didn\(aqt use any of the +extra commands or functions, the result is still an Atari BASIC program. +Likewise, if you wrote a program using BASIC XE, but only used the +commands/functions it has in common with BASIC XL, it would be +detected as BASIC XL. +.sp +There are two types of BASIC XE programs: regular and \fIEXTEND\fPed. The +extended type is detected 100% reliably, because the first byte of the +file changes from \fB$00\fP to \fB$DD\fP\&. Non\-extended programs are only +identified as BASIC XE if they use any of the extra commands BASIC XE +adds to those found in BASIC XL. +.sp +Detection of Turbo vs. BXL/BXE isn\(aqt 100% reliable, and probably +never will be. There\(aqs too much overlap between the sets of extra +tokens added by each. Programs that don\(aqt use very many of the extra +functions provided by Turbo/BXL/BXE may show up as "Either Turbo BASIC XL +or OSS BASIC XL". +.sp +Atari Microsoft BASIC is detected by checking that: +.INDENT 0.0 +.INDENT 3.5 +.INDENT 0.0 +.IP \(bu 2 +the first byte of the file is \fB$00\fP\&. +.IP \(bu 2 +the next 2 bytes (LSB/MSB) are the same as the actual file length minus 3. +.IP \(bu 2 +the last 3 bytes of the file are zero. +.UNINDENT +.UNINDENT +.UNINDENT +.sp +This may result in false positives (files that aren\(aqt BASIC programs at +all might show up as Microsoft). Also, no distinction is made between +Atari MS BASIC 1.0 and 2.0. +.sp +OSS BASIC/A+ is an extended form of Atari BASIC. It\(aqs source +compatible with Atari BASIC, but not token\-compatible because it uses +different token numbers for the regular BASIC commands and operators. +Example: SAVE is token \fB$19\fP in Atari BASIC (also Turbo/BXL/BXE), +but in A+ it\(aqs token \fB$1D\fP\&. Detection should be 100% reliable, but +since there aren\(aqt many BASIC/A+ programs in the wild, it hasn\(aqt been +thoroughly tested. +.sp +Various non\-BASIC files are detected (including Mac/65 source, +ELF binaries, etc) as a convenience, but I wouldn\(aqt rely on +\fBwhichbas\fP\(aqs non\-BASIC file type detection if I were you. +If you need the \fBfile\fP(1) command, use it. +.sp +\fBwhichbas\fP knows nothing about other BASICs such as Frost BASIC or +Altirra BASIC. +.sp +When using multiple \fIinput\-file\fP arguments, a separate instance of +\fBwhichbas\fP is spawned for each file. This isn\(aqt the most efficient +approach, but it shouldn\(aqt cause problems on reasonably modern +systems. +.SH BUGS +.SS Misdetection +.sp +It\(aqs possible to get a BASIC XL/XE program to misdetect as Atari BASIC +by writing a program that does these things: +.INDENT 0.0 +.INDENT 3.5 +.INDENT 0.0 +.IP \(bu 2 +Dimension a string array with a number of elements that isn\(aqt just a +numeric constant or numeric variable (e.g. \fIDIM A$(2+2,10)\fP or +\fIDIM A$(I*2,10)\fP). The code that detects a string array \fIDIM\fP command +can only handle simple cases like \fIDIM A$(10,10)\fP or \fIDIM A$(I,10)\fP\&. +It doesn\(aqt actually matter if the 2nd argument is a fancy expression, +though. +.IP \(bu 2 +Does \fInot\fP actually \fIuse\fP the string array variable by assigning to +it or reading a value from it. String array accesses in BASIC XL/XE +are reliably detected because they require a semicolon after the +first number, even if there isn\(aqt a 2nd number. Example: \fI? A$(2;)\fP +prints the 2nd element of the \fIA$\fP string array. If it were written +as \fI? A$(2)\fP, but \fIA$\fP is a string array (not a regular string), +BASIC XL/XE would give an \fIError 40\fP (string type mismatch) at +runtime. +.UNINDENT +.UNINDENT +.UNINDENT +.sp +The good news is, such a program will still work fine in Atari BASIC. +Atari BASIC will dimension it as a regular string variable and ignore +the 2nd dimension. Since it\(aqs not actually used elsewhere in the program, +it doesn\(aqt hurt anything. +.SH EXIT STATUS +.sp +Without the \fB\-s\fP option, exit status is 0 for success, non\-zero for +failure. +.sp +With the \fB\-s\fP option, the exit status is: +.INDENT 0.0 +.TP +.B \fB0\fP +Not used with \fB\-s\fP\&. +.TP +.B \fB1\fP or \fB2\fP +Error reading file. Error message will be printed on standard error. +.TP +.B \fB3\fP +Atari BASIC detected. +.TP +.B \fB4\fP +Turbo BASIC detected. +.TP +.B \fB5\fP +OSS BASIC XL detected. +.TP +.B \fB6\fP +Non\-EXTENDed OSS BASIC XE detected. +.TP +.B \fB7\fP +Turbo BASIC or BASIC XL (undecided which). +.TP +.B \fB8\fP +Turbo BASIC or non\-EXTENDed BASIC XE (undecided which). +.TP +.B \fB9\fP +Turbo BASIC, BASIC XL, or non\-EXTENDed BASIC XE (undecided which). +.TP +.B \fB10\fP +Unknown Atari BASIC derivative (not Atari BASIC, but not +Turbo/BXL/BXE/A+ either). +.TP +.B \fB11\fP +Atari Microsoft BASIC detected. +.TP +.B \fB12\fP +EXTENDed OSS BASIC XE detected. +.TP +.B \fB13\fP +Compiled Turbo BASIC detected. +.TP +.B \fB14\fP +OSS BASIC/A+ detected. +.TP +.B \fB64\fP +None of the above; not BASIC. +.UNINDENT +.sp +In the future, more exit codes may be defined (in the range \fB15\fP to +\fB63\fP), but the existing ones will not change. +.SH COPYRIGHT +.sp +WTFPL. See \fI\%http://www.wtfpl.net/txt/copying/\fP for details. +.SH AUTHOR +.INDENT 0.0 +.IP B. 3 +Watson <\fI\%urchlay@slackware.uk\fP>; Urchlay on irc.libera.chat \fI##atari\fP\&. +.UNINDENT +.SH SEE ALSO +.sp +\fBa8cat\fP(1), +\fBa8eol\fP(1), +\fBa8xd\fP(1), +\fBatr2xfd\fP(1), +\fBatrsize\fP(1), +\fBaxe\fP(1), +\fBbas2aplus\fP(1), +\fBblob2c\fP(1), +\fBblob2xex\fP(1), +\fBcart2xex\fP(1), +\fBcxrefbas\fP(1), +\fBdasm2atasm\fP(1), +\fBdiffbas\fP(1), +\fBdumpbas\fP(1), +\fBf2toxex\fP(1), +\fBfenders\fP(1), +\fBlistbas\fP(1), +\fBprotbas\fP(1), +\fBrenumbas\fP(1), +\fBrom2cart\fP(1), +\fBunmac65\fP(1), +\fBunprotbas\fP(1), +\fBvxrefbas\fP(1), +\fBwhichbas\fP(1), +\fBxex1to2\fP(1), +\fBxexamine\fP(1), +\fBxexcat\fP(1), +\fBxexsplit\fP(1), +\fBxfd2atr\fP(1), +\fBxex\fP(5), +\fBatascii\fP(7), +\fBfauxtari\fP(7). +.sp +Any good Atari 8\-bit book: \fIDe Re Atari\fP, \fIThe Atari BASIC Reference +Manual\fP, the \fIOS Users\(aq Guide\fP, \fIMapping the Atari\fP, etc. +.\" Generated by docutils manpage writer. +. |