$define{doc_title}{Applications Guide}$ $define{doc_author}{MartinR \& Phillip Summers}$ $define{doc_authmail}{}$ $include{"Book.h"}$ # Summary RomWBW is supplied with a suite of software applications that enhance the use of the system. Some of these applications have been written entirely from scratch for RomWBW. Others are pre-existing software that has been customized for the RomWBW environment. This document serves as a reference for these RomWBW-specific applications. The primary usage documentation for RomWBW is the $doc_user$. It is assumed that the reader is generally familiar with this document. RomWBW also includes many generic software applications that have not been modified for RomWBW (e.g., MSBASIC). These generic applications are not documented here. Please refer to the application specific documentation for these generic applications. The documentation for some of these generic applications is included in the Doc folder of the RomWBW distribution. The applications described in this document fall into two general categories. 1. **ROM Applications** are software applications that are loaded from the the ROM memory of your RomWBW system. 2. **CP/M Applications** are software applications that are loaded from disk using a previously loaded CP/M (or CP/M like) operating system using its command line. Note that some applications are available in both forms. For example, Microsoft BASIC is available as a ROM application and as an application that runs under CP/M. Only the ROM variant is documented here because the CP/M variant is not RomWBW-specific. You will see that two of the RomWBW operating systems are included here as ROM Applications. Although operating systems are normally loaded from disk, RomWBW does include a way to launch CP/M 2.2 and Z-System directly from ROM. Most RomWBW systems include a ROM disk. A running operating system can load applications from the ROM disk just like a floppy or hard disk. Applications loaded from the ROM disk by CP/M are considered to be CP/M applications, **not** ROM applications. `\clearpage`{=latex} # Boot Menu The system start-up process is described in some detail in the RomWBW User Guide, and for the sake of completeness there is some overlap here. When a RomWBW system is started the user is presented with a sign-on message at the default console detailing the RomWBW version and build date. The system follows this with the list of hardware that it has discovered, a list of devices and the system units assigned to them, before finally inviting the to select a boot device with the prompt: ``` Boot [H=Help]: ``` At this point, the user may specify a unit, optionally with a slice, to boot from. Note that it is not possible to boot from from the serial (ASCI) or memory disk (MD) devices. Alternatively the user may select one of the built-in Boot Loader commands. A menu of which may be displayed by pressing the H or ? keys (for Help). Furthermore, a ROM application may also be started from this prompt. This start-up process is described in some detailed in the RomWBW User Guide, and there is some overlap here. ## Help After pressing H or ? at the boot prompt the user will be presented with the following list of available commands: ``` L - List ROM Applications D - Device Inventory R - Reboot System I [] - Set Console Interface/Baud code V [] - View/Set HBIOS Diagnostic Verbosity [.] - Boot Disk Unit/Slice ``` The function performed by each command is described below: L: : Lists the applications and operating systems that are built into the RomWBW ROM - e.g., low-level monitor utility, CP/M, or BASIC. D: : Displays the list of system devices that was first displayed when the system was started. R: : Will restart the system. Note that this does not reset hardware devices in the same way that power-on or pressing the reset button would. I: : Allows the user to select the interface connected to the console, and optionally the Baud rate. This could be used to allow the system to be operated from a second console. V: : Enables the display of invalid RomWBW HBIOS API calls. This option is very unlikely to be used by a user and is used for development purposes. And, finally, the system may be booted by specifying the unit number, and optional slice, separated by a period('.'), of where the disk operating system software is located - eg 2, 4.1, 5.3 Alternatively, a RomWBW ROM application may be started by pressing the appropriate key from the applications menu, shown in the following section. ## List ROM Applications If the user presses the L key at the Boot Loader prompt then the system will display the list of ROM applications that are built into RomWBW. If a command letter is known, then it may be entered directly at the prompt rather than first displaying the menu. The ROM applications available from the boot prompt are: ``` M: Monitor C: CP/M 2.2 Z: Z-System B: BASIC T: Tasty BASIC F: Forth P: Play a Game N: Network Boot X: XModem Flash Updater U: User App ``` Each of these will now be described in greater detail. # ROM Applications ## Monitor The Monitor program is a low-level utility that can be used for testing and programming. It allows programs to be entered, memory to be examined and modified, and input/output devices to be read or written to. It's key advantage is that is available at boot up. Its key disadvantages are that code cannot be entered in assembly language and there is no ability to save to persistent storage (disks). The available memory area for programming is `0100h-EDFFh`. The following areas are reserved: Memory Area | Function ------------|----------------------------------- `0000-00FFh`| Jump and restart (RST) vectors `EE00-FDFFh`| Monitor `FE00-FFFFh`| HBIOS proxy The monitor uses a prompt in the format of `xx>` where xx is the RomWBW bank id number. For example, the prompt may look like this and means that Bank Id 0x8E is currently mapped into the low 32K of processor memory. `8E>` Please refer to Section 4 of the $doc_sys# for a description of the RomWBW Bank Id and how it relates to the physical bank of memory being mapped to the lower 32K of the processor. The method of assigning banks for specific RomWBW functions is also described. Commands can be entered at the command prompt. Automatic case conversion takes place on command entry and all numeric arguments are expected to be in hex format. The Monitor allows access to all memory locations but ROM and Flash memory cannot be written to. At startup, the Monitor will select the default "User" bank. The `S` command is provided to allow selecting alternate banks. There now follows a more detailed guide to using the RomWBW Monitor program: ### Command Summary **`?`** - Will display a summary of the available commands. ``` Monitor Commands (all values in hex): B - Boot system D xxxx [yyyy] - Dump memory from xxxx to yyyy F xxxx yyyy zz - Fill memory from xxxx to yyyy with zz H - Halt system I xxxx - Input from port xxxx K - Keyboard echo L - Load Intel hex data M xxxx yyyy zzzz - Move memory block xxxx-yyyy to zzzz O xxxx yy - Output value yy to port xxxx P xxxx - Program RAM at address xxxx R xxxx [[yy] [zzzz]] - Run code at address xxxx Pass yy and zzzz to register A and BC S xx - Set bank to xx U - Set bank to previous bank T xxxx - X-modem transfer to memory location xxxx X - Exit monitor ``` ### Cold Boot **`B`** - Performs a cold boot of the RomWBW system. A complete re-initialization of the system is performed and the system returns to the Boot Loader prompt. ### Dump Memory **`D xxxx [yyyy]`** - Dump memory from hex location xxxx to yyyy on the screen as lines of 16 hexadecimal bytes with their ASCII equivalents (if within a set range, else a '.' is printed). If the end address is omitted then 256 bytes are displayed. A good tool to see where code is located, check for version id, obtain details for chip configurations and execution paths. Example: `D 100 1FF` ``` 0100: 10 0B 01 5A 33 45 4E 56 01 00 00 2A 06 00 F9 11 ...Z3ENV...*..ù. 0110: DE 38 37 ED 52 4D 44 0B 6B 62 13 36 00 ED B0 21 Þ87íRMD.kb.6.í°! 0120: 7D 32 E5 21 80 00 4E 23 06 00 09 36 00 21 81 00 }2å!..N#...6.!.. 0130: E5 CD 6C 1F C1 C1 E5 2A C9 8C E5 CD 45 05 E5 CD åÍl.ÁÁå*É.åÍE.åÍ 0140: 59 1F C3 00 00 C3 AE 01 C3 51 04 C3 4C 02 C3 57 Y.Ã..î.ÃQ.ÃL.ÃW 0150: 02 C3 64 02 C3 75 02 C3 88 02 C3 B2 03 C3 0D 04 .Ãd.Ãu.Ã..ò.Ã.. 0160: C3 19 04 C3 22 04 C3 2A 04 C3 35 04 C3 40 04 C3 Ã..Ã".Ã*.Ã5.Ã@.à 0170: 48 04 C3 50 04 C3 50 04 C3 50 04 C3 8F 02 C3 93 H.ÃP.ÃP.ÃP.Ã..Ã. 0180: 02 C3 94 02 C3 95 02 C3 85 04 C3 C7 04 C3 D1 01 .Ã..Ã..Ã..ÃÇ.ÃÑ. 0190: C3 48 02 C3 E7 04 C3 56 03 C3 D0 01 C3 D0 01 C3 ÃH.Ãç.ÃV.ÃÐ.ÃÐ.à 01A0: D0 01 C3 D0 01 C3 D0 01 C3 D0 01 01 02 01 CD 6B Ð.ÃÐ.ÃÐ.ÃÐ....Ík 01B0: 04 54 68 69 73 20 66 75 6E 63 74 69 6F 6E 20 6E .This function n 01C0: 6F 74 20 73 75 70 70 6F 72 74 65 64 2E 0D 0A 00 ot supported.... 01D0: C9 3E FF 32 3C 00 3A 5D 00 FE 20 28 14 D6 30 32 É>ÿ2<.:].þ (.Ö02 01E0: AB 01 32 AD 01 3A 5E 00 FE 20 28 05 D6 30 32 AC «.2­.:^.þ (.Ö02¬ 01F0: 01 C5 01 F0 F8 CF E5 26 00 0E 0A CD 39 02 7D 3C .Å.ðøÏå&...Í9.}< ``` ### Fill Memory **`F xxxx yyyy zz`** - Fill memory from hex xxxx to yyyy with a single value of zz over the full range. The Dump command can be used to confirm that the fill completed as expected. A good way to zero out memory areas before writing machine data for debug purposes. ### Halt System **`H`** - Halt system. A Z80 HALT instruction is executed. The system remains in the halt state until the system is physically rebooted. Interrupts will not restart the system. On systems that support a HALT status LED, the LED will be illuminated. ### Input from Port **`I xxxx`** - Input data from port xxxx and display to the screen. This command is used to read values from hardware I/O ports and display the contents in hexadecimal. ### Keyboard Echo **`K`** - Echo any key-presses from the terminal. Press 'ESC' key to quit. This facility provides that any key stroke sent to the computer will be echoed back to the terminal. File down loads will be echoed as well while this facility is ‘on’. ### Load Hex **`L`** - Load a Intel Hex data via the terminal program. The load address is defined in the hex file of the assembled code. The terminal emulator program should be configured to give a delay at the end of each line to allow the monitor enough time to parse the line and move the data to memory. Keep in mind that this will be transient unless the system supports battery backed memory. Saving to memory drive is not supported. ### Move Memory **`M xxxx yyyy zzzz`** - Move hex memory block xxxx to yyyy to memory starting at hex location zzzz. Care should be taken to insure that there is enough memory at the destination so that code does not get over-written or memory wrapped around. ### Output to Port **`O xxxx yy`** - Output data byte xx to port xxxx. This command is used to send hexadecimal values to hardware I/O ports to verify their operation and is the companion to the I operation. Use clip leaded LEDs to confirm the data written. ### Program Memory **`P xxxx`** - Program memory location xxxx. This routine will allow you to program a hexadecimal value 'into memory starting at location xxxx. Press 'Enter' on a blank line to return to the Monitor prompt. The limitation around programming memory is that it must be entered in hexadecimal. An alternative is to use the L command to load a program that has been assembled to a hex file on the remote computer. An excellent online resource for looking up opcodes for entry can be found here: . ### Run Program **`R xxxx [[yy] [zzzz]]`** - Run program at location xxxx. If optional arguments yy and zzzz are entered they are loaded into the A and BC register respectively. The return address of the Monitor is saved on the stack so the program can return to the monitor. On return to the monitor, the contents of the A, HL, DE and BC registers are displayed. ### Set Bank **`S xx`** - Set the physical memory bank to the RomWBW Bank Id indicated by xx. Memory addresses 0x0000-0x7FFF (i.e. bottom 32k) are affected. Because the interrupt vectors are stored in the bottom page of this range, this function is disabled when interrupt mode 1 is being used (IM1). Interrupt mode 2 is not affected as the associated jump vectors are stored in high memory. Changing the bank also impacts the restart vectors (RST), so executing code that calls the HBIOS using the `RST 08` assembly code will not work. The monitor stack resides in high memory and is not affected but any code that changes the stack to low memory will be affected. The U command may be used to undo the change and return the selected memory bank back to the previously selected one. Section 4 of the $doc_sys$ provides detail on how Bank Ids map to the physical memory of the system and also how specific banks are utilized by RomWBW. ### Undo Bank **`U`** - Change the bank in memory back to the previously selected bank. This command should be used in conjunction with the S command. ### X-Modem Transfer **`T xxxx`** - Receive an X-modem file transfer and load it into memory starting at location xxxx. 128 byte blocks and checksum mode is the only supported protocol. ### Exit Monitor **`X`** - Exit the monitor program back to the main boot menu. ## RomWBW System Configuration System Configuration (`SYSCONF`) is a utility that allows system configuration to be set, dynamically and stored in NVRAM provided by an RTC chip. (`SYSCONF`) is both a ROM application ('W' Menu option), and a CP/M utility. Noting however the CP/M utility is not included on an disk image, it is found in the `Binary/Applications` folder of the RomWBW distribution. The $doc_user$ has additional information on the use of NVRAM to set your system configuration. ### Basic Operation The application is an interactive application; it does not have a command line syntax. Instead commands are executed from within the application in a command line structure. When you first start the (`SYSCONF`) utility it will display the current switches followed by a command listing. When you first run the (`SYSCONF`) utility the NVRAM will be uninitialised, and can be initialised using the (R)eset command, which writes default values to NVRAM. Updates are done immediately to NVRAM as you enter them, i.e. there is no confirm changes step. If you make any incorrect changes, you simply need to enter a new command to set the Switch value correctly. Once a change has been made it is available, however it may not take effect until the next system reboot. This is dependent on the Switch itself. If no NVRAM is provided by your hardware, then running this application will just report the missing hardware and exit immediately. To exit from the application use the (Q)uit command. ### Commands and Syntax The following are the accepted commands, unless otherwise specified a "Space" character is used to delimit parameters in the command. | Command | Argument(s) | Description | |------------|------------------|-----------------------------------------------| | (P)rint | -none- | Display a list of the current switch value(s) | | (S)et | {SW} {val},... | Sets an Switch {SW} with specific values(s) | | (R)eset | -none- | Reset all setting to default | | (H)elp | {SW} | Provides help on the syntax (values) | | (Q)uit | -none- | Exit the application | **Where** | Argument | Description | |-----------|----------------------------------------------------------------------| | {SW} | Switch ID, typically this is 2 character name to identify the switch | | {val},... | a "Comma" separated list of values to set into the switch | ### Switch Options #### Auto Boot (AB) This switch will define if the system will perform auto boot at the RomWBW boot prompt. Enabling this will not prevent a user from typing a boot command, so long as the timeout is not exceeded. When configured this replaces the (`AUTO_CMD`) variable defined in build configuration. Making changes to auto boot has no affect until the next reboot. **Arguments** | Type | Arguments | Description | |----------|------------|--------------------------------------------------------| | Enable | 'E' | Auto Boot. eg. "E,10" will auto boot, after 10 seconds | | | Timout | Timeout in seconds in the range 0-15, 0 = immediate | | Disabled | 'D' | No Auto Boot. e.g. "D" will disable autoboot | **Examples** | Command | Description | |-----------------------|---------------------------------------------------| | S AB E,10 | Enable Auto Boot with 10 second delay | | S AB D | Disable Auto Boot | #### Boot Options (BO) This switch will define the boot command to be executed when auto boot is enabled. When configured this replaces the (`AUTO_CMD`) variable defined in the ROM build configuration. Making changes to boot options has no affect until the next reboot. **Arguments** | Type | Arguments | Description | |------|------------------|----------------------------------------------------------| | Disk | 'D' | Disk Boot. eg. "D,2,14" will boot, disk unit 2, slice 14 | | | Disk Unit Number | Unit number in the range 0-127 | | | Disk Slice | Slice in the range 0-255, use 0 for floppy boot | | ROM | 'R' | ROM App. e.g. "R,M" will boot the Monitor App | | | Rom App Name | single character used on the Menu to identify the app | **Examples** | Command | Description | |-------------|----------------------------------------------------------| | S BO D,2,14 | Set the default boot from Disk; Unit 2, Slice 14 | | S BO R,M | Set the default boot to be the (M)onitor Rom Application | ## CP/M 2.2 This option will boot the CP/M 2.2 disk operating system from an image contained within the ROM. Please refer to the CPM User Manual in the Doc/CPM folder of the distribution for CP/M usage. There are also many online resources. During the build process the system will create a ROM disk containing a number of curated CP/M applications, and also a RAM drive. The capacity of each will depend upon the size of the ROM and RAM available to the system. A more complete set of utilities are provided within the disk image files provided as part of RomWBW. A number of the applications provided are generic to CP/M, while others rely on particular hardware or aspects of RomWBW itself. Those that are written specific to RomWBW include: ASSIGN, CPUSPD, FDU, FORMAT, FLASH, FDISK80, MODE, REBOOT, RTC, SYSCOPY, TALK, TIMER, XM, and COPYSL. The CP/M utilities supplied with RomWBW warrant more detailed descriptions, and so are described in some detail in their own section of this user guide. In summary they provide the initial capability to manage and update your RomWBW system, to create other bootable media (hardware dependent) and to write/debug code using assembler and BASIC. ## Z-System Z-System is a complete alternative, but entirely compatible, disk operating system to CP/M. Z-System is comprised of ZSDOS 1.1 which is a replacement for CP/M's Basic Disk Operating System (BDOS), and ZCPR which is a replacement for the Console Command Processor (CCP). Either or both may be used, although using both together will allow ZCPR to make use of specific ZSDOS features. Documentation for Z-System may be found in the Doc/CPM folder of the RomWBW distribution and the reader is referred to those. ## BASIC For those who are not familiar with BASIC, it stands for Beginners All Purpose Symbolic Instruction Code. RomWBW contains two versions of ROM BASIC, a full implementation and a "tiny" BASIC. The full implementation is a version of Microsoft BASIC from the NASCOM Computer. A comprehensive instruction manual is available in the Doc/Contrib directory. ### RomWBW specific features - Sound - Graphics - Terminal Support ### RomWBW unsupported features - Cassette loading - Cassette saving ## TastyBASIC TastyBASIC offers a minimal implementation of BASIC that is only 2304 bytes in size. It originates from Li-Chen Wang's Palo Alto Tiny BASIC from around 1976. It's small size is suited the tiny memory capacities of the time. This implementation is by Dimitri Theulings and his original source can be found at . ### Features / Limitations - Integer arithmetic, numbers -32767 to 32767 - Singles letter variables A-Z - 1-dimensional array support - Strings are not supported ### Direct Commands - `LIST`,`RUN`, `NEW`, `CLEAR`, `BYE` ### Statements - `LET`, `IF`, `GOTO`, `GOSUB RETURN`, `REM`, `FOR TO NEXT STEP`, `INPUT`, `PRINT`, `POKE`, `END` ### Functions - `PEEK`, `RND`, `ABS`, `USR`, `SIZE` ### Operators - `>=`, `#`, `>`, `=`, `<=`, `<` - Operator precedence is supported. Type ***BYE*** to return to the boot menu. ## FORTH CamelForth is the version of Forth included as part of the boot ROM in RomWBW. It has been converted from the Z80 CP/M version published at . The author is Brad Rodriguez who is a prolific Forth enthusiast, whose work can be found here: . For those are who are not familiar with Forth, I recommend the wikipedia article and the Forth Interest Group website . ### Important things to know Forth is case sensitive. To exit back to the boot loader type ***bye*** To get a list of available words type ***WORDS*** To reset Forth to its initial state type ***COLD*** Most of the code you find on the internet will not run unless modified or additional Forth words are added to the dictionary. This implementation does not support loading or saving of programs. All programs need to be typed in. Additionally, screen editing and code blocks are not supported. A CP/M version is not provided with RomWBW, this is only a ROM application. If you need to run it under CP/M you would need to download it from the camelforth web site, the link is above. ### Structure of Forth source files File | Description --------------|----------------------------- camel80.azm | Code Primitives camel80d.azm | CPU Dependencies camel80h.azm | High Level words camel80r.azm | RomWBW additions glosshi.txt | Glossary of high level words glosslo.txt | Glossary of low level words glossr.txt | Glossary of RomWBW additions ### RomWBW Additions Extensions and changes to this implementation compared to the original distribution are: - The source code has been converted from Z80mr assembler to Hector Peraza's zsm. - An additional file camel80r.azm has been added for including additional words to the dictionary at build time. However, as currently configured there is very little space allocated for addition words. Exceeding the allocated ROM space will generate an error message when building. - James Bowman's double precision words have been added from his RC2014 version: . Word | Syntax | Description --------|----------------------------|--------------------------------- D+ | d1 d2 -- d1+d2 | Add double numbers 2>R | d -- | 2 to R 2R> | d -- | fetch 2 from R M*/ | d1 n2 u3 -- d=(d1*n2)/u3 | double precision mult. div SVC | hl de bc n -- hl de bc af | Execute a RomWBW function P! | n p -- | Write a byte to a I/O port P@ | p -- n | Read a byte from and I/O port ## Play a Game ### 2048 2048 is a puzzle game that can be both mindless and challenging. It appears deceptively simple but failure can creep up on you suddenly. It requires an ANSI/VT-100 compatible colour terminal to play. 2048 is like a sliding puzzle game except the puzzle tiles are numbers instead of pictures. Instead of moving a single tile all tiles are moved simultaneously in the same direction. Where two tiles of the same number collide, they are reduced to one tile with the combined value. After every move a new tile is added with a starting value of 2. The goal is to create a tile of 2048 before all tile locations are occupied. Reaching the highest points score, which is the sum of all the tiles is a secondary goal. The game will automatically end when there are no more possible moves. Play consists of entering a direction to move. Directions can be entered using any of three different keyboard direction sets. ``` Direction | Keys ----------|---------- Up | w ^E 8 Down | s ^X 2 Left | a ^S 4 Right | d ^D 6 ``` The puzzle board is a 4x4 grid. At start, the grid will be populated with two 2 tiles. An example game sequence is shown below with new tiles to the game shown in brackets. ``` Start Move 1 - Up Move 2 - Left Move 3 - Left +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | | | |(2)| | | | | 4 | | 4 | | | | | 4 | | | | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | | | | | | | | | | | | | |(4)| | 4 | | | | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | | | |(2)| | | | | | | | | | | | | | | | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | | | | | | | |(2)| | | 2 | | | | | 2 | |(2)| | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ Move 4 - Left Move 5 - Up Move 6 - Right Move 7 - Up +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | 4 | | | | | 8 | | | 4 | | | | 8 | 4 | | | | 8 | 8 | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | 4 | | |(4)| | 4 | | | | | | | | 4 | | | | | 2 | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | | | | | | | | | | | | | | | | | | | | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ | 4 | | | | |(2)| | | | |(2)| | | 2 | |(2)| | | | +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ +---+---+---+---+ ``` This is how I lost this game: ``` +---+---+---+---+ | 4 | 2 | 16| 4 | +---+---+---+---+ | 32| 64| 8 | 2 | +---+---+---+---+ | 4 | 8 |128| 32| +---+---+---+---+ |(2)| 16| 8 | 4 | +---+---+---+---+ ``` Press Q at any time to bring up the option to Quit or Restart the game. ## Network Boot If your RomWBW system is equipped with an RCBus MT011 module, it is possible to boot into CP/M 2.2 directly from a CP/NET network server. This means that the operating system will be loaded directly from the network server and all of your drive letters will be provided by the network server. This function requires substantial knowledge of CP/NET and it's implementation within RomWBW. Section 10 of the $doc_user$ provides complete instructions for setting up a CP/NET based network under RomWBW including a section on network booting. ## Xmodem Flash Updater The RomWBW Xmodem flash updater provides the capability to update RomWBW from the boot loader using an x-modem file transfer. It offers similar capabilities to Will Sowerbutts FLASH4 utility except that the flashing process occurs during the file transfer. These are the key differences between the two methods are: Xmodem Flash Updater | FLASH.COM (aka FLASH4) --------------------------------|----------------- Available from the boot loader | Well proven and tested Xmodem transfer is integrated | Wider range of supported chips and hardware Integrated checksum utilities | Wider range of supported platforms Capability to copy a ROM image | Only reprograms sectors that have changed More convenient one step process | Ability save and verify ROM images No intermediate storage required | Progress display while flashing . | Displays chip identification information . | Faster file transfer The major disadvantages of the Updater is that it is new and relatively untested. There is the risk that a failed transfer will result in a partially flashed and unbootable ROM. There are some limitations on serial transfer speeds. The updater utility was initially intended to support the Retrobrew SBC-V2-005 platform using Atmel 39SF040 flash chips but has now been extended to be more generic in operation. Supported flash chips are 39SF040, 29F040, AT49F040, AT29C040, M29F040 , MX29F040, A29010B, A29040B The Atmel 39SF040 chip is recommended as it can erase and write 4Kb sectors. Other chips require the whole chip to be erased. ### Usage In most cases, completing a ROM update is a simple as: 1. Booting to the boot loader prompt 2. Selecting option X - Xmodem Flash Updater 3. Selecting option U - Update 4. Initiating an X-modem transfer of your ROM image on your console device 5. Selecting option R - Reboot If your console device is not able to transfer a ROM image i.e. your console is a VDU then you will have to use the console options to identify which character-input/output device is to be used as the serial device for transfer. When your console is the serial device used for the transfer, no progress information is displayed as this would disrupt the x-modem file transfer. If you use an alternate character-input/output devices as the serial device for the transfer then progress information will be displayed on the console device. Due to different platform processor speeds, serials speeds and flow control capabilities the default console or serial device speed may need to be reduced for a successful transfer and flash to occur. The **Set Console Interface/Baud code** option at the Boot Loader can be used to change the speed if required. Additionally, the Updater has options to set to and revert from a recommended speed. See the RomWBW Applications guide for additional information on performing upgrades. ### Console Options Option ( C ) - Set Console Device Option ( S ) - Set Serial Device By default the updater assumes that the current console is a serial device and that the ROM file to be flashed will also be transferred across this device, so the Console and Serial device are both the same. Either device can be can be change to another character-input/output device but the updater will always expect to receive the x-modem transfer on the **Serial Device** The advantage of transferring on a different device to the console is that progress information can be displayed during the transfer. Option ( > ) - Set Recommended Baud Rate Option ( < ) - Revert to Original Baud Rate ### Programming options Option ( U ) - Begin Update The will begin the update process. The updater will expect to start receiving an x-modem file on the serial device unit. X-modem sends the file in packets of 128 bytes. The updater will cache 32 packets which is 1 flash sector and then write that sector to the flash device. If using separate console, bank and sector progress information will shown ``` BANK 00 s00 s01 s02 s03 s04 s05 s06 s06 s07 BANK 01 s00 s01 s02 s03 s04 s05 s06 s06 s07 BANK 02 s00 s01 s02 s03 s04 s05 s06 s06 s07 etc ``` The x-modem file transfer protocol does not provide any filename or size information for the transfer so the updater does not perform any checks on the file suitability. The updater expects the file size to be a multiple of 4 kilobytes and will write all data received to the flash device. A system update file (128kb .img) or complete ROM can be received and written (512kb or 1024kb .rom) If the update fails it is recommended that you retry before rebooting or exiting to the Boot loader as your machine may not be bootable. Option ( D ) - Duplicate flash #1 to flash #2 This option will make a copy of flash #1 onto flash #2. The purpose of this is to enable making a backup copy of the current flash. Intended for systems using 2x512Kb Flash devices. Option ( V ) - Toggle Write Verify By default each flash sector will be verified after being written. Slight performance improvements can be gained if turned off and could be used if you are experiencing reliable transfers and flashing. ### Exit options Option ( R ) - Reboot Execute a cold reboot. This should be done after a successful update. If you perform a cold reboot after a failed update then it is likely that your system will be unusable and removing and reprogramming the flash will be required. Option ( Q ) - Quit to boot loader. The SBC Boot Loader is reloaded from ROM and executed. After a successful update a Reboot should be performed. However, in the case of a failed update this option could be used to attempt to load CP/M and perform the normal x-modem / flash process to recover. ### CRC Utility options Option ( 1 ) and ( 2 ) - Calculate and display CRC32 of 1st or 2nd 512k ROM. Option ( 3 ) - Calculate and display CRC32 of a 1024k (2x512Kb) ROM. Can be used to verify if a ROM image has been transferred and flashed correctly. Refer to the Tera Term section below for details on configuring the automatic display of a files CRC after it has been transferred. In Windows, right clicking on a file should also give you a context menu option CRC SHA which will allow you to select a CRC32 calculation to be done on the selected file. ### Tera Term macro configuration Macros are a useful tool for automatic common tasks. There are a number of instances where using macros to facilitate the update process could be worthwhile if you are: * Following the RomWBW development builds. * Doing lots of configuration changes. * Doing development on RomWBW drivers Macros can be used to automate sending ROM updates or images and for my own purposed I have set up a separate macro for transferring each of the standard build ROM, my own custom configuration ROM and update ROM. An example macro file to send an *.upd file, using checksum mode and display the crc32 value of the transmitted file: ``` Xmodem send, checksum, display crc32 xmodemsend '\\desktop\users\phillip\documents\github\romwbw\binary\sbc_std_cust.upd' 1 crc32file crc '\\desktop\users\phillip\documents\github\romwbw\binary\sbc_std_cust.rom' sprintf '0x%08x' crc messagebox inputstr 'crc32' ``` ### Serial speed guidelines As identified in the introduction, there are limitations on serial speed depending on processor speed and flow control settings. Listed below are some of the results identified during testing. Configuration | Processor Speed | Maximum Serial Speed -----------------------|-----------------|--------------------- UART no flow control | 2MHz | 9600 UART no flow control | 4MHz | 19200 UART no flow control | 5MHz | 19200 UART no flow control | 8MHz | 38400 UART no flow control | 10MHz | 38400 USB-fifo 2MHz+ | | n/a ASCI no flow control | 18.432MHz | 9600 ASCI with flow control | 18.432MHz | 38400 The **Set Recommend Baud Rate** option in the Updater menu follows the following guidelines. Processor Speed | Baud Rate ----------------|---------- 1MHz | 4800 2-3MHz | 9600 4-7MHz | 19200 8-20MHz | 38400 These can be customized in the updater.asm source code in the CLKTBL table if desired. Feedback to the RomWBW developers on these guidelines would be appreciated. ### Notes All testing was done with Tera Term x-modem, Forcing checksum mode using macros was found to give the most reliable transfer. Partial writes can be completed with 39SF040 chips. Other chips require entire flash to be erased before being written. An SBC V2-005 MegaFlash or Z80 MBC required for 1mb flash support. The Updater assumes both chips are same type Failure handling has not been tested. Timing broadly calibrated on a Z80 SBC-v2 Unabios not supported ## User Application RomWBW provides the facility for a user to build, include and execute their own custom application directly from the applications menu at boot-up. All that's needed is for the user to create their custom code ready for inclusion, recognising that there are certain constraints in doing this. In order to build properly, the build process requires that the file `usrrom.asm` be found in the /Source/HBIOS folder of the RomWBW tree. This source file needs to assemble using TASM and it must start at (ORG) address 00100H as the RomWBW HBIOS reserves locations 00000H to 000FFH for internal use. Further, the user application must assemble to a maximum of `USR-SIZ` bytes. During execution, the user application may make use of HBIOS calls as necessary, and at exit it should return to the RomWBW boot loader using the HBIOS warm reset. Note that no disk operating system (eg CP/M) functions will be available as no disk operating system will have been loaded. There is a sample `usrrom.asm` supplied in Source/HBIOS and it is recommended that, at least initially, users create their own application based on this as a template because it already creates the necessary variables, starts at (ORG) 00100H, and ensures that the assembled file is padded to create a file `USR-SIZ` in length. Equally, should the the user's application prove too large for the space available then assembly will be terminated with an error. Users should not remove this check from the templated code. If required, the user application may make use of the Z80 interrupt system but if the user application wishes to rely on HBIOS functionality then it must adhere to the HBIOS framework for managing interupts. Alternatively, if the user appliction has no need for the HBIOS then it may use its own custom code for handling interrupts. In that case, a hard reset, rather than an HBIOS warm start, would be necessary to return control to RomWBW. `\clearpage`{=latex} # CP/M Applications - ROM-Based & Disk-Based There now follows a more detailed guide to using the small suite of custom applications included with RomWBW. In general, these applications are operating system agnostic -- they run under any of the included operating systems. However, they all require RomWBW -- they are not generic CP/M applications. Most of the applications are custom written for RomWBW. However, some are standard CP/M applications that have been adapted to run under RomWBW (e.g. XM/XModem). The applications are generally matched to the version of RomWBW they are distributed with. So, if you upgrade the version of RomWBW in your system ROM, you will want to copy the corresponding applications to any storage devices you are using. Most of the applications are included on the RomWBW ROM disk, so they are easy to access. The applications are also included with all of the operating system disk images provided with RomWBW. So, a simple way to ensure you have matching applications is to write the disk images onto your disk media when upgrading your ROM. Of course, this will destroy any existing data on your disk media, so don't do this if you are saving any data on the media. Most of the applications are included as source code in the RomWBW distribution and are built during the normal build process. The source code is found in the Source/Apps directory of the distribution. The binary executable applications are found in the Binary/Apps directory. The table below clarifies where each of the applications may be found. It is not an exhaustive list, with further applications existing on both the ROM-based and disk-based versions of CP/M. All of the Applications incuded within RomWBW may be found with in the Binary/Apps directory. | Application | ROM Disk | Boot Disks | | ----------- | :------: | :--------: | | ASSIGN | Yes | Yes | | CLRDIR | Yes | Yes | | COPYSL | No | Yes | | CPUSPD | Yes | Yes | | FAT | No | Yes | | FDISK80 | Yes | Yes | | FDU | Yes | Yes | | FLASH | Yes | Yes | | FORMAT | Yes | Yes | | HTALK | Yes | Yes | | MODE | Yes | Yes | | REBOOT | Yes | Yes | | RTC | Yes | Yes | | SURVEY | Yes | Yes | | SYSCOPY | Yes | Yes | | TALK | Yes | Yes | | TIMER | Yes | Yes | | TUNE | No | Yes | | VGMPLAY | No | Yes | | WDATE | No | Yes | | XM | Yes | Yes | All of the CP/M applications may be found in the RomWBW Binary/Apps directory and a user may copy those they need to their own customised disk/slice. Independently of whether the CP/M system was started from ROM or a boot disk, such as a floppy disk or a slice on a CF or uSD memory card, applications may be located on and executed from either the ROM-disk itself or from other media. There are multiple disk images available for CP/M (eg floppy, legacy hard-disk and new hard-disk formats) and they all contain essentially the same set of applications. There are particular advantages for each method of booting into CP/M. ROM-based CP/M: - A clean and reliable copy of CP/M with no possibility of corruption - No additional hardware required - Fast to boot - Rolled forward with new releases of RomWBW Disk-based CP/M: - Greater capacity allows for a larger number of applications - Allows for user-customisation of applications available - Allows individual disks to be tailored to a particular purpose, eg word processor For systems starting CP/M from a disk created from an image file, there are a small number of additional applications stored in the ```USER 2``` area of the disk. These applications do not form part of CP/M, but rather are small utilities used for test purposes during develpment work. They may, or may not, fuction correctly with any given hardware or software configuration. Documentation for these untilities is very limited, though the source files maybe found in the /Source folder. Note that these utiltites are not available when starting CP/M from the ROM image or from a floppy disk. A number of the CP/M applications available are described in more detail in the following sections, each with an indication as to whether that application may be found on the ROM-disk, a boot-disk, or both. `\clearpage`{=latex} ## ASSIGN | ASSIGN | | | --------------------|---| | ROM-based |Yes| | Disk-based |Yes| RomWBW includes a flexible mechanism for associating the operating system drive letters (A: - P:) to the physical devices in the system. Drive letter assignments can be changed on a running operating system without rebooting. The ASSIGN command facilitates this by allowing you to display, assign, reassign, or remove the drive letter assignments. #### Syntax | `ASSIGN /?` | `ASSIGN /L` | `ASSIGN ` *``*`=` | `ASSIGN ` | `ASSIGN [`*``*`],...` | `ASSIGN ` *``*`=[`*``*`:[`*``*`]],...` | `ASSIGN ` *``*`=`*``*`,...` | `ASSIGN /B='*'