diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 2dbd6d4e..32bf83b9 100644 --- a/Doc/ChangeLog.txt +++ b/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 ------------- diff --git a/ReadMe.txt b/ReadMe.txt index a97cc170..98e06e8c 100644 --- a/ReadMe.txt +++ b/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 diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index 5861831f..1711ccfe 100644 --- a/Source/CBIOS/ver.inc +++ b/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" diff --git a/Source/CPM22/ver.inc b/Source/CPM22/ver.inc index 5861831f..1711ccfe 100644 --- a/Source/CPM22/ver.inc +++ b/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" diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index 60f0c047..87d3ff6a 100644 --- a/Source/CPM3/biosldr.z80 +++ b/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 diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 3e1cf55b..ca0a0041 100644 --- a/Source/CPM3/boot.z80 +++ b/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 diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index b951bfab..d5d27c57 100644 --- a/Source/CPM3/diskio.z80 +++ b/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 diff --git a/Source/CPM3/ver.inc b/Source/CPM3/ver.inc index 81bc5d9b..edf94f0c 100644 --- a/Source/CPM3/ver.inc +++ b/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 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 5c416f9d..9fb43746 100644 --- a/Source/HBIOS/romldr.asm +++ b/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 diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index 5861831f..1711ccfe 100644 --- a/Source/HBIOS/ver.inc +++ b/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" diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index dd90673c..ac05ba65 100644 --- a/Source/Images/Build.cmd +++ b/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 diff --git a/Source/ZSDOS/ver.inc b/Source/ZSDOS/ver.inc index 5861831f..1711ccfe 100644 --- a/Source/ZSDOS/ver.inc +++ b/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"