Locomotive BASIC
This article needs additional citations for verification. (December 2009) |
First appeared | 1984 |
---|---|
OS | AMSDOS |
License | Proprietary |
Influenced by | |
Locomotive Basic is a proprietary dialect of the BASIC programming language written by Locomotive Software on the Amstrad CPC (where it was built-in on ROM) and the later Locomotive BASIC-2 as a GEM application on the Amstrad PC1512 and 1640. It was the main descendant of Mallard BASIC,[1] the interpreter for CP/M supplied with the Amstrad PCW.
There are two versions of Locomotive BASIC: 1.0 which only came with the CPC model 464, and 1.1 which shipped with all other versions. BASIC 1.1 was also shipped with the Amstrad CPC Plus series machines, as part of the included game cartridge.
Development
[edit]Development was based on existing work recently undertaken writing Mallard BASIC for Acorn Computers Z80 addon for the BBC Micro. It is reported to have taken around 12 weeks to enhance the existing code, and was "very influenced" by BBC BASIC, though adding additional functions to do things that would have required assembly language on the BBC.[1]
Features
[edit]The Amstrad CPC firmware was compartmentalised into roughly nine different sub-sytems with standardised jump tables to access functionality.
Kernel Key Manager Text VDU Graphics VDU Screen Pack Cassette / AMSDOS Sound Manager Machine Pack Maths Firmware
Application software was not affected by code moving about in the actual firmware (e.g. for different versions and re-assembly) so long as it stuck to the documented jump block addresses. Amstrad BASIC was written to take full advantage of the firmware, bundling up BASIC code into the requisite calls into the firmware[2], but providing specific commands and functions for it rather than the reliance of generic *FX or PEEK & POKE statements.
As a BASIC implementation, it supported the hardware platfom very well, featuring simple, dedicated commands for most tasks. In common with many other dialects, multiple statements were seperated on a single line using the colon :
. Simple single-line functions were suported and WHILE/WEND
was the only available loop construct beyond FOR/NEXT
.
Handling of graphics and colour was straightforward (such as DRAW
, PLOT
, INK
, and PAPER
in all versions; plus FILL
in v1.1). It also leveraged the windowing environment of the TextVDU pack allowing the creation of multiple text windows each with their own cursor, co-ordinates, colours etc. A table giving the numeric codes for the 27 system colors was printed over the built-in 3" disk drive casing on the 664 and later machines.
A stand-out feature among almost every other BASIC of the time was a timer-based software interrupt mechanism at 50 ticks per second using the EVERY
, AFTER
and REMAIN
commands (leveraging the MACHINE_PACK of the firmware for its software interrupts). Four timers were available (0-3, with associated reducing priority - a BASIC imposition not a platform limitation) and allowed the programmer to run sections of their BASIC program after a given delay, repeating if required, e.g. EVERY 50,0 GOSUB <line>
produces a repeating one-second call with no further work.
Locomotive BASIC granted a relatively high level of control over the sound chip, an AY-3-8912 with 3 melodic channels and 1 noise channel with interrupt driven sound generation with comprehensive co-ordination of the three audio channels and associated BASIC commands: SQ()
, ON SQ <channel> GOSUB <line>
etc. The same chip was also used on late-model ZX Spectrums, as well as the Atari ST and MSX computers, but none of those had such a complete built-in SOUND
command. Many things, from selecting a particular channel or a combination of channels, setting envelopes, volume, pitch, noise, and so on could be done with a single SOUND
command, with up to 7 parameters. Granted, especially complex and/or low-level techniques could not be done with BASIC due to their requiring more precise or direct access to the hardware, e.g. especially complex music from trackers (including simulated chords using arpeggios, etc.), the playback of digitally sampled sounds as in the game RoboCop for example, and so on.
Disk, tape, and file management were managed by BASIC itself, and were usually good enough for simple file management, with commands such as GET
, PUT
, ERASE
, SAVE
, MERGE
, RUN
, CAT
, LOAD
etc. In fact, during those years, the BASIC supplied as standard with most low-cost home computers also acted as a more or less simple operating system.
Also available were some special commands for memory allocation and handling, like MEMORY
and a parametric LOAD
command, allowing, for example, to load a file containing "raw" picture data into video memory, causing it to be displayed, with a couple of BASIC instructions. Adding the right memory address(es) as parameter to the commands LOAD
or SAVE
would allow easy loading of raw uncompressed 16 KB screen pictures. CALL
ing another address gave a forced system reset (call 0
), the famous "Press Any Key" (call &bb18
) or for eliminating flicker in animation by allowing you to synchronize with the monitor's raster scan via "sync frame-flyback" (call &bd19
); this was given its own dedicated command in Basic 1.1 - FRAME
. With PEEK
and POKE
, CALL
provided an interface to assembly language programming from BASIC.
Contemporary rivals
[edit]This section possibly contains original research. (July 2019) |
Unlike the Commodore 64's built in BASIC (Commodore BASIC), which had no dedicated commands for graphics or sound, Locomotive BASIC allowed doing pretty much anything that was within the standard capabilities of the machine. This was not unimportant, as some other machines of the era required programmers to use assembler in order to access the full sound and graphics capabilities of their system. MSX, Sinclair Spectrum and some others offered a similar, more or less complete command set for their sound and graphics capabilities. The only things going clearly beyond BASIC capabilities were the overscan modes used in games and demos, 27-color graphics modes, digital sound playback, and smooth scrolling.
Unlike Sinclair BASIC or Commodore 64 BASIC, which had various keyboard command shortcuts or specialized keys for choosing symbols or colors, Locomotive BASIC keywords were typed in full and the interpreter parsed, recognized and tokenised them. However, there were abbreviations like "?
" for "PRINT
" and a few shortcuts. Programs could be saved onto Compact Cassette or floppy disk and retrieved as binary or ASCII files.
A Notable Omission - Memory Bank Switching
[edit]Although as a BASIC implemenation, Amstrad BASIC is fairly complete and goes to great pains to support the CPC platform, one notable omission in all versions is memory bank switching.
Through an arrangement of the custom circuitry switching chunks of 16KB into one of the four 16KB pages in the Z80 memory map ($0xxx, $4xxx, $8xxx, $Cxxx) all CPC models supported bank-switching to increase the potential memory storage. Various configurations of where the switched banks occurred in the memory map were supported by the Kernel.
The CPC464/664 can address upto 256KB (of which were 8, 16KB "sideways" ROMs although only six or five were avalable due to BASIC and Firmware requirements and Disc OS in the 664) and the CPC6128 could address upto 1MB (including 16, 16KB sideways ROMs - of which only 13 were available due to requirements of BASIC, Firmware and Disc OS). The Kernel provides several methods of accessing banked memory; some involve providing a pseudo 24bit address and others would switch to a given bank then jump or call to an address in that bank, executing the machine code there. Kernel routines to access banked memory include KL_FAR_CALL, KL_FAR_JMP, KL_SIDE_CALL, KL_RAM_LAM among others. The kernel will set up structures on the Z80 stack to ensure the safe capture of inbound RETurns from KL_FAR_CALL etc.[3]
Despite BASIC not providing support for this kernel functionality, use of banked memory in a BASIC program was certainly possible but required the use of a CALL
to machine code routines to do the switch and take advantage of the result. Banked memory could not be used for BASIC program code, only the main, un-banked 64KB, thus BASIC program size was largest at around 42KB. Storing machine code in banked memory was the method required to increase program space.
A common use for banked memory was to store screen images and then rapidly switch between them. Some applications also implimented "RAM Discs" but these were not supported under the Cassette/AMSDOS firmware pack, being quite proprietary.
References
[edit]- ^ Smith, Tony (12 February 2014). "You're NOT fired: The story of Amstrad's amazing CPC 464". The Register. Retrieved 17 February 2014.
- ^ https://www.theregister.com/Print/2014/02/12/archaeologic_amstrad_cpc_464/
- ^ https://cpctech.cpc-live.com/docs/firmware.pdf