mirror of https://github.com/wwarthen/RomWBW.git
Browse Source
- Fixes to ZPMLDR to make it functional with RomWBW. - Incorporate fixes from the Jon Saxton disassembly in ZPM3 itself. - Credit to Lars Nelson for finding the ZPM3 source (disassembly).pull/283/head
23 changed files with 248 additions and 19 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,30 @@ |
|||||
|
RESBDOS3.SPR and BNKBDOS3.SPR have been replaced |
||||
|
with versions from the Jon Saxton disassembly with |
||||
|
fixes distribution. The file called zpm3fix.txt |
||||
|
have been included and details the fixes. |
||||
|
|
||||
|
ZPMLDR has also been updated with the version from |
||||
|
the Jon Saxton disassembly. However, it has additionally |
||||
|
been updated to correct an issue that was preventing |
||||
|
RomWBW from booting under ZPMLDR. |
||||
|
|
||||
|
ZPMLDR has a slightly modified version of the rdSeq |
||||
|
procedure (compared to CPMLDR). It appears that this |
||||
|
causes deblocking to be bypassed on the initial disk |
||||
|
read of CPM3.SYS. As a result, the entire disk sector |
||||
|
(512 bytes) is read starting at 0x0080. This winds up |
||||
|
overlaying 0x180 bytes of the start of ZPMLDR.COM causing |
||||
|
it to fail catastrophically. |
||||
|
|
||||
|
According to the documentation at the top of zpm3ldr.z80, |
||||
|
zpmldr is normally loaded from system tracks to address |
||||
|
0x0400. In that scenario, the read of the entire sector |
||||
|
would not overlay the start of the application. So, I |
||||
|
suspect this is why this (bug?) is not relevant to many |
||||
|
implementations. |
||||
|
|
||||
|
The ZPM3LDR.REL file used here has been modified to |
||||
|
sync the rdSeq procedure back to the DIR CPMLDR version. |
||||
|
This seems to allow ZPMLDR to work with RomWBW now. |
||||
|
|
||||
|
--WBW 4:22 PM 12/8/2021 |
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,187 @@ |
|||||
|
PATCHES TO SIMEON CRAN'S ZPM3 |
||||
|
============================= |
||||
|
|
||||
|
ZPM3 is a CP/M 3 workalike written by Simeon Cran. It is readily available in |
||||
|
binary form; just look for archives like zpm3n10.arc and similar. |
||||
|
|
||||
|
This patch contains updated BNKBDOS3.SPR and RESBDOS3.SPR files although it |
||||
|
is only the banked portion which has been modified. |
||||
|
|
||||
|
Three changes have been implemented. |
||||
|
|
||||
|
1. BDOS function 152 (Parse file name) password bug |
||||
|
=================================================== |
||||
|
|
||||
|
The first change was to fix a bug identified by Tilmann Reh in the file name |
||||
|
parser invoked by BDOS function 152. Unlike the parser in standard CP/M 3, |
||||
|
Simeon's version can deal with a user number. The FCB which is filled in by |
||||
|
the parser has the following structure where the field names are those shown |
||||
|
in the CP/M 3 Programmer's Reference Manual: |
||||
|
|
||||
|
|
||||
|
Offset Field Length |
||||
|
------ ----- ------ |
||||
|
0 DR 1 Drive code (0 = current, 1 = A, ... 16 = P |
||||
|
1 NAME 8 File name |
||||
|
9 TYPE 3 File type (extension) |
||||
|
12 PM 1 Password mode |
||||
|
13 S1 1 Reserved |
||||
|
14 S2 1 Reserved |
||||
|
15 RC 1 Reserved (Result code) |
||||
|
16 PASSWORD 8 Password (encrypted) |
||||
|
24 RESERVED 8 Used by CP/M 3 |
||||
|
|
||||
|
Now the RC field gets set to FFh if an error occurs during the parse but S1 |
||||
|
and S2 are not used at all by CP/M 3. Simeon's parser uses those fields to |
||||
|
store the user number (S1) and a copy of the DR field (S2) thus rendering the |
||||
|
parser far more useful in that it can now handle names like |
||||
|
|
||||
|
K12:TESSER.CAT |
||||
|
|
||||
|
and deliver a sensible result to a user program. |
||||
|
|
||||
|
None of this is useful to other CP/M 3 implementations and so most programs do |
||||
|
their own parsing but the basic idea is commendable. However Tilmann noticed |
||||
|
that if a password is attached to a file then Simeon's parser puts it in the |
||||
|
wrong place, overwriting the four fields PM through RC. |
||||
|
|
||||
|
It is probably not a critical issue; after all, how many CP/M 3 users bother |
||||
|
to password-protect files? Nevertheless it is clearly wrong and is fixed in |
||||
|
this version of BNKBDOS3.SPR. |
||||
|
|
||||
|
2. BDOS function 152 (Parse file name) user/drive prefix |
||||
|
======================================================== |
||||
|
|
||||
|
A limitation of Simeon's parser is that it cannot handle the UD: (user, drive) |
||||
|
prefix, only the DU: form. That was annoying to me since I am just as likely |
||||
|
to type 7g:tesser.cat as g7:tesser.cat. My second patch was to fix ZPM3 to |
||||
|
handle both the UD: and DU: prefix forms. |
||||
|
|
||||
|
I also put the drive number in the S2 field even when no drive was specified |
||||
|
in the input string. Assuming that the current drive is E and the current |
||||
|
user number is 8 then the following results are obtained with the inputs |
||||
|
shown: |
||||
|
|
||||
|
Input string DR S1 S2 |
||||
|
------------ -- -- -- |
||||
|
FILE.EXT 0 8 5 |
||||
|
E:FILE.EXT 5 8 5 |
||||
|
12:FILE.EXT 0 12 5 |
||||
|
G:FILE.EXT 7 8 7 |
||||
|
G12:FILE.EXT 7 12 7 |
||||
|
12G:FILE.EXT 7 12 7 |
||||
|
|
||||
|
The interesting cases shown above are the first and third. Setting DR to zero |
||||
|
is consistent with the way standard CP/M works and the setting of S2 is just |
||||
|
extra information which may be of use to the calling program but which can |
||||
|
be ignored. Unfortunately it is not possible to do the same thing with the |
||||
|
user number because standard CP/M does not have a field for that. |
||||
|
|
||||
|
3. BDOS function 152 (Parse file name) Clear target FCB |
||||
|
======================================================= |
||||
|
|
||||
|
On 2013-09-05 a contributor to comp.os.cpm known only as "Ed" pointed out that |
||||
|
there is yet another bug in BDOS 152 in that it does not clear the record |
||||
|
number fields in the last four bytes of the FCB populated by the function. |
||||
|
A program which uses the FCB for a read or write operation without first |
||||
|
explicitly setting the fields will have the I/O operation start at some |
||||
|
unexpected position in the file. |
||||
|
|
||||
|
This problem has also been fixed. |
||||
|
|
||||
|
4. Command line editing keys |
||||
|
============================ |
||||
|
|
||||
|
A couple of years ago I added code to yaze-ag (a Z80 emulator) to make it |
||||
|
possible to use the cursor and function keys on a modern PC keyboard to do |
||||
|
sensible things in CP/M. The keyboard translations are specified in external |
||||
|
text files and can be loaded dynamically from within CP/M. |
||||
|
|
||||
|
By far the most useful translate table maps the arrow keys to WordStar |
||||
|
controls. For example, pressing the up arrow key generates a ^E, pressing |
||||
|
PgUp generates ^R and so on. This works really well in most cases but there |
||||
|
is one piece of software which gives problems, namely CP/M itself. |
||||
|
|
||||
|
Yaze-ag uses Simeon Cran's ZPM3 as a replacement for the CP/M 3 BDOS. It was |
||||
|
a good choice because ZPM3 offers more features than standard CP/M 3 and in |
||||
|
particular, it provides a rich command history facility with decent recall and |
||||
|
edit capabilities. |
||||
|
|
||||
|
As originally implemented, ZPM3 viewed the history as an upward-growing |
||||
|
stack, i.e. with new lines being added at the top. For example assume |
||||
|
that lines comprising the single words "one", "two", "three", "four" and |
||||
|
"five" are entered in sequence. The history looks like this: |
||||
|
|
||||
|
-> (current line, blank) |
||||
|
five (newest) |
||||
|
four |
||||
|
three |
||||
|
two |
||||
|
one (oldest) |
||||
|
|
||||
|
According to this view, the NEXT line in the history is the last one |
||||
|
entered. After ^W ^W ^W ^W (NEXT, NEXT, NEXT, NEXT) the view is like this: |
||||
|
|
||||
|
two (line ready for editing) |
||||
|
five (newest) |
||||
|
four |
||||
|
three |
||||
|
-> two |
||||
|
one (oldest) |
||||
|
|
||||
|
After ^E ^E (PREVIOUS, PREVIOUS) the view is: |
||||
|
|
||||
|
four (line ready for editing) |
||||
|
five (newest) |
||||
|
-> four |
||||
|
three |
||||
|
two |
||||
|
one (oldest) |
||||
|
|
||||
|
This is all very consistent. The problem is that it is utterly counter- |
||||
|
intuitive and the complete reverse of any recall and edit scheme in any |
||||
|
other operating system. For example, linux and Windows both view shell |
||||
|
command history as a stack, but one which grows downwards. The most |
||||
|
recently entered command is the one conceptually ABOVE the current line. |
||||
|
This view of the command history also corresponds to the way that we |
||||
|
compose text, where new lines are added below the most recently added |
||||
|
lines. |
||||
|
|
||||
|
Using the same five-line example as above, the initial view would be: |
||||
|
|
||||
|
one (oldest) |
||||
|
two |
||||
|
three |
||||
|
four |
||||
|
five (newest) |
||||
|
-> (current line, blank) |
||||
|
|
||||
|
After UP, UP, UP, UP the view is: |
||||
|
|
||||
|
one (oldest) |
||||
|
-> two |
||||
|
three |
||||
|
four |
||||
|
five (newest) |
||||
|
two (line ready for editing) |
||||
|
|
||||
|
then DOWN, DOWN yields: |
||||
|
|
||||
|
one (oldest) |
||||
|
two |
||||
|
three |
||||
|
-> four |
||||
|
five (newest) |
||||
|
four (line ready for editing) |
||||
|
|
||||
|
Tilman Reh recognised this as a bug when he disassembled this ZPM3. |
||||
|
It was fixed by cross-renaming the two routines NextLine and PreviousLine |
||||
|
and for WordStar compatability the NextLine routine was moved to ^W. |
||||
|
That meant the previous occupant of the ^W position, DeleteToLeft had to |
||||
|
be moved also. For no particularly good reason I chose to use the just- |
||||
|
vacated ^X slot. |
||||
|
|
||||
|
Although I cannot imagine why one would want to do so, the original ZPM3 |
||||
|
behaviour can be recovered by setting the assembly-time switch "HistoryBug" |
||||
|
to some odd number, e.g. 0FFFFh. |
||||
|
|
||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue