To accomodate the Compuserve maximum filename length of 6 characters,
I plan to name the files CPR860.BIN, OVL0.BIN, CPR860.DOC and INSTL0.DOC.
Any of these could turn out to be a conflict with an existing file, and
may thus vary slightly. The final '0', of course, will be the version
number.
(Note: the .BIN file type is necessary on Compuserve only)
In any case, the file OVL0.BIN MUST be renamed to OVERLAY.CMD, as this
is the name CPR86 will be looking for when it attempts to load it.
CPR860.BIN should be renamed to CPR860.CMD.
Installation requires about 1 minute, once you've done it a few times,
but for the first time, go slow and double check everything, because
you're probably not too familiar with DDT86 patching proceedures.
Start with a new disk that has a loader on the system tracks, CPM.SYS,
DDT86, CPR86?.CMD, and OVERLAY.CMD Then do:
DDT86 ;call up ddt86
rCPR86?.CMD ;read in cpr86 (DDT86 CPR86.CMD will not work)
You will recieve a message telling you where the program has been loaded.
This can be different on systems with different amounts of memory. On
my system I get:
START END
03D3:0000 03D3:097f
03D3 is the paragraph number (absolute addr. 3D30), and the code runs from
0000 to 097F offset from 03D3.
Write these numbers down!
Then do:
rCPM.SYS ;read in cpm also - both files now in memory
I get: START END
0443:0000 046B:30FF
Write these numbers down!
In the following steps, the numbers shown in brackets have to be changed
based on what start and end addresses you received.
Next, erase the current CCP by filling the area with 00's.
f[0443]:80,0A7F,00 ;replace the start paragraph number for CPM.SYS
Then, move the code from CPR86.CMD to CPM.SYS.
m[03D3]:80,[097F],[0443]:80
The first bracketed number is the starting paragraph for CPR86.
The second bracketed number is the end offset of CPR86 (length).
The third bracketed number is the starting paragraph for CPM.SYS.
The :80 is required because the "r" command also reads in the first sector
CMD file header, so the actual code is offset by one sector, or 80H.
Now to save the patched image of CPM.SYS, simply do:
wCPM.SYS
DDT86 knows how many "pages" to save, because CPM.SYS was the last file
loaded by the "r" command. In other words, if you rCPM.SYS first, the patch
will bomb.
Now, hit the reset button, and you're running CPR86.
Listings are included at the end of this file which show the data areas
for CPR86.CMD and OVERLAY.CMD. The patching proceedure uses
DDT86, reading in the appropriate file with the 'R' command, making the
changes with the 'S' command, then rewriting the file with the 'W'
command. Finding the exact location of the data area is a matter of
scanning through the file until you locate it. Though I'll give you some
hints.
CPR86.CMD
CPR86 (the actual CCP replacement) needs only the default search path
specified. After CPR86.CMD has been patched into CPM.SYS, use DDT86 to
read ('R') CPM.SYS. At an offset of approxamately 07A0H you'll find the
line where the path is set. Note that the default search path immediately
follows the ASCII string 'CMD'.
The default tables are in the form DU, DU, DU, DU, FF, where FF indicates
end of the path. An ascii '$' character in any D or U position signifies
the logged in disk or user for that particular path stop. In all cases,
the path automatically begins with the logged DU, so the default table
should begin with the desired second stop. D is in the form A = 0, B = 1.
U is in the form 0 thru 31, both D&U being binary numbers.(not ascii)
The path set in the distribution version is $,0,0,0,0FFh. This translates
to current disk - user 0, disk A: - user 0.
With my hard disk I use 3,0,2,0,0FFh. This translates to disk D: - user 0,
disk C: - user 0.
OVERLAY.CMD
The cursor control commands are contained in the overlay, as well as
the CHASFLG, BMFLG, FDSK and LDSK. References from ID_NUM through HI_MSG
are not supported in your version of CPR86, so they can be ignored. CPR86
is harware dependent, and it's important that you make these patches for
proper operation.
Read in OVERLAY.CMD using DDT86 and 'R' command. The clrscrnf line
begins at an offset of approx. 1040H. The FDSK - LDSK line is about
10A0H. Note the ASCII string '<-LDSK' is inserted in the data to aid in
location.
In the following, TRUE = 0FFh, and FALSE = 0
Enter the particular character strings for your terminal which will:
clrscrnf = return cursor to home and clear the screen
curupf = move cursor up one line
eosf = erase from cursor position to end of SCREEN (not line)
All sequences MUST end with the ASCII '$' character.
Current settings are for a H/Z19 or H/Z29 terminal.
To accomodate individual tastes, setting the CHASFLG true will defeat
the clear screen on DIR, and also defeat the DU login on DIR. Current
setting is false.
The BMFLG is to accomodate my block mode terminal which produces a
LF along with each CR. You probably want BMFLG false, unless your
terminal is set to produce a LF. Current setting is false.
PLENGTH and PWIDTH are the screen size, 80 characters by 24 lines.
If your terminal is different, change these numbers, but I can't
guarantee the results. NOTE THEY ARE WORD VALUES, NOT BYTES!!!
FDSK is the first hard disk to be scanned with the FIND command.
LDSK is the last hard disk to be scanned.
If you dont have a hard disk, these can be set to A: and B:, but if
you dont have a disk in B:, you will get a SELECT ERROR, or whatever
it's called.
In all cases, A=0, B=1, C=2, D=3, E=4 etc....
FDSK and LDSK are located 80H AFTER the start of the overlay data area.
They do not come right after PWIDTH. To aid in location, they are
now set to 0 and 1. (A: and B:)
We can work out any problems via CP-MIG.
GOOD LUCK
=========================================================================
;
; Data area for CPR86.A86
;
SPOT EQU $
DSEG ;so that CS: override prefixes are not generated
ORG OFFSET SPOT
;
; The following makes up a far call address block for transient program
;
TRANS DW 0 ;transient program offset (IP)
TRAN_CSEG DW 0 ;transient program code segment
;
TRAN_DSEG DW 0 ;transient program data segment
;
OVL_DSEG DW 0 ;filled in after overlay load
;
FTYPE DB 'CMD'
DFLTTAB DB $,0,0,0,0FFH,0,0,0,0,0,0 ;A=0, B=1 etc. 5 stops + FF
COMADDR DW COMBUF
STADDR DW COMBUF
COMSTRT DW COMBUF
DCNT DB 0 ;holds return code from func calls
CDISK DB 0 ;logged disk
CUSER DB 0 ;logged user
SDISK DB 0
SUSER DB 0 ;selected user
TDISK DB 0
TUSER DB 0
SUBTYPE DB 'ZIP'
COMTYP DB 'COM'
OVLNAME DB 'OVERLAY',0 ;OVERLAY.CMD auto-start
OVLFLG DB 0 ;overlay in memory flag
SWFLG DB 0
;
IF SWW
SWFCB DB 0,'SW! CMD',0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
SWCR DB 0
ENDIF
;
; Direct bios call control block
;
IOBUF DB 0
PARAMCX DW 0
PARAMDX DW 0
;
; Memory allocation information
;
MEMBASE DW 0 ;base of memory
MEMLEN DW 0 ;memory len-OVL
;
DELIMS DB ' =..:;<>,' ;delimeter string (removed '_')
;
INTR_TAB DB 'FIND' ;#8 overlay
IF BYEE
DB 'BYE ' ;#7 overlay
ENDIF
IF NOT BYEE
DB 0,0,0,0 ;cant match 4 nulls
ENDIF
DB 'ZIP ' ;#6 in CPR86 and overlay
DB 'SETP' ;#5 in CPR86
DB 'ERA ' ;#4 overlay
DB 'REN ' ;#3 "
DB 'TYPE' ;#2 "
DB 'DIRS' ;#1 "
DB 'DIR ' ;#0 "
;
;
IF SWW
MSG002 DB 'Cannot locate SW!.CMD',CR,LF,EOM
ENDIF
MSG003 DB 'CPR86 unable to load file',CR,LF,EOM
MSG004 DB 'Read error',CR,LF,EOM
MSG005 DB 'OVERLAY.CMD not found',CR,LF,EOM
MSG010 DB 'CPR86 requires contiguous memory',CR,LF,EOM
MSG011 DB LF,'Enter up to 5 path stops',CR,LF,EOM
MSG012 DB 'Incorrect format, path erased',CR,LF,EOM
;
; command file control block
;
FCB DB 0 ;disk request
DB ' ' ;11 spaces
DB 0,0,0,0 ;4 zeros
FCB1 DB 0
DB ' ' ;11 more spaces (rename format)
DB 0,0,0,0 ;4 zeros (1+11+5+11+4 = 32)
FCBCR DB 0 ;current record to read/write
RANDRN DW 0 ;random record number
RANDOF DB 0 ;random rec overflow
;
; getcom buffer, can double as stack area, since only used after SP reset.
;
COMBUF1 DB 81 ;aux combuf
DB 0
BUFF RB 81
DB 0 ;this reserves memory for combuf
;
; end
========================================================================
The following is the partial data area for OVERLAY.CMD. Note this program
was produced in object module format using RASM86 and LINK86, and
contains both a code and data segment. It might look different to
you under DDT86 than a 'normal' 8080 model program.
;---------------------------------------------------------------------------
ID_NUM DW 0 ;0 to 64K random record number
PASSWORD RB 8 ;8 byte password
LAST_ON RB 10 ;ie. 09:45 03/30/84
START RB 4 ;ie. 10:45
FINISH RB 4 ;ie. 11:45
TOTAL RB 4 ;ie 1+00 this will be cumulative
HI_MSG DW 0 ;ie. msg 1 thru 64k
MAXDSK DB 16 ;maximum disk access A = 0, B = 1 etc
;
CLRSCRNF DB ESC,'E','$',0,0 ;clear screen, cursor home.
CURUPF DB ESC,'A','$',0,0 ;cursor up one line.
EOSF DB ESC,'J','$',0,0 ;erase from cursor to end of SCREEN.
CHASFLG DB 0 ;set to 0FFH to defeat dir login, else 0.
BMFLG DB 0 ;set to 0FFH for block mode, else 0.
PLENGTH DW 24
PWIDTH DW 80
;
ORG 80H ;base page is not included in org statement using
; ;LINK86. Actual ORG here is 180H.
FDSK DB 0 ;first hard disk A=0, B=1 etc
LDSK DB 1 ;last hard disk
db '<-LDSK' ;to aid in location
The data shown from ID_NUM through MAXDSK is not used in CPR860, and can be
ignored.