forked from MirrorRepos/RomWBW
Browse Source
- ROM Applications document has been consolidated into the Applications document - Martin has done a significant overhaul of the Applications document Co-Authored-By: MartinR <174514335+martinr-uk@users.noreply.github.com>work v3.5.0-dev.52
28 changed files with 1698 additions and 1282 deletions
@ -0,0 +1,44 @@ |
|||
INTTEST |
|||
======= |
|||
|
|||
RomWBW includes an API allowing applications to "hook" interrupts. |
|||
The `INTTEST` utility allows you to test this functionality. |
|||
|
|||
|
|||
** Syntax ** |
|||
|
|||
`INTTEST` |
|||
|
|||
|
|||
** Usage ** |
|||
|
|||
`INTTEST` is an interactive application. At startup, it will display |
|||
a list of the interrupt vector slots in your system along with the |
|||
current vector address for each of them. |
|||
|
|||
It then prompts you to enter the slot number (in hex) of a vector to |
|||
hook. After entering this, the application will watch the hooked |
|||
vector and countdown from 0xFF to 0x00 as interrupts are noted. |
|||
|
|||
When the counter reaches 0x00, the interrupt is unhooked and the |
|||
application terminates. The application can also be terminated by |
|||
pressing <esc>. |
|||
|
|||
|
|||
** Notes ** |
|||
|
|||
If your system is running without interrupts active, the application |
|||
will terminate immediately. |
|||
|
|||
All slots have vectors even if the corresponding interrupt is not |
|||
doing anything. In this case, the vector is pointing to the "bad |
|||
interrupt" handler. |
|||
|
|||
If you hook a vector that is not receiving any interrupts, the |
|||
down-counter will not do anything. |
|||
|
|||
|
|||
** Etymology* * |
|||
|
|||
The `INTTEST` command is an original product and the source code is |
|||
provided in the RomWBW distribution. |
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,44 @@ |
|||
INTTEST |
|||
======= |
|||
|
|||
RomWBW includes an API allowing applications to "hook" interrupts. |
|||
The `INTTEST` utility allows you to test this functionality. |
|||
|
|||
|
|||
** Syntax ** |
|||
|
|||
`INTTEST` |
|||
|
|||
|
|||
** Usage ** |
|||
|
|||
`INTTEST` is an interactive application. At startup, it will display |
|||
a list of the interrupt vector slots in your system along with the |
|||
current vector address for each of them. |
|||
|
|||
It then prompts you to enter the slot number (in hex) of a vector to |
|||
hook. After entering this, the application will watch the hooked |
|||
vector and countdown from 0xFF to 0x00 as interrupts are noted. |
|||
|
|||
When the counter reaches 0x00, the interrupt is unhooked and the |
|||
application terminates. The application can also be terminated by |
|||
pressing <esc>. |
|||
|
|||
|
|||
** Notes ** |
|||
|
|||
If your system is running without interrupts active, the application |
|||
will terminate immediately. |
|||
|
|||
All slots have vectors even if the corresponding interrupt is not |
|||
doing anything. In this case, the vector is pointing to the "bad |
|||
interrupt" handler. |
|||
|
|||
If you hook a vector that is not receiving any interrupts, the |
|||
down-counter will not do anything. |
|||
|
|||
|
|||
** Etymology* * |
|||
|
|||
The `INTTEST` command is an original product and the source code is |
|||
provided in the RomWBW distribution. |
|||
File diff suppressed because it is too large
@ -1,635 +0,0 @@ |
|||
$define{doc_title}{ROM Applications}$ |
|||
$define{doc_author}{Phillip Summers}$ |
|||
$define{doc_authmail}{}$ |
|||
$include{"Book.h"}$ |
|||
|
|||
# Summary |
|||
|
|||
RomWBW includes a small selection of built in utilities and |
|||
programming languages. |
|||
|
|||
`\clearpage`{=latex} |
|||
|
|||
# RomWBW 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 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 memory devices. |
|||
|
|||
The available memory area for programming is `0200-EDFFh`. |
|||
The following areas are reserved: |
|||
|
|||
Memory Area | Function |
|||
------------|----------------------------------- |
|||
`0000-00FFh`| Jump and restart (RST) vectors |
|||
`0100-01FFh`| HBIOS configuration block |
|||
`EE00-FDFFh`| MONITOR |
|||
`FE00-FFFFh`| HBIOS proxy |
|||
|
|||
Commands can be entered at the command prompt `>` |
|||
Automatic case conversion takes place on command entry and all |
|||
arguments are expected to be in hex format. |
|||
|
|||
The current memory bank in low memory is displayed before the prompt i.e.: |
|||
|
|||
`8E>` |
|||
|
|||
The Monitor allows access to all memory locations but ROM and |
|||
Flash memory cannot be written to. Memory outside the normal |
|||
address range can be accessed using the B command. The first |
|||
256 bytes `0000-01FF` is critical for the HBIOS operation. |
|||
Changing banks may make this information inaccessible. |
|||
|
|||
Refer to the RomWBW Architecture manual for details memory banking. |
|||
|
|||
A quick guide to using the Monitor program follows: |
|||
|
|||
## ? - Displays a summary of 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 |
|||
T xxxx - X-modem transfer to memory location xxxx |
|||
S xx - Set bank to xx |
|||
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 is |
|||
displayed. |
|||
|
|||
A good tool to see where code is located, check |
|||
for version id, obtain details for chip configurations and |
|||
execution paths. |
|||
|
|||
Examples: `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 format file into memory |
|||
|
|||
L - Load a Intel Hex format file 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 a transient unless the |
|||
system support 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 location |
|||
|
|||
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: [https://clrhome.org/table](https://clrhome.org/table) |
|||
|
|||
## 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 - Change the bank in memory to xx. Memory addresses |
|||
0000-7FFF (i.e. bottom 32k) are affected. Because the |
|||
interrupt vectors are stored in the bottom page of this |
|||
range, this function is disable 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 call 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. |
|||
|
|||
### Bank codes and descriptions |
|||
|
|||
TYPE | DESCRIPTION |BANK| DETAILS |
|||
-----|--------------------|----|--------------------- |
|||
RAM | COMMON BANK | 9F | 1024K RAM SYSTEM |
|||
RAM | USER BANK | 9E | 1024K RAM SYSTEM |
|||
RAM | BIOS BANK | 9D | 1024K RAM SYSTEM |
|||
RAM | AUX BANK | 9C | 1024K RAM SYSTEM |
|||
RAM | OS BUFFERS END | 9B | 1024K RAM SYSTEM |
|||
RAM | OS BUFFERS START | 98 | 1024K RAM SYSTEM |
|||
RAM | RAM DRIVE END | 97 | 1024K RAM SYSTEM |
|||
RAM | COMMON BANK | 8F | 512K RAM SYSTEM |
|||
RAM | USER BANK | 8E | 512K RAM SYSTEM |
|||
RAM | BIOS BANK | 8D | 512K RAM SYSTEM |
|||
RAM | AUX BANK | 8C | 512K RAM SYSTEM |
|||
RAM | OS BUFFERS | 8B | 512K RAM SYSTEM |
|||
RAM | OS BUFFERS | 8A | 512K RAM SYSTEM |
|||
RAM | OS BUFFERS | 89 | 512K RAM SYSTEM |
|||
RAM | OS BUFFERS | 88 | 512K RAM SYSTEM |
|||
RAM | RAM DRIVE END | 87 | 512K RAM SYSTEM |
|||
RAM | RAM DRIVE START | 80 | |
|||
ROM | BOOT BANK | 00 | COLD START & HBIOS |
|||
ROM | LOADER & IMAGES | 01 | MONITOR, FORTH |
|||
ROM | ROM IMAGES CONTD. | 02 | BASIC, ETC |
|||
ROM | FAT FILESYSTEM | 03 | UNA ONLY, ELSE UNUSED |
|||
ROM | ROM DRIVE START | 04 | |
|||
ROM | ROM DRIVE END | 0F | 512K ROM SYSTEM |
|||
ROM | ROM DRIVE END | 1F | 1024K ROM SYSTEM |
|||
|
|||
## 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. |
|||
|
|||
If the monitor is assembled with the DSKY functionality, |
|||
this feature will be exclude due to space limitations. |
|||
|
|||
|
|||
## NOTES: |
|||
|
|||
The RTC utility on the CP/M ROM disk provides facilities |
|||
to manipulate the Real Time Clock non-volatile Memory. |
|||
Use the C or Z option from the Boot Loader to load CP/M |
|||
and then run RTC to see the options list. |
|||
|
|||
# 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 here [www.camelforth.com/page.php?5](www.camelforth.com/page.php?5). The author is Brad |
|||
Rodriguez who is a prolific Forth enthusiast, whose work can be |
|||
found here: [www.bradrodriguez/papers/index.html](www.bradrodriguez/papers/index.html) |
|||
|
|||
For those are who are not familiar with Forth, I recommend the |
|||
wikipedia article [en.wikipedia.org/wiki/Forth_(programming_language](en.wikipedia.org/wiki/Forth_(programming_language)) |
|||
and the Forth Interest Group website [www.forth.org](www.forth.org) |
|||
|
|||
## 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. |
|||
|
|||
## 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: |
|||
[https://github.com/jamesbowman/camelforth-z80](https://github.com/jamesbowman/camelforth-z80) |
|||
|
|||
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 |
|||
|
|||
# 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 |
|||
|
|||
- This ROM-hosted implementation does not support cassette or disk |
|||
access for loading and saving programs. |
|||
|
|||
# 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 suited the tiny memory capacities of the time. This implementation is by Dimitri Theulings and his |
|||
original source can be found here [https://github.com/dimitrit/tastybasic](https://github.com/dimitrit/tastybasic) |
|||
|
|||
## Features / Limitations |
|||
|
|||
- This ROM-hosted implementation does not support disk access for |
|||
loading and saving programs. |
|||
- 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 monitor. |
|||
|
|||
# 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 |
|||
|
|||
# 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 | 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 Teraterm 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. |
|||
|
|||
Platform / Configuration | Processor Speed | Maximum Serial Speed |
|||
-------------------------------|-----------------|--------------------- |
|||
SBC-V2 UART no flow control | 2mhz | 9600 |
|||
SBC-V2 UART no flow control | 4mhz | 19200 |
|||
SBC-V2 UART no flow control | 5mhz | 19200 |
|||
SBC-V2 UART no flow control | 8mhz | 38400 |
|||
SBC-V2 UART no flow control | 10mhz | 38400 |
|||
SBC-V2 USB-FIFO 2mhz+ | | n/a |
|||
SBC-MK4 ASCI no flow control | 18.432mhz | 9600 |
|||
SBC-MK4 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 Teraterm 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 |
|||
- UNA BIOS not supported |
|||
Loading…
Reference in new issue