Browse Source

Boot from any slice

pull/90/head
Wayne Warthen 6 years ago
parent
commit
88d7c37424
  1. 2
      Doc/ChangeLog.txt
  2. 2
      ReadMe.txt
  3. 2
      Source/CBIOS/ver.inc
  4. 2
      Source/CPM22/ver.inc
  5. 71
      Source/CPM3/biosldr.z80
  6. 11
      Source/CPM3/boot.z80
  7. 15
      Source/CPM3/diskio.z80
  8. 2
      Source/CPM3/ver.inc
  9. 60
      Source/HBIOS/romldr.asm
  10. 2
      Source/HBIOS/ver.inc
  11. 2
      Source/Images/Build.cmd
  12. 2
      Source/ZSDOS/ver.inc

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
-------------

2
ReadMe.txt

@ -7,7 +7,7 @@
***********************************************************************
Wayne Warthen (wwarthen@gmail.com)
Version 2.9.2-pre.30, 2020-02-17
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

2
Source/CBIOS/ver.inc

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

2
Source/CPM22/ver.inc

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

71
Source/CPM3/biosldr.z80

@ -88,9 +88,11 @@ boot1:
else
ld bc,0F8E0h ; HBIOS func: get boot info
call 0FFF0h ; do it, D := boot unit
ld a,d ; move to A
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
@ -171,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
@ -287,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,'$'
@ -448,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

15
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

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.30"
db "2.9.2-pre.31"
endm

60
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
@ -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.30"
#DEFINE BIOSVER "2.9.2-pre.31"

2
Source/Images/Build.cmd

@ -27,3 +27,5 @@ 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

2
Source/ZSDOS/ver.inc

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

Loading…
Cancel
Save