diff --git a/Doc/CPM Manual.pdf b/Doc/CPM Manual.pdf index bdcf69ad..b7de4f24 100644 Binary files a/Doc/CPM Manual.pdf and b/Doc/CPM Manual.pdf differ 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/Doc/Contrib/Microsoft NASCOM BASIC.docx b/Doc/Contrib/Microsoft NASCOM BASIC.docx new file mode 100644 index 00000000..b260b59e Binary files /dev/null and b/Doc/Contrib/Microsoft NASCOM BASIC.docx differ diff --git a/Doc/Nascom.txt b/Doc/Nascom.txt deleted file mode 100644 index 5455ab1c..00000000 --- a/Doc/Nascom.txt +++ /dev/null @@ -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 - diff --git a/Doc/cpm3_command_guide.pdf b/Doc/cpm3_command_guide.pdf new file mode 100644 index 00000000..b66d920f Binary files /dev/null and b/Doc/cpm3_command_guide.pdf differ diff --git a/Doc/cpm3_programmers_guide.pdf b/Doc/cpm3_programmers_guide.pdf new file mode 100644 index 00000000..4914042f Binary files /dev/null and b/Doc/cpm3_programmers_guide.pdf differ diff --git a/Doc/cpm3_system_guide.pdf b/Doc/cpm3_system_guide.pdf new file mode 100644 index 00000000..422a0c95 Binary files /dev/null and b/Doc/cpm3_system_guide.pdf differ diff --git a/Doc/cpm3_users_guide.pdf b/Doc/cpm3_users_guide.pdf new file mode 100644 index 00000000..df46c910 Binary files /dev/null and b/Doc/cpm3_users_guide.pdf differ diff --git a/ReadMe.txt b/ReadMe.txt index ecfc0831..98e06e8c 100644 --- a/ReadMe.txt +++ b/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 diff --git a/Source/Apps/SysCopy.asm b/Source/Apps/SysCopy.asm index ffb146bf..144f9536 100644 --- a/Source/Apps/SysCopy.asm +++ b/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 [=]$" msgamb .db "Ambiguous file specification not allowed$" msgdlm .db "Invalid delimiter$" diff --git a/Source/BPBIOS/@WBW Issues.txt b/Source/BPBIOS/@WBW Issues.txt new file mode 100644 index 00000000..f7d12f4c --- /dev/null +++ b/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 diff --git a/Source/BPBIOS/Build.cmd b/Source/BPBIOS/Build.cmd index 76a44e01..54186541 100644 --- a/Source/BPBIOS/Build.cmd +++ b/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 diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index ce08a842..3febd543 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/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 diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index 7899f6aa..c8671c87 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/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 diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index b65ec245..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.29" +#DEFINE BIOSVER "2.9.2-pre.31" diff --git a/Source/CPM22/loader.asm b/Source/CPM22/loader.asm index 27dc735c..93cac556 100644 --- a/Source/CPM22/loader.asm +++ b/Source/CPM22/loader.asm @@ -1,5 +1,5 @@ ;=============================================================================== -; BL.ASM +; LOADER.ASM ; ; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS. ; diff --git a/Source/CPM22/ver.inc b/Source/CPM22/ver.inc index b65ec245..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.29" +#DEFINE BIOSVER "2.9.2-pre.31" diff --git a/Source/CPM3/Build.cmd b/Source/CPM3/Build.cmd index f70ec6d2..003bd7eb 100644 --- a/Source/CPM3/Build.cmd +++ b/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 diff --git a/Source/CPM3/Clean.cmd b/Source/CPM3/Clean.cmd index 02fa2692..677a89b1 100644 --- a/Source/CPM3/Clean.cmd +++ b/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 diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index 754dc299..87d3ff6a 100644 --- a/Source/CPM3/biosldr.z80 +++ b/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 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/ldropts.lib b/Source/CPM3/ldropts.lib new file mode 100644 index 00000000..3f74e713 --- /dev/null +++ b/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 diff --git a/Source/CPM3/loader.asm b/Source/CPM3/loader.asm new file mode 100644 index 00000000..982f7205 --- /dev/null +++ b/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 diff --git a/Source/CPM3/optcmd.lib b/Source/CPM3/optcmd.lib new file mode 100644 index 00000000..3f74e713 --- /dev/null +++ b/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 diff --git a/Source/CPM3/optdsk.lib b/Source/CPM3/optdsk.lib new file mode 100644 index 00000000..c2caa8b3 --- /dev/null +++ b/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 diff --git a/Source/CPM3/ver.inc b/Source/CPM3/ver.inc index 2fc0ccc8..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.29" + db "2.9.2-pre.31" endm diff --git a/Source/HBIOS/nascom.asm b/Source/HBIOS/nascom.asm index f3d1d70b..76f66b9b 100644 --- a/Source/HBIOS/nascom.asm +++ b/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 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index c6be9084..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 @@ -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 diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index b65ec245..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.29" +#DEFINE BIOSVER "2.9.2-pre.31" diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 86533ade..ac05ba65 100644 --- a/Source/Images/Build.cmd +++ b/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 diff --git a/Source/Images/d_bp.txt b/Source/Images/d_bp.txt index 0a5b33c5..7e975ddd 100644 --- a/Source/Images/d_bp.txt +++ b/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 diff --git a/Source/Images/d_cpm22.txt b/Source/Images/d_cpm22.txt index d26c8af9..9a68283c 100644 --- a/Source/Images/d_cpm22.txt +++ b/Source/Images/d_cpm22.txt @@ -19,4 +19,8 @@ # Add Tune application and sample files # ../../Binary/Apps/tune.com 3: -../../Binary/Apps/Tunes/*.* 3: \ No newline at end of file +../../Binary/Apps/Tunes/*.* 3: +# +# Add OS image +# +../CPM22/cpm_wbw.sys 0:cpm.sys diff --git a/Source/Images/d_cpm3.txt b/Source/Images/d_cpm3.txt index f5024061..30aaaba8 100644 --- a/Source/Images/d_cpm3.txt +++ b/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: diff --git a/Source/Images/d_nzcom.txt b/Source/Images/d_nzcom.txt index d26c8af9..88a07621 100644 --- a/Source/Images/d_nzcom.txt +++ b/Source/Images/d_nzcom.txt @@ -19,4 +19,9 @@ # Add Tune application and sample files # ../../Binary/Apps/tune.com 3: -../../Binary/Apps/Tunes/*.* 3: \ No newline at end of file +../../Binary/Apps/Tunes/*.* 3: +# +# Add OS images +# +../CPM22/cpm_wbw.sys 0:cpm.sys +../ZSDOS/zsys_wbw.sys 0:zsys.sys \ No newline at end of file diff --git a/Source/Images/d_zpm3.txt b/Source/Images/d_zpm3.txt index 04e86482..2fa29b58 100644 --- a/Source/Images/d_zpm3.txt +++ b/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: diff --git a/Source/Images/d_zsdos.txt b/Source/Images/d_zsdos.txt index d26c8af9..7d76c6fb 100644 --- a/Source/Images/d_zsdos.txt +++ b/Source/Images/d_zsdos.txt @@ -19,4 +19,8 @@ # Add Tune application and sample files # ../../Binary/Apps/tune.com 3: -../../Binary/Apps/Tunes/*.* 3: \ No newline at end of file +../../Binary/Apps/Tunes/*.* 3: +# +# Add OS image +# +../ZSDOS/zsys_wbw.sys 0:zsys.sys \ No newline at end of file diff --git a/Source/ZPM3/Build.cmd b/Source/ZPM3/Build.cmd index 4fa2b7a3..47018c83 100644 --- a/Source/ZPM3/Build.cmd +++ b/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 diff --git a/Source/ZPM3/Clean.cmd b/Source/ZPM3/Clean.cmd index 91ffcb36..57295d69 100644 --- a/Source/ZPM3/Clean.cmd +++ b/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 diff --git a/Source/ZPM3/loader.asm b/Source/ZPM3/loader.asm new file mode 100644 index 00000000..982f7205 --- /dev/null +++ b/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 diff --git a/Source/ZSDOS/ver.inc b/Source/ZSDOS/ver.inc index b65ec245..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.29" +#DEFINE BIOSVER "2.9.2-pre.31"