Browse Source

Merge remote-tracking branch 'upstream/master'

pull/80/head
curt mayer 6 years ago
parent
commit
da9520466d
  1. BIN
      Doc/CPM Manual.pdf
  2. 2
      Doc/ChangeLog.txt
  3. BIN
      Doc/Contrib/Microsoft NASCOM BASIC.docx
  4. 146
      Doc/Nascom.txt
  5. BIN
      Doc/cpm3_command_guide.pdf
  6. BIN
      Doc/cpm3_programmers_guide.pdf
  7. BIN
      Doc/cpm3_system_guide.pdf
  8. BIN
      Doc/cpm3_users_guide.pdf
  9. 2
      ReadMe.txt
  10. 139
      Source/Apps/SysCopy.asm
  11. 15
      Source/BPBIOS/@WBW Issues.txt
  12. 2
      Source/BPBIOS/Build.cmd
  13. 4
      Source/BPBIOS/cboot-ww.z80
  14. 62
      Source/BPBIOS/hbios.z80
  15. 2
      Source/CBIOS/ver.inc
  16. 2
      Source/CPM22/loader.asm
  17. 2
      Source/CPM22/ver.inc
  18. 28
      Source/CPM3/Build.cmd
  19. 1
      Source/CPM3/Clean.cmd
  20. 88
      Source/CPM3/biosldr.z80
  21. 11
      Source/CPM3/boot.z80
  22. 17
      Source/CPM3/diskio.z80
  23. 7
      Source/CPM3/ldropts.lib
  24. 228
      Source/CPM3/loader.asm
  25. 7
      Source/CPM3/optcmd.lib
  26. 7
      Source/CPM3/optdsk.lib
  27. 2
      Source/CPM3/ver.inc
  28. 4
      Source/HBIOS/nascom.asm
  29. 62
      Source/HBIOS/romldr.asm
  30. 2
      Source/HBIOS/ver.inc
  31. 10
      Source/Images/Build.cmd
  32. 1
      Source/Images/d_bp.txt
  33. 6
      Source/Images/d_cpm22.txt
  34. 1
      Source/Images/d_cpm3.txt
  35. 7
      Source/Images/d_nzcom.txt
  36. 4
      Source/Images/d_zpm3.txt
  37. 6
      Source/Images/d_zsdos.txt
  38. 20
      Source/ZPM3/Build.cmd
  39. 3
      Source/ZPM3/Clean.cmd
  40. 228
      Source/ZPM3/loader.asm
  41. 2
      Source/ZSDOS/ver.inc

BIN
Doc/CPM Manual.pdf

Binary file not shown.

2
Doc/ChangeLog.txt

@ -47,6 +47,8 @@ Version 2.9.2
- D?R: Contributed SC126 How-To: Preparing a MicroSD Card to Transfer Files to/from a Linux System
- PMS: Updated romldr to handle more than 9 drives
- PMS: Added "user" rom module template
- PMS: Added CP/M 3 manuals
- WBW: Boot from any slice
Version 2.9.1
-------------

BIN
Doc/Contrib/Microsoft NASCOM BASIC.docx

Binary file not shown.

146
Doc/Nascom.txt

@ -1,146 +0,0 @@
NASCOM 2 BASIC (C) 1978 MICROSOFT AS IMPLEMENTED FOR RETROBREWCOMPUTERS
FUNCTIONS:
SGN
INT
ABS
USR
FRE
INP
POS
SQR
RND
LOG
EXP
COS
SIN
TAN
ATN
PEEK
DEEK
POINT
LEN
STR
VAL
ASC
CHR$
HEX$
BIN$
LEFT$
RIGHT$
MID$
RESERVED WORDS:
END
FOR
NEXT
DATA
INPUT
DIM
READ
LET
GOTO
RUN
IF
RESTORE
GOSUB
RETURN
REM
STOP
OUT
ON
NULL
WAIT
DEF
POKE
DOKE
LINES
CLS
WIDTH
BYE
SET
RESET
PRINT
CONT
LIST
CLEAR
PLAY
REM
NEW
PRINT
TAB
TO
FN
SPC
THEN
NOT
STEP
?
OPERATORS:
+ PLUS
- MINUS
* MULTIPLY
/ DIVIDE
AND LOGICAL AND
OR LOGICAL OR
> GREATER THAN
= EQUALS
< LESS THAN
^ POWER
EXPRESSION PRECEDENCE:
() EXPRESSIONS IN ()
^ POWER
- NEGATION
* / MULTIPLICATION AND DIVISION
+ - ADDITION AND SUBTRACTION
= EQUALS
<> NOT EQUAL
< LESS THAN
> GREATER THAN
<= =< LESS THAN OR EQUAL TO
>= => GREATER THAN OR EQUAL TO
NOT LOGICAL, BITWISE NEGATION
AND LOGICAL, BITWISE AND
OR LOGICAL, BITWISE OR
VARIABLES:
NO LENGTH LIMIT BUT ONLY FIRST TWO CHARACTERS ARE SIGNIFICANT.
CANNOT HAVE THE SAME NAME AS RESERVED WORDS.
MAY BE AN ARRAY.
ERROR CODE:
NF NEXT without FOR
SN Syntax error
RG RETURN without GOSUB
OD Out of DATA
FC Illegal function call
OV Overflow error
OM Out of memory
UL Undefined line
BS Bad subscript
DD Re-DIMensioned array
/0 Division by zero
ID Illegal direct
TM Type mis-match
OS Out of string space
LS String too long
ST String formula too complex
CN Can't CONTinue
UF Undefined FN function
MO Missing operand
HX HEX error
BN BIN error
LINE EDITING COMMANDS:
@ KILL CURRENT LINE
_ NONDESTRUCTIVE DELETE LAST CHARACTER

BIN
Doc/cpm3_command_guide.pdf

Binary file not shown.

BIN
Doc/cpm3_programmers_guide.pdf

Binary file not shown.

BIN
Doc/cpm3_system_guide.pdf

Binary file not shown.

BIN
Doc/cpm3_users_guide.pdf

Binary file not shown.

2
ReadMe.txt

@ -7,7 +7,7 @@
***********************************************************************
Wayne Warthen (wwarthen@gmail.com)
Version 2.9.2-pre.29, 2020-02-08
Version 2.9.2-pre.31, 2020-02-18
https://www.retrobrewcomputers.org/
RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for

139
Source/Apps/SysCopy.asm

@ -1,6 +1,6 @@
;===============================================================================
; SysCopy - Copy System Image to/from reserved tracks of disk for RomWBW
; adaptation of CP/M 2.2
; adaptation of CP/M 2.2 & CP/M 3
;===============================================================================
;
; Author: Wayne Warthen (wwarthen@gmail.com)
@ -16,6 +16,7 @@
;
; Change Log:
; 2016-04-24 [WBW] Updated to preserve MBR partition table
; 2020-02-17 [WBW] Updated for CP/M 3
;_______________________________________________________________________________
;
; ToDo:
@ -27,6 +28,9 @@
; Definitions
;===============================================================================
;
false .equ 0 ; define true
true .equ ~false ; define false
;
stksiz .equ $40 ; we are a stack pig
;
restart .equ $0000 ; CP/M restart vector
@ -86,6 +90,18 @@ main:
init:
; add check for RomWBW?
;
; get OS version
ld c,12 ; BDOS get os version
call bdos ; do it, L=version
cp $30 ; Test for v3.0
jr c,init1 ; if <, pre v3.0
ld a,true ; OS v3.0 or above
ld (v3os),a ; save it
jr init2
init1:
ld a,false ; OS < v3.0
ld (v3os),a ; save it
init2:
; locate cbios function table address
ld hl,(restart+1) ; load address of CP/M restart vector
ld de,-3 ; adjustment for start of table
@ -96,6 +112,20 @@ init:
call bdos ; invoke BDOS function
inc a ; 1-based index for fcb
ld (defdrv),a ; save it
; print version banner
call crlf ; formatting
ld de,msgban1 ; point to version message part 1
call prtstr ; print it
ld a,(v3os) ; get OS version flag
or a ; set flags
ld de,msgv2 ; point to V2 mode message
call z,prtstr ; if V2, say so
ld de,msgv3 ; point to V3 mode message
call nz,prtstr ; if V3, say so
call crlf ; formatting
ld de,msgban2 ; point to version message part 2
call prtstr ; print it
call crlf ; formatting
; return success
xor a
ret
@ -237,7 +267,7 @@ wrfil1: ; create target file
; write the image
ld a,$15 ; setup for bdos write sequential
ld (rwfun),a ; save bdos function
ld a,(imgsiz) ; number of records to read
ld a,(imgsiz) ; number of records to write
ld (reccnt),a ; init record counter
ld hl,imgbuf ; start of buffer
ld (bufptr),hl ; init buffer pointer
@ -292,10 +322,8 @@ rddsk:
call setdsk ; setup disk
ret nz ; abort on error
; set function to read
ld hl,(cbftbl) ; get address of CBIOS function table
ld a,$27 ; $27 is CBIOS READ entry offset
call addhl ; set HL to resultant entry point
ld (actfnc),hl ; save it
ld a,13 ; CBIOS func 13: Read
ld (actfnc),a ; save it
; read the header
ld a,12 ; start with 1536 byte header (12 records)
ld (reccnt),a ; initialize record counter
@ -339,11 +367,10 @@ wrdsk:
ld hl,mbrbuf ; override to read
ld (bufptr),hl ; ... into MBR buffer
ld a,4 ; 4 records = 1 512 byte sector
ld (reccnt),a ; initialize record counter
; set function to read
ld hl,(cbftbl) ; get address of CBIOS function table
ld a,$27 ; $27 is CBIOS READ entry offset
call addhl ; set HL to resultant entry point
ld (actfnc),hl ; save it
ld a,13 ; CBIOS func 13: Read
ld (actfnc),a ; save it
; read the existing MBR into memory
call rwdsk ; read the sector
ret nz ; abort on error
@ -366,10 +393,8 @@ wrdsk1: ; setup to write the image from memory to disk
call setdsk ; setup disk
ret nz ; abort on error
; set function to write
ld hl,(cbftbl) ; get address of CBIOS function table
ld a,$2A ; $2A is CBIOS WRITE entry offset
call addhl ; set HL to resultant entry point
ld (actfnc),hl ; save it
ld a,14 ; CBIOS func 14: Write
ld (actfnc),a ; save it
; setup the record count to write
ld a,(imgsiz) ; get previously recorded image size
ld (reccnt),a ; save it as pending record count
@ -399,7 +424,8 @@ setdsk:
ld c,a ; move to c
ld e,0 ; treat as first select
call cbios ; invoke cbios with...
.db $1B ; SELDSK entry offset
;.db $1B ; SELDSK entry offset
.db 9 ; SELDSK entry offset
; check return (sets HL to DPH address)
ld a,h
or l
@ -436,29 +462,47 @@ setdsk:
; Read or write (reccnt) sectors to/from disk via CBIOS
;
rwdsk:
ld hl,128 ; assume rec len for < CP/M 3
ld (reclen),hl ; and save it
ld a,(v3os) ; CP/M 3 or greater?
or a ; set flags
jr z,rwdsk0 ; if not, continue
; adjust reccnt, logical (128) to physical (512)
ld a,(reccnt) ; get pending rec cnt
add a,3 ; round up
srl a ; shift to
srl a ; ... divide by 4
ld (reccnt),a ; and resave it
ld hl,512 ; use physical rec len
ld (reclen),hl ; and save it
rwdsk0:
; setup to read/write a sector
ld bc,(acttrk) ; get active track
call cbios ; invoke cbios with...
.db $1E ; SETTRK entry offset
;.db $1E ; SETTRK entry offset
.db 10 ; SETTRK entry offset
ld bc,(actsec) ; get active sector
call cbios ; invoke cbios with...
.db $21 ; SETSEC entry offset
;.db $21 ; SETSEC entry offset
.db 11 ; SETSEC entry offset
ld bc,(bufptr) ; get active buffer pointer
call cbios ; invoke cbios with...
.db $24 ; SETDMA entry offset
;.db $24 ; SETDMA entry offset
.db 12 ; SETDMA entry offset
; read/write sector
ld a,(reccnt) ; get the pending record count
dec a ; last record?
ld c,2 ; allow cached writes by default
jr nz,rwdsk1 ; not last record, continue
ld c,1 ; last record, no caching please
rwdsk1: ld hl,(actfnc) ; load the CBIOS function vector
call jphl ; indirect call (read or write)
rwdsk1:
ld a,(actfnc)
call cbiosfn
or a ; set flags on return code
jp nz,errio ; if not zero, error abort
; adjust buffer pointer
ld hl,(bufptr) ; get buffer pointer
ld de,128 ; record length is 128 bytes
ld de,(reclen) ; get rec len
add hl,de ; adjust buffer ptr for next record
ld (bufptr),hl ; save it
; next sector
@ -479,7 +523,7 @@ rwdsk1: ld hl,(actfnc) ; load the CBIOS function vector
rwdsk2: ld hl,reccnt
dec (hl) ; decrement pending record count
ret z ; if zero, done, return with Z set
jr rwdsk ; otherwise, loop
jr rwdsk0 ; otherwise, loop
;
jphl: jp (hl) ; indirect jump
;
@ -656,6 +700,15 @@ chkfcb4:
or a ; set flags
ret
;
; Print dot
;
prtdot:
push af
ld a,'.'
call prtchr
pop af
ret
;
; Print character in A without destroying any registers
;
prtchr:
@ -775,13 +828,37 @@ delim1:
;
cbios:
ex (sp),hl
ld a,(hl) ; get the function offset
ld a,(hl) ; get the function number
inc hl ; point past value following call instruction
ex (sp),hl ; put address back at top of stack and recover HL
cbiosfn:
; enter here if function already in reg A
ld (bpb_fn),a ; save function
;
ld a,(v3os) ; CP/M 3 or greater?
or a ; set flags
jr nz,cbios2 ; if >= V3, handle it
;
; CBIOS call for CP/M < v3
ld a,(bpb_fn) ; get pending function number
ld l,a ; function number to L
add a,l ; ... and multiply by 3 for
add a,l ; ... jump table offset
ld hl,(cbftbl) ; address of CBIOS function table to HL
call addhl ; determine specific function address
jp (hl) ; invoke CBIOS
;
cbios2:
; CBIOS call for CP/M v3 or greater
ld (bpb_bc),bc
ld (bpb_de),de
ld (bpb_hl),hl
ld c,50 ; direct bios call function number
ld de,bpb ; BIOS parameter block
jp bdos ; return via BDOS call
;
; Add the value in A to HL (HL := HL + A)
;
addhl:
@ -862,10 +939,24 @@ actdsk .db 0 ; active disk no
acttrk .dw 0 ; active track
actsec .dw 0 ; active sector
actspt .dw 0 ; active sectors per track
actfnc .dw 0 ; active function (read or write)
actfnc .db 0 ; active cbios i/o function (read or write)
v3os .db 0 ; true ($FF) if OS v3.0 or greater
reclen .dw 0 ; active record length
;
bpb: ; BIOS parameter block for CP/M 3 BIOS calls
bpb_fn .db 0 ; function
bpb_a .db 0 ; reg A
bpb_bc .dw 0 ; reg BC
bpb_de .dw 0 ; reg DE
bpb_hl .dw 0 ; reg HL
;
; Messages
;
msgban1 .db "SYSCOPY v2.0 for RomWBW CP/M, 17-Feb-2020$"
msgv2 .db " (CP/M 2 Mode)$"
msgv3 .db " (CP/M 3 Mode)$"
msgban2 .db "Copyright 2020, Wayne Warthen, GNU GPL v3$"
msguse .db "Usage: SYSCOPY <dest>[=<source>]$"
msgamb .db "Ambiguous file specification not allowed$"
msgdlm .db "Invalid delimiter$"

15
Source/BPBIOS/@WBW Issues.txt

@ -0,0 +1,15 @@
Loader uses CBIOS Disk I/O prior to CBOOT/WBOOT being run. As a
result, DIOBUF is not properly initialized. At present, it is
initialized to $7C00 which will work unless the location of the
physical disk buffer in HBIOS ever changes!
The clock drivers supplied with BPBIOS (LDDS, LDP2D, and LDNZT)
load into ZSYS user memory. If the user segment is not at the
same location as the original BPBIOS ($E900), then the clock
driver will just overlay other code. At present, the N config
is OK because it does not relocate the user segment, but the T
config fails because it uses a user segment at $E700. Note that
this does not affect ZSDOS2 variants because they do not require
a loadable clock driver.
BPBIOS needs to assign disk units dynamically via discovery of disk type

2
Source/BPBIOS/Build.cmd

@ -59,6 +59,8 @@ rem if exist bpbio-ww.rel del bpbio-ww.rel
zx ZMAC -BPBIO-WW -/P
if exist bp%VER%.prn del bp%VER%.prn
ren bpbio-ww.prn bp%VER%.prn
ren bpbio-ww.err bp%VER%.err
copy bpbio-ww.rel bp%VER%.rel
rem pause

4
Source/BPBIOS/cboot-ww.z80

@ -304,7 +304,7 @@ MEMOK:
IF MOVCPM ; Space is critical for boot tracks
DEFB CR,LF,'P112 - ' ; Save all bytes possible
ELSE ; Otherwise sign on with complete name
DEFB CR,LF,'D-X Designs P112 - '
DEFB CR,LF,'RomWBW - '
ENDIF
DEFB 'B/P 50.00k Bios' ;**** Do NOT alter this string ****
@ -322,7 +322,7 @@ MEMOK:
DEFB ' ZCPR3+ Env'
IF CLOCK
IF DS1202
DEFB CR,LF,' Dallas DS-1202 Clock, '
DEFB CR,LF,' RomWBW HBIOS Clock, '
IF CLKSET
DEFB 'with '
ELSE

62
Source/BPBIOS/hbios.z80

@ -115,7 +115,7 @@ HBX_INIT:
LD (HB_SRCBNK),A
LD (HB_DSTBNK),A
IF BANKED
IF BANKED
; Copy vectors from TPA page zero to SYS page zero
LD BC,(TPABNK) ; C := TPABNK, B := SYSBNK
@ -127,8 +127,68 @@ HBX_INIT:
LD A,(TPABNK) ; Set all Bank regs to TPA
ENDIF
; CSEG
;ORG_CSEG EQU $
; DSEG
;ORG_DSEG EQU $
IF BANKED
COMMON /BANK2/
ORG_BANK2 EQU $
COMMON /B2RAM/
ORG_B2RAM EQU $
ENDIF
CSEG
CALL NEWLINE2
LD DE,HB_STR_TAG
CALL WRITESTR
IF INTPXY
LD DE,HB_STR_INTPXY
ELSE
LD DE,HB_STR_EXTPXY
ENDIF
CALL WRITESTR
CALL NEWLINE
LD DE,HB_STR_CSEG
CALL WRITESTR
LD BC,BIOSJT
CALL PRTHEXWORD
LD DE,HB_STR_DSEG
CALL WRITESTR
LD BC,CBOOT
CALL PRTHEXWORD
IF BANKED
LD DE,HB_STR_BANK2
CALL WRITESTR
LD BC,ROMJT
CALL PRTHEXWORD
LD DE,HB_STR_B2RAM
CALL WRITESTR
LD BC,CBOOT0
CALL PRTHEXWORD
LD DE,HB_STR_RESVD
CALL WRITESTR
LD BC,ALV$50
CALL PRTHEXWORD
ENDIF
CALL NEWLINE
RET
HB_STR_TAG DB "HBIOS: $"
HB_STR_INTPXY DB "Internal Proxy$"
HB_STR_EXTPXY DB "External Proxy$"
HB_STR_CSEG DB "CSEG=$"
HB_STR_DSEG DB ", DSEG=$"
HB_STR_BANK2 DB ", BANK2=$"
HB_STR_B2RAM DB ", B2RAM=$"
HB_STR_RESVD DB ", RESVD=$"
HBX_XCOPY:
LD A,C

2
Source/CBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9
#DEFINE RUP 2
#DEFINE RTP 0
#DEFINE BIOSVER "2.9.2-pre.29"
#DEFINE BIOSVER "2.9.2-pre.31"

2
Source/CPM22/loader.asm

@ -1,5 +1,5 @@
;===============================================================================
; BL.ASM
; LOADER.ASM
;
; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS.
;

2
Source/CPM22/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9
#DEFINE RUP 2
#DEFINE RTP 0
#DEFINE BIOSVER "2.9.2-pre.29"
#DEFINE BIOSVER "2.9.2-pre.31"

28
Source/CPM3/Build.cmd

@ -3,25 +3,31 @@ setlocal
set TOOLS=../../Tools
set PATH=%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
set TASMTABS=%TOOLS%\tasm32
set ZXBINDIR=%TOOLS%/cpm/bin/
set ZXLIBDIR=%TOOLS%/cpm/lib/
set ZXINCDIR=%TOOLS%/cpm/include/
rem cmd
rem CPM Loader
echo.
echo.
echo *** CPM Loader ***
echo.
zx RMAC -CPMLDR
copy optdsk.lib ldropts.lib
zx Z80ASM -BIOSLDR/MF
zx LINK -CPMLDR[L100]=CPMLDR,BIOSLDR
move /Y biosldr.rel biosldrd.rel
zx LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD
move /Y cpmldrd.com cpmldr.bin
copy optcmd.lib ldropts.lib
zx Z80ASM -BIOSLDR/MF
move /Y biosldr.rel biosldrc.rel
zx LINK -CPMLDRC[L100]=CPMLDR,BIOSLDRC
move /Y cpmldrc.com cpmldr.com
rem pause
rem Resident CPM3
echo.
echo.
echo *** Resident CPM3 BIOS ***
@ -41,7 +47,6 @@ zx GENCPM -AUTO -DISPLAY
copy cpm3.sys cpm3res.sys
rem pause
rem Banked CPM3
echo.
echo.
echo *** Banked CPM3 BIOS ***
@ -61,7 +66,6 @@ zx GENCPM -AUTO -DISPLAY
copy cpm3.sys cpm3bnk.sys
rem pause
rem Banked ZPM3
echo.
echo.
echo *** Banked ZPM3 BIOS ***
@ -82,9 +86,17 @@ rem copy cpm3.sys zpm3.sys
rem pause
rem *** Resident ***
rem copy cpm3res.sys cpm3.sys
rem copy genres.dat getcpm.dat
rem *** Banked ***
copy cpm3bnk.sys cpm3.sys
copy genbnk.dat gencpm.dat
rem Loader
tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst
copy /b loader.bin + cpmldr.bin cpmldr.sys

1
Source/CPM3/Clean.cmd

@ -10,5 +10,6 @@ if exist *.err del *.err
if exist *.lst del *.lst
if exist *.sym del *.sym
if exist *.sys del *.sys
if exist *.bin del *.bin
if exist gencpm.dat del gencpm.dat
if exist options.lib del options.lib

88
Source/CPM3/biosldr.z80

@ -1,4 +1,6 @@
maclib ldropts.lib
maclib cpm3.lib
cseg
@ -50,16 +52,13 @@
jp 0 ; reserved for future expansion
boot:
;ld bc,0F8E0h ; HBIOS func: get boot info
;call 0FFF0h ; do it, D := boot unit
;ld a,d ; move to A
;ld (unit),a ; save it
;ret
if cmdline
boot1:
ld (stksav),sp
ld sp,stack
boot1:
ld de,prompt
call writestr
@ -86,12 +85,21 @@ boot1:
ld l,0 ; Bank
call 0FFF0h ; do it
else
ld bc,0F8E0h ; HBIOS func: get boot info
call 0FFF0h ; do it, D := boot unit, E: := slice
ld a,d ; move unit to A
ld (unit),a ; save it
ld a,e ; move slice to A
ld (slice),a ; save it
endif
ld a,(unit) ; Get boot unit
ld c,a ; put in C
ld b,18h ; HBIOS Media function
ld e,1 ; Enabled media check/discovery
ld e,1 ; Enable media check/discovery
call 0FFF0H ; HBIOS call
ld a,e ; Resultant media id to accum
or a ; Set flags
@ -110,7 +118,6 @@ dsk$login1:
; hl is ptr to desired dpb
ld de,dph0 ; load DPH pointer
;halt
ex de,hl ; de = DPB adr, hl = DPH adr
push de ; save DPB adr
ld de,12 ; offset of DPB in DPH
@ -166,23 +173,48 @@ setdma:
ld (dma),bc
ret
read:
; Seek
ld a,(unit) ; get unit
ld c,a ; BIOS Disk Unit in C
ld b,12H ; HBIOS SEEK function
push bc ; save it
;push de ; save XDPH pointer
ld b,17h ; HBIOS DEVICE function
rst 08 ; Do it, D=device type
ld a,d ; put in accum
and 0F0h ; isolate high bits
ld b,1 ; assume it is floppy, 1 head bit
ld c,01h ; 1 bit head mask
cp 10h ; floppy?
jr z,seek0 ; yup, skip ahead
ld b,4 ; must be hard disk, 4 head bits
ld c,0Fh ; 4 bit head mask
seek0:
;pop de ; recover XDPH pointer
push bc ; save bc
ld a,(slice) ; get slice
ld e,a ; slice to E
ld h,65 ; number of tracks per slice
call mult8 ; HL now has track offset for slice
pop bc ; recover bc
push hl ; save track offset for now
ld hl,(trk) ; get track value
ld a,l ; lsb of track to a
and 0FH ; isolate head in low 4 bits
ld d,a ; stuff it in d
ld a,(sect) ; get sector
ld e,a ; stuff it in e
ld b,4 ; prepare to shift out 4 bit head value
read1:
and c ; apply mask
ld d,a ; save in d
seek1:
srl h ; shift one bit out
rr l ; ... of hl
djnz read1 ; do all 4 bits
ld b,12h ; HBIOS seek
ld a,(unit) ; get boot unit
ld c,a ; put in C
djnz seek1 ; do all bits
ld a,(sect) ; get sector
ld e,a ; stuff it in e
ex de,hl ; de=track, hl=head/sect
ex (sp),hl ; save head/sect, hl = offset
add hl,de ; hl has final track value
pop de ; recover head/sect to de
pop bc ; recover function & unit
;rst 08 ; perform seek
call 0FFF0H
; Read Sector
ld b,13h ; HBIOS read
ld a,(unit) ; get boot unit
@ -282,6 +314,23 @@ writestr2:
pop af
ret
;
; multiply 8-bit values
; in: multiply h by e
; out: hl = result, e = 0, b = 0
;
mult8:
ld d,0
ld l,d
ld b,8
mult8_loop:
add hl,hl
jr nc,mult8_noadd
add hl,de
mult8_noadd:
djnz mult8_loop
ret
prompt db 13,10,'Boot CP/M 3 from Disk Unit: $'
crlf db 13,10,'$'
@ -443,6 +492,7 @@ dtabcb: db 0ffh ; drv
dw dtabuf ; buffad
unit ds 1 ; HBIOS unit number
slice ds 1 ; HBIOS slice number
trk ds 2 ; current track
sect ds 2 ; current sector
dma ds 2 ; current DMA address

11
Source/CPM3/boot.z80

@ -3,7 +3,7 @@
maclib options.lib
public ?init,?ldccp,?rlccp,?time
public @bootdu
public @bootdu,@bootsl
extrn ?pmsg,?conin
extrn ?mvinit,?bnkxlt,?xmove,?move
extrn @civec,@covec,@aivec,@aovec,@lovec
@ -60,9 +60,11 @@ init$2:
; Get boot disk unit and save it
ld bc,0F8E0h ; HBIOS func: get boot info
rst 08 ; do it, D := boot unit
ld a,d ; move to A
rst 08 ; do it, D := boot unit, E: := boot slice
ld a,d ; move boot unit to A
ld (@bootdu),a ; save it
ld a,e ; move boot slice to A
ld (@bootsl),a ; save it
call dinit
ret
@ -720,7 +722,8 @@ fcb$nr db 0,0,0
endif
@bootdu db 0
@bootdu db 0 ; boot disk unit
@bootsl db 0 ; boot slice
hdspv db 2 ; slices per volume for hard disks (must be >= 1)
drvlst ds 32 ; active drive list used durint drv_init
drvlstc db 0 ; entry count for active drive list

17
Source/CPM3/diskio.z80

@ -14,7 +14,7 @@
; Linked BIOS variables
public @sysdr
extrn @bootdu
extrn @bootdu,@bootsl
; Variables containing parameters passed by BDOS
@ -323,18 +323,19 @@ dpb_fd111: ; 8" DS/DD Floppy Drive (1.11M)
; called for first time initialization.
dsk$init:
ld a,(@rdrv) ; unit being initialized
ld hl,@bootdu
cp (hl) ; compare to boot unit
ret nz ; done if no match
inc de ; point to slice in XDPH
inc de
inc de
ld a,(de) ; get slice
or a ; set flags
ld hl,@bootsl
cp (hl) ; compare to boot slice
ret nz ; done if not zero
ld a,(@rdrv) ; unit being initialized
ld hl,@bootdu
cp (hl)
ret nz ; done if no match
ld a,(@adrv) ; get cp/m drive
ld (@sysdr),a ; and save it
ret
@ -531,7 +532,7 @@ seek1:
ld a,(@sect) ; get sector
ld e,a ; stuff it in e
ex de,hl ; de=track, hl=head/sect
ex (sp),hl ; save head/sect, hl = offset
ex (sp),hl ; save head/sect, hl = offset
add hl,de ; hl has final track value
pop de ; recover head/sect to de
pop bc ; recover function & unit

7
Source/CPM3/ldropts.lib

@ -0,0 +1,7 @@
; global assembler options for CP/M loader
; when loading from a command line
true equ -1
false equ not true
cmdline equ true

228
Source/CPM3/loader.asm

@ -0,0 +1,228 @@
;===============================================================================
; LOADER.ASM
;
; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS.
;
; CP/M DISK FORMATS ALLOW FOR RESERVED TRACKS THAT CONTAIN AN IMAGE OF THE
; OPERATING SYSTEM TO BE LOADED WHEN THE DISK IS BOOTED. THE OPERATING SYSTEM
; IMAGE ITSELF IS NORMALLY PREFIXED BY A 1-N SECTORS CONTAINING OS BOOTSTRAP
; CODE AND DISK METADATA.
;
; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE
; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES):
;
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
; PARTITION TABLE, AND BOOT SIGNATURE
; SECTOR 2: RESERVED
; SECTOR 3: METADATA
;
; THE HARDWARE BIOS IS EXPECTED TO READ AND LOAD THE FIRST TWO SECTORS FROM THE
; DISK TO MEMORY ADDRESS $8000 AND JUMP TO THAT LOCATION TO BEGIN THE BOOT
; PROCESS. THE BIOS IS EXPECTED TO VERIFY THAT A STANDARD BOOT SIGNATURE
; OF $55, $AA IS PRESENT AT OFFSET $1FE-$1FF. IF THE SIGNATURE IS NOT FOUND,
; THE BIOS SHOULD ASSUME THE DISK HAS NOT BEEN PROPERLY INITIALIZED AND SHOULD
; NOT JUMP TO THE LOAD ADDRESS.
;
;===============================================================================
;
#INCLUDE "../HBIOS/ver.inc"
;
SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS
SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
SYS_END .EQU $1480 ; ENDING ADDRESS OF SYSTEM IMAGE
;
BYT .EQU 1 ; used to describe METADATA_SIZE below
WRD .EQU 2
;
SECTOR_SIZE .EQU 512
BLOCK_SIZE .EQU 128
PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS
METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below)
;
PARTTBL_LOC .EQU $1BE
PARTTBL_SIZ .EQU $40
BOOTSIG_LOC .EQU $1FE
;
;-------------------------------------------------------------------------------
; SECTOR 1
;
; THIS SECTOR FOLLOWS THE CONVENTIONS OF AN IBM-PC MBR CONTAINING THE OS
; BOOTSTRAP CODE, PARTITION TABLE, AND BOOT SIGNATURE
;
;----------------------------------------------------------------------------
;
; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING
; ADDRESS OF $8000.
;
.ORG $8000
JR BOOT
;
BOOT:
LD DE,STR_LOAD ; LOADING STRING
CALL PRTSTR ; PRINT
CALL PRTDOT ; PROGRESS
;
LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
CALL $FFFD ; CALL UNA
JR NZ,ERROR ; HANDLE ERROR
CALL PRTDOT ; PROGRESS
LD B,L ; MOVE BOOT UNIT ID TO B
;
LD C,$41 ; UNA FUNC: SET LBA
LD DE,0 ; HI WORD ALWAYS ZERO
LD HL,3 ; IMAGE STARTS AT FOURTH SECTOR
CALL $FFFD ; SET LBA
JR NZ,ERROR ; HANDLE ERROR
CALL PRTDOT ; PROGRESS
;
LD C,$42 ; UNA FUNC: READ SECTORS
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
LD L,22 ; READ 22 SECTORS
CALL $FFFD ; DO READ
JR NZ,ERROR ; HANDLE ERROR
CALL PRTDOT ; PROGRESS
;
LD DE,STR_DONE ; DONE MESSAGE
CALL PRTSTR ; PRINT IT
;
LD D,B ; PASS BOOT UNIT TO OS
LD E,0 ; ASSUME LU IS ZERO
JP SYS_ENT ; GO TO SYSTEM
;
PRTCHR:
PUSH BC
PUSH DE
LD BC,$0012 ; UNIT 0, WRITE CHAR
LD E,A ; CHAR TO PRINT
CALL $FFFD ; PRINT
POP DE
POP BC
RET
;
PRTSTR:
PUSH BC
PUSH HL
LD BC,$0015 ; UNIT 0, WRITE CHARS UNTIL TERMINATOR
LD L,0 ; TERMINATOR IS NULL
CALL $FFFD ; PRINT
POP HL
POP BC
RET
;
PRTDOT:
LD A,'.' ; DOT CHARACTER
JR PRTCHR ; PRINT AND RETURN
;
; PRINT THE HEX BYTE VALUE IN A
;
PRTHEXBYTE:
PUSH AF
PUSH DE
CALL HEXASCII
LD A,D
CALL PRTCHR
LD A,E
CALL PRTCHR
POP DE
POP AF
RET
;
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
;
HEXASCII:
LD D,A
CALL HEXCONV
LD E,A
LD A,D
RLCA
RLCA
RLCA
RLCA
CALL HEXCONV
LD D,A
RET
;
; CONVERT LOW NIBBLE OF A TO ASCII HEX
;
HEXCONV:
AND 0FH ;LOW NIBBLE ONLY
ADD A,90H
DAA
ADC A,40H
DAA
RET
;
ERROR:
LD DE,STR_ERR ; POINT TO ERROR STRING
CALL PRTSTR ; PRINT IT
HALT ; HALT
;
; DATA
;
STR_LOAD .DB "\r\nLoading",0
STR_DONE .DB "\r\n",0
STR_ERR .DB " Read Error!",0
;
.ORG $ - $8000 ; RESTORE ORG
.FILL PARTTBL_LOC - $ ; FILL TO START OF PARTITION TABLE
;
; RESERVE SPACE FOR STANDARD IBM-PC PARTITION TABLE. ALTHOUGH A
; PARTITION TABLE IS NOT RELEVANT FOR A FLOPPY DISK, IT DOES NO HARM.
; THE CONTENTS OF THE PARTITION TABLE MUST BE MANAGED BY FDISK80.
;
PARTTBL .FILL PARTTBL_SIZ,$00 ; PARTITION TABLE, FILL WITH ZEROES
;
; THE END OF THE FIRST SECTOR MUST CONTAIN THE TWO BYTE BOOT
; SIGNATURE.
;
BOOTSIG .DB $55,$AA ; STANDARD BOOT SIGNATURE
;
;-------------------------------------------------------------------------------
; SECTOR 2
;
; THIS SECTOR HAS NOT BEEN DEFINED AND IS RESERVED.
;
;----------------------------------------------------------------------------
;
.FILL 512,0 ; JUST FILL SECTOR WITH ZEROES
;
;-------------------------------------------------------------------------------
; SECTOR 3
;
; OS AND DISK METADATA
;
;----------------------------------------------------------------------------
;
.FILL 128 * 3,0 ; FIRST 384 BYTES ARE NOT YET DEFINED
;
; THE FOLLOWING TWO BYTES ARE AN ADDITIONAL SIGNATURE THAT IS VERIFIED BY
; SOME HARDWARE BIOSES.
;
PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE
;
; FIRST CHUNK OF METADATA IMMEDIATELY FOLLOWS THE SIGNATURE BYTES
;
PR_PLATFORM .DB 0 ; PLATFORM ID (SEE STD.ASM)
PR_DEVICE .DB 0 ; ? (PROBABLY UNUSED)
PR_FORMATTER .DB 0,0,0,0,0,0,0,0 ; ? (PROBABLY UNUSED)
PR_DRIVE .DB 0 ; ? (PROBABLY UNUSED)
PR_LOG_UNIT .DW 0 ; ? (PROBABLY UNUSED)
;
; FILLER TO PLACE SECOND CHUNK OF METADATA AT THE END OF THE SECTOR
;
.FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H
;
; SECOND CHUNK OF METADATA
;
PR_WP .DB 0 ; WRITE PROTECT BOOLEADN
PR_UPDSEQ .DW 0 ; PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?)
PR_VER .DB RMJ,RMN,RUP,RTP ; OS BUILD VERSION
PR_LABEL .DB "Unlabeled Drive ","$" ; DISK LABEL (EXACTLY 16 BYTES!!!)
.DW 0 ; DEPRECATED
PR_LDLOC .DW SYS_LOC ; ADDRESS TO START LOADING SYSTEM
PR_LDEND .DW SYS_END ; ADDRESS TO STOP LOADING SYSTEM
PR_ENTRY .DW SYS_ENT ; ADDRESS TO ENTER SYSTEM (OS)
;
;
;
.END

7
Source/CPM3/optcmd.lib

@ -0,0 +1,7 @@
; global assembler options for CP/M loader
; when loading from a command line
true equ -1
false equ not true
cmdline equ true

7
Source/CPM3/optdsk.lib

@ -0,0 +1,7 @@
; global assembler options for CP/M loader
; when loading from a boot disk
true equ -1
false equ not true
cmdline equ false

2
Source/CPM3/ver.inc

@ -3,5 +3,5 @@ rmn equ 9
rup equ 2
rtp equ 0
biosver macro
db "2.9.2-pre.29"
db "2.9.2-pre.31"
endm

4
Source/HBIOS/nascom.asm

@ -481,7 +481,7 @@ ERRORS: .BYTE "NF" ; NEXT without FOR
.BYTE "DD" ; Re-DIMensioned array
.BYTE "/0" ; Division by zero
.BYTE "ID" ; Illegal direct
.BYTE "TM" ; Type mis-match
.BYTE "TM" ; Type mismatch
.BYTE "OS" ; Out of string space
.BYTE "LS" ; String too long
.BYTE "ST" ; String formula too complex
@ -503,7 +503,7 @@ ERRORS: .BYTE "NEXT without FOR",0
.BYTE "Re-DIMensioned array",0
.BYTE "Division by zero",0
.BYTE "Illegal direct",0
.BYTE "Type mis-match",0
.BYTE "Type mismatch",0
.BYTE "Out of string space",0
.BYTE "String too long",0
.BYTE "String formula too complex",0

62
Source/HBIOS/romldr.asm

@ -308,6 +308,7 @@ MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT
;
MATD: LD B,A
LD A,C ; IF INPUT WAS SERIAL
LD (BL_INPFLG),A ; SAVE INPUT FLAG
DEC C ; CONVERT TO FROM.
LD A,B ; ASCII TO DECIMAL.
JR Z,MATD1 ; DSKY NUMBERS ARE
@ -562,9 +563,53 @@ GOROM2: LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
;==================================================================================================
;
GOBOOTDISK:
LD (BL_BOOTID),A
LD (BL_BOOTID),A ; SAVE INCOMING BOOTID
;
; SET THE INITIAL BOOT UNIT AND SLICE
;LD A,(BL_BOOTID) ; GET BOOTID
LD (BL_DEVICE),A ; STORE IT
XOR A ; LU DEFAULTS TO 0
LD (BL_LU),A ; STORE IT
;
#IF (BIOS == BIOS_WBW)
;
LD A,(BL_INPFLG) ; GET INPUT FLAG
CP 1 ; DSKY?
JR Z,GOBOOTDISK1 ; IF SO, SLICE 0 IS ASSUMED
;
LD A,(BL_DEVICE) ; GET BOOT DEVICE
LD C,A ; PUT IN C
LD B,BF_DIODEVICE ; HBIOS: DIO DEVICE FUNC
RST 08
LD A,D ; DEVICE TYPE TO A
CP DIODEV_IDE ; HARD DISK DEVICE?
JR C,GOBOOTDISK1 ; NOT SLICE WORTHY, SKIP AHEAD
;
LD DE,STR_SLICESEL ; SLICE SELECTION STRING
CALL WRITESTR ; DISPLAY IT
CALL CINUC ; GET THE KEY
CALL COUT ; ECHO KEY
;
LD DE,STR_INVALID ; SETUP IN CASE OF INVALID
CP 13 ; ENTER?
JR Z,GOBOOTDISK1 ; IF SO, DONE
CP '0' ; START OF RANGE?
JP C,MENU ; BACK TO MENU IF TOO LOW
CP '9' + 1 ; END OF RANGE
JP NC,MENU ; BACK TO MENU IF TOO HIGH
SUB '0' ; CONVERT TO BINARY
LD (BL_LU),A ; AND SAVE IT
GOBOOTDISK1:
;
#ENDIF
;
LD DE,STR_BOOTDISK
CALL WRITESTR
LD A,(BL_DEVICE)
CALL PRTDECB
LD DE,STR_BOOTDISK1
CALL WRITESTR
LD A,(BL_LU)
CALL PRTDECB
PRTS("...$")
#IF (DSKYENABLE)
@ -572,7 +617,7 @@ GOBOOTDISK:
CALL DSKY_SHOWSEG ; DISPLAY MESSAGE
#ENDIF
;
LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE
LD DE,STR_BOOTREAD ; DISK BOOT MESSAGE
CALL WRITESTR ; PRINT IT
;
#IF (BIOS == BIOS_UNA)
@ -601,12 +646,6 @@ GOBOOTDISK:
POP AF ; RESTORE BOOT DEVICE
CP E ; CHECK MAX (INDEX - COUNT)
JP NC,DB_NODISK ; HANDLE INVALID SELECTION
;
; SET THE BOOT UNIT AND SLICE
LD A,(BL_BOOTID) ; GET BOOTID
LD (BL_DEVICE),A ; STORE IT
XOR A ; LU ALWAYS ZERO
LD (BL_LU),A ; STORE IT
;
; SENSE MEDIA
LD A,(BL_DEVICE) ; GET DEVICE/UNIT
@ -680,7 +719,7 @@ GOBOOTDISK:
OR A ; CLEAR CARRY
SBC HL,DE ; HL := LENGTH TO LOAD
LD A,H ; DETERMINE 512 BYTE SECTOR COUNT
RRCA ; ... BY DIVIDING MSB BY TWO
RRA ; ... BY DIVIDING MSB BY TWO
LD (BL_COUNT),A ; ... AND SAVE IT
;
#IF (BIOS == BIOS_UNA)
@ -938,14 +977,16 @@ DEV15 .EQU DEVUNK
;
STR_BANNER .DB "\r\n\r\n", PLATFORM_NAME, " Boot Loader$"
STR_BOOTSEL .DB "\r\n\r\nBoot Selection? $"
STR_SLICESEL .DB " Slice(0-9)[0]? $"
STR_BOOTDISK .DB "\r\n\r\nBooting Disk Unit $"
STR_BOOTDISK1 .DB ", Slice $"
STR_BOOTROM .DB "\r\n\r\nLoading $"
STR_REBOOT .DB "\r\n\r\nRestarting System...$"
STR_INVALID .DB "\r\n\r\n*** Invalid Selection ***$"
STR_NODISK .DB "\r\n\r\nNo disk!$"
STR_NOBOOT .DB "\r\n\r\nDisk not bootable!$"
STR_BOOTERR .DB "\r\n\r\nBoot failure!$"
STR_BOOTDISK1 .DB "\r\n\r\nReading disk information...$"
STR_BOOTREAD .DB "\r\n\r\nReading disk information...$"
STR_LOADING .DB "\r\n\r\nLoading...$"
;
#IF (DSKYENABLE)
@ -1132,6 +1173,7 @@ SLACK: .EQU ($8000 + LDR_SIZ - $)
.DS 64 ; 32 LEVEL STACK
BL_STACK .EQU $ ; ... TOP IS HERE
;
BL_INPFLG .DS 1 ; INPUT FLAG, 1=DSKY, 2=SERIAL
BL_COUNT .DS 1 ; LOAD COUNTER
BL_TIMEOUT .DS 2 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER
BL_BOOTID .DS 1 ; BOOT DEVICE ID CHOSEN BY USER

2
Source/HBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9
#DEFINE RUP 2
#DEFINE RTP 0
#DEFINE BIOSVER "2.9.2-pre.29"
#DEFINE BIOSVER "2.9.2-pre.31"

10
Source/Images/Build.cmd

@ -12,8 +12,8 @@ echo :
call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw.sys
call BuildFD.cmd zsdos ..\zsdos\zsys_wbw.sys
call BuildFD.cmd nzcom ..\zsdos\zsys_wbw.sys
call BuildFD.cmd cpm3
call BuildFD.cmd zpm3
call BuildFD.cmd cpm3 ..\cpm3\cpmldr.sys
call BuildFD.cmd zpm3 ..\cpm3\cpmldr.sys
call BuildFD.cmd ws4
echo :
@ -22,8 +22,10 @@ echo :
call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw.sys
call BuildHD.cmd zsdos ..\zsdos\zsys_wbw.sys
call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys
call BuildHD.cmd cpm3
call BuildHD.cmd zpm3
call BuildHD.cmd cpm3 ..\cpm3\cpmldr.sys
call BuildHD.cmd zpm3 ..\cpm3\cpmldr.sys
call BuildHD.cmd ws4
if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp
copy /b ..\..\Binary\hd_cpm22.img + ..\..\Binary\hd_zsdos.img + ..\..\Binary\hd_nzcom.img + ..\..\Binary\hd_cpm3.img + ..\..\Binary\hd_zpm3.img + ..\..\Binary\hd_ws4.img ..\..\Binary\hd_combo.img

1
Source/Images/d_bp.txt

@ -25,6 +25,7 @@
#
../BPBIOS/*.img 0:
../BPBIOS/*.rel 0:
../BPBIOS/*.zrl 0:
../BPBIOS/*.zex 0:
../BPBIOS/myterm.z3t 0:
../BPBIOS/Z34RCP11/z34rcp11.rel 0:rcp.zrl

6
Source/Images/d_cpm22.txt

@ -19,4 +19,8 @@
# Add Tune application and sample files
#
../../Binary/Apps/tune.com 3:
../../Binary/Apps/Tunes/*.* 3:
../../Binary/Apps/Tunes/*.* 3:
#
# Add OS image
#
../CPM22/cpm_wbw.sys 0:cpm.sys

1
Source/Images/d_cpm3.txt

@ -2,6 +2,7 @@
# Add files from CPM3 build
#
../CPM3/cpmldr.com 0:
../CPM3/cpmldr.sys 0:
../CPM3/ccp.com 0:
../CPM3/gencpm.com 0:
../CPM3/genres.dat 0:

7
Source/Images/d_nzcom.txt

@ -19,4 +19,9 @@
# Add Tune application and sample files
#
../../Binary/Apps/tune.com 3:
../../Binary/Apps/Tunes/*.* 3:
../../Binary/Apps/Tunes/*.* 3:
#
# Add OS images
#
../CPM22/cpm_wbw.sys 0:cpm.sys
../ZSDOS/zsys_wbw.sys 0:zsys.sys

4
Source/Images/d_zpm3.txt

@ -2,7 +2,9 @@
# Add files from CPM3 build
#
../ZPM3/zpmldr.com 0:
../ZPM3/cpmldr.com 0:
../ZPM3/zpmldr.sys 0:
../CPM3/cpmldr.com 0:
../CPM3/cpmldr.sys 0:
../ZPM3/autotog.com 0:
../ZPM3/clrhist.com 0:
../ZPM3/setz3.com 0:

6
Source/Images/d_zsdos.txt

@ -19,4 +19,8 @@
# Add Tune application and sample files
#
../../Binary/Apps/tune.com 3:
../../Binary/Apps/Tunes/*.* 3:
../../Binary/Apps/Tunes/*.* 3:
#
# Add OS image
#
../ZSDOS/zsys_wbw.sys 0:zsys.sys

20
Source/ZPM3/Build.cmd

@ -3,7 +3,9 @@ setlocal
set TOOLS=../../Tools
set PATH=%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%TOOLS%\cpmtools;%PATH%
set TASMTABS=%TOOLS%\tasm32
set ZXBINDIR=%TOOLS%/cpm/bin/
set ZXLIBDIR=%TOOLS%/cpm/lib/
@ -15,15 +17,19 @@ copy ..\ZCCP\startzpm.com .
copy ..\CPM3\genbnk.dat .
copy ..\CPM3\zpmbios3.spr bnkbios3.spr
copy ..\CPM3\gencpm.com .
copy ..\CPM3\biosldr.rel .
copy ..\CPM3\cpmldr.com .
copy ..\CPM3\biosldrd.rel .
copy ..\CPM3\biosldrc.rel .
rem copy ..\CPM3\cpmldr.com .
rem ZPM Loader
echo.
echo.
echo *** ZPM Loader ***
echo.
zx LINK -ZPMLDR[L100]=ZPM3LDR,BIOSLDR
zx LINK -ZPMLDRD[L100]=ZPM3LDR,BIOSLDRD
move /Y zpmldrd.com zpmldr.bin
zx LINK -ZPMLDRC[L100]=ZPM3LDR,BIOSLDRC
move /Y zpmldrc.com zpmldr.com
rem pause
rem Banked ZPM3
@ -34,3 +40,9 @@ echo.
copy genbnk.dat gencpm.dat
zx gencpm -auto -display
rem pause
rem Loader
tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst
copy /b loader.bin + zpmldr.bin zpmldr.sys

3
Source/ZPM3/Clean.cmd

@ -16,3 +16,6 @@ if exist cpmldr.com del cpmldr.com
if exist startzpm.com del startzpm.com
if exist gencpm.com del gencpm.com
if exist *.dat del *.dat
if exist biosldr?.rel del biosldr?.rel
if exist *.bin del *.bin
if exist *.lst del *.lst

228
Source/ZPM3/loader.asm

@ -0,0 +1,228 @@
;===============================================================================
; LOADER.ASM
;
; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS.
;
; CP/M DISK FORMATS ALLOW FOR RESERVED TRACKS THAT CONTAIN AN IMAGE OF THE
; OPERATING SYSTEM TO BE LOADED WHEN THE DISK IS BOOTED. THE OPERATING SYSTEM
; IMAGE ITSELF IS NORMALLY PREFIXED BY A 1-N SECTORS CONTAINING OS BOOTSTRAP
; CODE AND DISK METADATA.
;
; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE
; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES):
;
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
; PARTITION TABLE, AND BOOT SIGNATURE
; SECTOR 2: RESERVED
; SECTOR 3: METADATA
;
; THE HARDWARE BIOS IS EXPECTED TO READ AND LOAD THE FIRST TWO SECTORS FROM THE
; DISK TO MEMORY ADDRESS $8000 AND JUMP TO THAT LOCATION TO BEGIN THE BOOT
; PROCESS. THE BIOS IS EXPECTED TO VERIFY THAT A STANDARD BOOT SIGNATURE
; OF $55, $AA IS PRESENT AT OFFSET $1FE-$1FF. IF THE SIGNATURE IS NOT FOUND,
; THE BIOS SHOULD ASSUME THE DISK HAS NOT BEEN PROPERLY INITIALIZED AND SHOULD
; NOT JUMP TO THE LOAD ADDRESS.
;
;===============================================================================
;
#INCLUDE "../HBIOS/ver.inc"
;
SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS
SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
SYS_END .EQU $1480 ; ENDING ADDRESS OF SYSTEM IMAGE
;
BYT .EQU 1 ; used to describe METADATA_SIZE below
WRD .EQU 2
;
SECTOR_SIZE .EQU 512
BLOCK_SIZE .EQU 128
PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS
METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below)
;
PARTTBL_LOC .EQU $1BE
PARTTBL_SIZ .EQU $40
BOOTSIG_LOC .EQU $1FE
;
;-------------------------------------------------------------------------------
; SECTOR 1
;
; THIS SECTOR FOLLOWS THE CONVENTIONS OF AN IBM-PC MBR CONTAINING THE OS
; BOOTSTRAP CODE, PARTITION TABLE, AND BOOT SIGNATURE
;
;----------------------------------------------------------------------------
;
; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING
; ADDRESS OF $8000.
;
.ORG $8000
JR BOOT
;
BOOT:
LD DE,STR_LOAD ; LOADING STRING
CALL PRTSTR ; PRINT
CALL PRTDOT ; PROGRESS
;
LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
CALL $FFFD ; CALL UNA
JR NZ,ERROR ; HANDLE ERROR
CALL PRTDOT ; PROGRESS
LD B,L ; MOVE BOOT UNIT ID TO B
;
LD C,$41 ; UNA FUNC: SET LBA
LD DE,0 ; HI WORD ALWAYS ZERO
LD HL,3 ; IMAGE STARTS AT FOURTH SECTOR
CALL $FFFD ; SET LBA
JR NZ,ERROR ; HANDLE ERROR
CALL PRTDOT ; PROGRESS
;
LD C,$42 ; UNA FUNC: READ SECTORS
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
LD L,22 ; READ 22 SECTORS
CALL $FFFD ; DO READ
JR NZ,ERROR ; HANDLE ERROR
CALL PRTDOT ; PROGRESS
;
LD DE,STR_DONE ; DONE MESSAGE
CALL PRTSTR ; PRINT IT
;
LD D,B ; PASS BOOT UNIT TO OS
LD E,0 ; ASSUME LU IS ZERO
JP SYS_ENT ; GO TO SYSTEM
;
PRTCHR:
PUSH BC
PUSH DE
LD BC,$0012 ; UNIT 0, WRITE CHAR
LD E,A ; CHAR TO PRINT
CALL $FFFD ; PRINT
POP DE
POP BC
RET
;
PRTSTR:
PUSH BC
PUSH HL
LD BC,$0015 ; UNIT 0, WRITE CHARS UNTIL TERMINATOR
LD L,0 ; TERMINATOR IS NULL
CALL $FFFD ; PRINT
POP HL
POP BC
RET
;
PRTDOT:
LD A,'.' ; DOT CHARACTER
JR PRTCHR ; PRINT AND RETURN
;
; PRINT THE HEX BYTE VALUE IN A
;
PRTHEXBYTE:
PUSH AF
PUSH DE
CALL HEXASCII
LD A,D
CALL PRTCHR
LD A,E
CALL PRTCHR
POP DE
POP AF
RET
;
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
;
HEXASCII:
LD D,A
CALL HEXCONV
LD E,A
LD A,D
RLCA
RLCA
RLCA
RLCA
CALL HEXCONV
LD D,A
RET
;
; CONVERT LOW NIBBLE OF A TO ASCII HEX
;
HEXCONV:
AND 0FH ;LOW NIBBLE ONLY
ADD A,90H
DAA
ADC A,40H
DAA
RET
;
ERROR:
LD DE,STR_ERR ; POINT TO ERROR STRING
CALL PRTSTR ; PRINT IT
HALT ; HALT
;
; DATA
;
STR_LOAD .DB "\r\nLoading",0
STR_DONE .DB "\r\n",0
STR_ERR .DB " Read Error!",0
;
.ORG $ - $8000 ; RESTORE ORG
.FILL PARTTBL_LOC - $ ; FILL TO START OF PARTITION TABLE
;
; RESERVE SPACE FOR STANDARD IBM-PC PARTITION TABLE. ALTHOUGH A
; PARTITION TABLE IS NOT RELEVANT FOR A FLOPPY DISK, IT DOES NO HARM.
; THE CONTENTS OF THE PARTITION TABLE MUST BE MANAGED BY FDISK80.
;
PARTTBL .FILL PARTTBL_SIZ,$00 ; PARTITION TABLE, FILL WITH ZEROES
;
; THE END OF THE FIRST SECTOR MUST CONTAIN THE TWO BYTE BOOT
; SIGNATURE.
;
BOOTSIG .DB $55,$AA ; STANDARD BOOT SIGNATURE
;
;-------------------------------------------------------------------------------
; SECTOR 2
;
; THIS SECTOR HAS NOT BEEN DEFINED AND IS RESERVED.
;
;----------------------------------------------------------------------------
;
.FILL 512,0 ; JUST FILL SECTOR WITH ZEROES
;
;-------------------------------------------------------------------------------
; SECTOR 3
;
; OS AND DISK METADATA
;
;----------------------------------------------------------------------------
;
.FILL 128 * 3,0 ; FIRST 384 BYTES ARE NOT YET DEFINED
;
; THE FOLLOWING TWO BYTES ARE AN ADDITIONAL SIGNATURE THAT IS VERIFIED BY
; SOME HARDWARE BIOSES.
;
PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE
;
; FIRST CHUNK OF METADATA IMMEDIATELY FOLLOWS THE SIGNATURE BYTES
;
PR_PLATFORM .DB 0 ; PLATFORM ID (SEE STD.ASM)
PR_DEVICE .DB 0 ; ? (PROBABLY UNUSED)
PR_FORMATTER .DB 0,0,0,0,0,0,0,0 ; ? (PROBABLY UNUSED)
PR_DRIVE .DB 0 ; ? (PROBABLY UNUSED)
PR_LOG_UNIT .DW 0 ; ? (PROBABLY UNUSED)
;
; FILLER TO PLACE SECOND CHUNK OF METADATA AT THE END OF THE SECTOR
;
.FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H
;
; SECOND CHUNK OF METADATA
;
PR_WP .DB 0 ; WRITE PROTECT BOOLEADN
PR_UPDSEQ .DW 0 ; PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?)
PR_VER .DB RMJ,RMN,RUP,RTP ; OS BUILD VERSION
PR_LABEL .DB "Unlabeled Drive ","$" ; DISK LABEL (EXACTLY 16 BYTES!!!)
.DW 0 ; DEPRECATED
PR_LDLOC .DW SYS_LOC ; ADDRESS TO START LOADING SYSTEM
PR_LDEND .DW SYS_END ; ADDRESS TO STOP LOADING SYSTEM
PR_ENTRY .DW SYS_ENT ; ADDRESS TO ENTER SYSTEM (OS)
;
;
;
.END

2
Source/ZSDOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9
#DEFINE RUP 2
#DEFINE RTP 0
#DEFINE BIOSVER "2.9.2-pre.29"
#DEFINE BIOSVER "2.9.2-pre.31"

Loading…
Cancel
Save