Browse Source

Load CP/M 3 from disk

Includes updated SYSCOPY application to put loader image on system tracks.
pull/90/head
Wayne Warthen 6 years ago
parent
commit
0510a02447
  1. 2
      ReadMe.txt
  2. 139
      Source/Apps/SysCopy.asm
  3. 15
      Source/BPBIOS/@WBW Issues.txt
  4. 2
      Source/BPBIOS/Build.cmd
  5. 4
      Source/BPBIOS/cboot-ww.z80
  6. 60
      Source/BPBIOS/hbios.z80
  7. 2
      Source/CBIOS/ver.inc
  8. 2
      Source/CPM22/loader.asm
  9. 2
      Source/CPM22/ver.inc
  10. 28
      Source/CPM3/Build.cmd
  11. 1
      Source/CPM3/Clean.cmd
  12. 21
      Source/CPM3/biosldr.z80
  13. 7
      Source/CPM3/ldropts.lib
  14. 228
      Source/CPM3/loader.asm
  15. 7
      Source/CPM3/optcmd.lib
  16. 7
      Source/CPM3/optdsk.lib
  17. 2
      Source/CPM3/ver.inc
  18. 2
      Source/HBIOS/romldr.asm
  19. 2
      Source/HBIOS/ver.inc
  20. 8
      Source/Images/Build.cmd
  21. 1
      Source/Images/d_bp.txt
  22. 4
      Source/Images/d_cpm22.txt
  23. 1
      Source/Images/d_cpm3.txt
  24. 5
      Source/Images/d_nzcom.txt
  25. 4
      Source/Images/d_zpm3.txt
  26. 4
      Source/Images/d_zsdos.txt
  27. 20
      Source/ZPM3/Build.cmd
  28. 3
      Source/ZPM3/Clean.cmd
  29. 228
      Source/ZPM3/loader.asm
  30. 2
      Source/ZSDOS/ver.inc

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.30, 2020-02-17
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

60
Source/BPBIOS/hbios.z80

@ -128,8 +128,68 @@ HBX_INIT:
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
LD (HB_SRCBNK),A

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.30"

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.30"

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

21
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,19 @@ 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
ld a,d ; move to A
ld (unit),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 +116,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

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.30"
endm

2
Source/HBIOS/romldr.asm

@ -680,7 +680,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)

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.30"

8
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,8 @@ 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

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

4
Source/Images/d_cpm22.txt

@ -20,3 +20,7 @@
#
../../Binary/Apps/tune.com 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:

5
Source/Images/d_nzcom.txt

@ -20,3 +20,8 @@
#
../../Binary/Apps/tune.com 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:

4
Source/Images/d_zsdos.txt

@ -20,3 +20,7 @@
#
../../Binary/Apps/tune.com 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.30"

Loading…
Cancel
Save