diff --git a/.gitignore b/.gitignore index 32d51319..508cc58d 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,7 @@ Tools/unix/zx/zx !Source/BPBIOS/Z34RCP11/cledsave.com !Source/Fonts !Source/Images/**/*.[Cc][Oo][Mm] +!Source/Images/hdnew_prefix.bin !Source/RomDsk/**/*.[Cc][Oo][Mm] !Source/UBIOS/FSFAT.BIN !Source/UBIOS/UNA-BIOS.BIN diff --git a/Doc/Hard Disk Anatomy.pdf b/Doc/Hard Disk Anatomy.pdf index 54bf0ad5..a65a9912 100644 Binary files a/Doc/Hard Disk Anatomy.pdf and b/Doc/Hard Disk Anatomy.pdf differ diff --git a/Doc/SIO+CTC Baud Rate Options.pdf b/Doc/SIO+CTC Baud Rate Options.pdf new file mode 100644 index 00000000..923e6b48 Binary files /dev/null and b/Doc/SIO+CTC Baud Rate Options.pdf differ diff --git a/Source/Apps/Assign.asm b/Source/Apps/Assign.asm index 00402cfb..4e1606b4 100644 --- a/Source/Apps/Assign.asm +++ b/Source/Apps/Assign.asm @@ -24,6 +24,7 @@ ; 2019-11-17 [WBW] Added preliminary CP/M 3 support ; 2019-12-24 [WBW] Fixed location of BIOS save area\ ; 2020-04-29 [WBW] Updated for larger DPH (16 -> 20 bytes) +; 2020-05-06 [WBW] Add patch level to version compare ;_______________________________________________________________________________ ; ; ToDo: @@ -42,8 +43,7 @@ bdos .equ $0005 ; BDOS invocation vector ; stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp ; -rmj .equ 3 ; CBIOS version - major -rmn .equ 1 ; CBIOS version - minor +#include "../ver.inc" ; ;=============================================================================== ; Code Section @@ -119,10 +119,14 @@ init: jp nz,errinv ; abort with invalid config block inc hl ; next byte (major/minor version) ld a,(hl) ; load it - cp rmj << 4 | rmn ; match? + cp RMJ << 4 | RMN ; match? jp nz,errver ; abort with invalid os version - inc hl ; bump past - inc hl ; ... version info + inc hl ; next byte (update/patch) + ld a,(hl) ; load it + and $F0 ; eliminate patch num + cp RUP << 4 ; match? + jp nz,errver ; abort with invalid os version + inc hl ; bump past version info ; ; dereference HL to point to CBIOS extension data ld a,(hl) ; dereference HL @@ -783,7 +787,7 @@ instc3: push hl ; save drvtbl entry adr push de ; save mapwrk entry adr ld hl,(dphadr) ; get cur dph address - ld de,$23 ; size of xdph + ld de,$27 ; size of xdph add hl,de ; bump to next dph ld (dphadr),hl ; save it pop de ; recover mapwrk entry adr @@ -1868,7 +1872,7 @@ stack .equ $ ; stack top ; Messages ; indent .db " ",0 -msgban1 .db "ASSIGN v1.1b for RomWBW CP/M, 29-Apr-2020",0 +msgban1 .db "ASSIGN v1.2 for RomWBW CP/M, 7-May-2020",0 msghb .db " (HBIOS Mode)",0 msgub .db " (UBIOS Mode)",0 msgban2 .db "Copyright 2020, Wayne Warthen, GNU GPL v3",0 diff --git a/Source/BPBIOS/diskdefs b/Source/BPBIOS/diskdefs index dad4c46e..a03e42f0 100644 --- a/Source/BPBIOS/diskdefs +++ b/Source/BPBIOS/diskdefs @@ -345,8 +345,20 @@ diskdef wbw_fd120 os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# Legacy format, 512 dir entries, 8,320 sectors / slice +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 tracks 1040 @@ -393,9 +405,9 @@ end # RomWBW 8MB Hard Disk -# New format, 1024 dir entries, 8,192 sectors / slice +# New format, 1024 dir entries, 16,384 sectors / slice # Pure filesystem image, no prefix -diskdef wbw_hd_new +diskdef wbw_hdnew seclen 512 tracks 1024 sectrk 16 @@ -406,10 +418,9 @@ diskdef wbw_hd_new os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# New format, 1024 dir entries, 8,192 sectors / slice -# Assumes 256 sector (16 track) hard disk prefix -diskdef wbw_hd0_new +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 tracks 1040 sectrk 16 @@ -420,7 +431,7 @@ diskdef wbw_hd0_new os 2.2 end -diskdef wbw_hd1_new +diskdef wbw_hdnew1 seclen 512 tracks 2064 sectrk 16 @@ -431,7 +442,7 @@ diskdef wbw_hd1_new os 2.2 end -diskdef wbw_hd2_new +diskdef wbw_hdnew2 seclen 512 tracks 3112 sectrk 16 @@ -442,7 +453,7 @@ diskdef wbw_hd2_new os 2.2 end -diskdef wbw_hd3_new +diskdef wbw_hdnew3 seclen 512 tracks 4136 sectrk 16 diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 57895fec..9940be25 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -471,8 +471,6 @@ GOMON: ;================================================================================================== ; ;__________________________________________________________________________________________________ -; -;__________________________________________________________________________________________________ CONST: ; CONSOLE STATUS, RETURN $FF IF CHARACTER READY, $00 IF NOT ; @@ -1223,13 +1221,38 @@ DSK_SELECT: ; ; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT) POP BC ; GET ORIGINAL E INTO B -; -#IFDEF PLTWBW ; ; CHECK IF THIS IS LOGIN, IF NOT, BYPASS MEDIA DETECTION ; FIX: WHAT IF PREVIOUS MEDIA DETECTION FAILED??? BIT 0,B ; TEST DRIVE LOGIN BIT JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION +; +#IFDEF PLTUNA +; + LD A,(SEKUNIT) ; GET DISK UNIT + LD B,A ; UNIT NUM TO B + LD C,$48 ; UNA FUNC: GET DISK TYPE + CALL $FFFD ; CALL UNA + LD A,D ; MOVE DISK TYPE TO A + CP $40 ; RAM/ROM DRIVE? + JR Z,DSK_SELECT1 ; HANDLE RAM/ROM DRIVE + LD A,MID_HD ; OTHERWISE WE HAVE A HARD DISK + JR DSK_SELECT1A ; DONE +; +DSK_SELECT1: + ; UNA RAM/ROM DRIVE + LD C,$45 ; UNA FUNC: GET DISK INFO + LD DE,(DSKBUF) ; 512 BYTE BUFFER + CALL $FFFD ; CALL UNA + BIT 7,B ; TEST RAM DRIVE BIT + LD A,MID_MDROM ; ASSUME ROM + JR Z,DSK_SELECT1A ; IS ROM, DONE + LD A,MID_MDRAM ; MSUT BE RAM +; +DSK_SELECT1A: + LD (MEDID),A +; +#ELSE ; ; DETERMINE MEDIA IN DRIVE LD A,(SEKUNIT) ; GET UNIT @@ -1242,6 +1265,8 @@ DSK_SELECT: OR A ; SET FLAGS LD HL,0 ; ASSUME FAILURE RET Z ; BAIL OUT IF NO MEDIA +; +#ENDIF ; ; CLEAR LBA OFFSET (DWORD) LD HL,0 ; ZERO @@ -1286,8 +1311,6 @@ DSK_SELECT: LD BC,4 ; 4 BYTES LDIR ; DO IT ; -#ENDIF -; DSK_SELECT2: LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M XOR A ; FLAG SUCCESS @@ -1298,15 +1321,32 @@ DSK_SELECT2: ; UPDATE THE PARTITION OFFSET (LBAOFF) AND UPDATE ; THE MEDIA ID (MEDID). ; -#IFDEF PLTWBW -; DSK_MBR: ; CHECK MEDIA TYPE, ONLY HARD DISK IS APPLICABLE LD A,(MEDID) ; GET MEDIA ID CP MID_HD ; HARD DISK? - JR Z,DSK_MBR1 ; IF SO, CONTINUE + JR Z,DSK_MBR0 ; IF SO, CONTINUE XOR A ; ELSE, N/A, SIGNAL SUCCESS RET ; AND RETURN + +DSK_MBR0: +; +#IFDEF PLTWBW + ; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER + LD A,(HB_CURBNK) ; GET CUR BANK + PUSH AF ; SAVE CUR BANK + LD A,(BNKBIOS) ; BIOS BANK + CALL HB_BNKSEL ; DO IT + CALL DSK_MBR1 ; DO THE WORK + ; RESTORE BANK + PUSH AF ; SAVE RESULT + POP HL ; TO HL + EX (SP),HL ; RESULT TO TOS, PREV BANK TO H + LD A,H ; PREV BANK TO A + CALL HB_BNKSEL ; SELECT IT + POP AF ; ORIGINAL RESULT BACK + RET +#ENDIF ; DSK_MBR1: ; FLUSH DSKBUF TO MAKE SURE IT IS SAFE TO USE IT. @@ -1320,14 +1360,11 @@ DSK_MBR1: LD C,A ; PUT IN C LD DE,0 ; LBA SECTOR ZERO LD HL,0 ; ... +#IFDEF PLTWBW + SET 7,D ; MAKE SURE LBA ACCESS BIT SET +#ENDIF CALL DSK_IO2 ; DO IT RET NZ ; ABORT ON ERROR -; - ; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER - LD A,(HB_CURBNK) ; GET CUR BANK - PUSH AF ; SAVE CUR BANK - LD A,(BNKBIOS) ; BIOS BANK - CALL HB_BNKSEL ; DO IT ; ; CHECK SIGNATURE LD HL,(DSKBUF) ; DSKBUF ADR @@ -1335,11 +1372,11 @@ DSK_MBR1: ADD HL,DE ; POINT TO SIGNATURE LD A,(HL) ; GET FIRST BYTE CP $55 ; CHECK FIRST BYTE - JR NZ,DSK_MBR4 ; NO MATCH, NO PART TABLE + JR NZ,DSK_MBR5 ; NO MATCH, NO PART TABLE INC HL ; NEXT BYTE LD A,(HL) ; GET SECOND BYTE CP $AA ; CHECK SECOND BYTE - JR NZ,DSK_MBR4 ; NO MATCH, NO PART TABLE, ABORT + JR NZ,DSK_MBR5 ; NO MATCH, NO PART TABLE, ABORT ; ; TRY TO FIND OUR ENTRY IN PART TABLE AND CAPTURE LBA OFFSET LD B,4 ; FOUR ENTRIES IN PART TABLE @@ -1348,19 +1385,16 @@ DSK_MBR1: ADD HL,DE ; POINT TO IT DSK_MBR2: LD A,(HL) ; GET PART TYPE - CP $52 ; CP/M PARTITION? + CP $2E ; CP/M PARTITION? JR Z,DSK_MBR3 ; COOL, GRAB THE LBA OFFSET LD DE,16 ; PART TABLE ENTRY SIZE ADD HL,DE ; BUMP TO NEXT ENTRY PART TYPE DJNZ DSK_MBR2 ; LOOP THRU TABLE - JR DSK_MBR4 ; TOO BAD, NO CP/M PARTITION + JR DSK_MBR5 ; TOO BAD, NO CP/M PARTITION ; DSK_MBR3: ; WE HAVE LOCATED A VALID CP/M PARTITION ; HL POINTS TO PART TYPE FIELD OF PART ENTRY - ; UPDATE MEDIA ID - LD A,MID_HDNEW ; NEW MEDIA ID - LD (MEDID),A ; SAVE IT ; ; CAPTURE THE LBA OFFSET LD DE,4 ; LBA IS 4 BYTES AFTER PART TYPE @@ -1368,14 +1402,39 @@ DSK_MBR3: LD DE,SEKLBA ; LOC TO STORE LBA OFFSET LD BC,4 ; 4 BYTES (32 BITS) LDIR ; COPY IT +; + ; CHECK THAT REQUESTED SLICE IS "INSIDE" PARTITION + ; SLICE SIZE IS EXACTLY 16,384 SECTORS (8MB), SO WE CAN JUST + ; RIGHT SHIFT PARTITION SECTOR COUNT BY 14 BITS + LD E,(HL) ; HL POINTS TO FIRST BYTE + INC HL ; ... OF 32 BIT PARTITION + LD D,(HL) ; ... SECTOR COUNT, + INC HL ; ... LOAD SECTOR COUNT + PUSH DE ; ... INTO DE:HL + LD E,(HL) ; ... + INC HL ; ... + LD D,(HL) ; ... + POP HL ; ... DE:HL = PART SIZE IN SECTORS + LD B,2 ; DE = DE:HL >> 2 (TRICKY!) + CALL RL32 ; DE = SLICECNT + EX DE,HL ; HL = SLICECNT + LD A,(SLICE) ; GET TARGET SLICE + LD C,A ; PUT IN C + LD B,0 ; BC := REQUESTED SLICE # + SCF ; SET CARRY! + SBC HL,BC ; MAX SLICES - SLICE - 1 + JR NC,DSK_MBR4 ; NO OVERFLOW, OK TO CONTINUE + OR $FF ; SLICE TOO HIGH, SIGNAL ERROR + RET ; AND BAIL OUT +; +DSK_MBR4: ; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE LD HL,16384 ; NEW SECTORS PER SLICE LD (SPS),HL ; SAVE IT -; -DSK_MBR4: - ; RESTORE BANK - POP AF ; GET PREV BANK - CALL HB_BNKSEL ; SELECT IT + + ; UPDATE MEDIA ID + LD A,MID_HDNEW ; NEW MEDIA ID + LD (MEDID),A ; SAVE IT ; DSK_MBR5: ; ADJUST LBA OFFSET BASED ON TARGET SLICE @@ -1383,68 +1442,22 @@ DSK_MBR5: LD HL,(SEKLBA) ; SET DE:HL LD DE,(SEKLBA+2) ; ... TO STARTING LBA LD BC,(SPS) ; SECTORS PER SLICE -BOOT6: +DSK_MBR6: OR A ; SET FLAGS TO CHECK LOOP CNTR - JR Z,BOOT8 ; DONE IF COUNTER EXHAUSTED + JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED ADD HL,BC ; ADD ONE SLICE TO LOW WORD - JR NC,BOOT7 ; CHECK FOR CARRY + JR NC,DSK_MBR7 ; CHECK FOR CARRY INC DE ; IF SO, BUMP HIGH WORD -BOOT7: +DSK_MBR7: DEC A ; DEC LOOP DOWNCOUNTER - JR BOOT6 ; AND LOOP -BOOT8: + JR DSK_MBR6 ; AND LOOP +DSK_MBR8: ; RESAVE IT LD (SEKLBA),HL ; LOWORD LD (SEKLBA+2),DE ; HIWORD ; SUCCESSFUL FINISH XOR A ; SUCCESS RET ; DONE - - - - - -; ; DIFFERENT ALGORITHM FOR NEW HD FORMAT -; LD A,(MEDID) ; GET MEDIA ID -; CP MID_HDNEW ; NEW FORMAT? -; JR Z,DSK_MBR6 ; IF SO, GO THERE -;; -; ; OLD HD FORMAT, 65 TRACKS PER SLICE -; LD A,(SLICE) ; GET SLICE -; LD E,A ; E = SLICE NO -; LD H,65 ; H = TRACKS PER SLICE -; CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET) -; LD DE,0 ; CLEAR HI WORD -; LD B,8 ; 16 SPT, SHIFT 4 BITS -; CALL RL32 ; DO IT -; JR DSK_MBR7 ; DONE -;; -;DSK_MBR6: -; ; NEW HD FORMAT, MULTIPLY SLICE BY 8MB -; LD DE,0 ; CLEAR HIWORD -; LD H,0 ; CLEAR HI BYTE OR LOWORD -; LD A,(SLICE) ; GET SLICE -; LD L,A ; PUT SLICE IN LOW BYTE -; LD B,14 -; CALL RL32 ; MULTIPLY BY 16384 SECTORS (8MB) -;; -;DSK_MBR7: -; ; ADD IN LBA OFFSET -; LD BC,(SEKLBA) ; LBA OFFSET LOWORD -; ADD HL,BC -; EX DE,HL -; LD BC,(SEKLBA+2) ; LBA OFFSET HIWORD -; ADC HL,BC -; EX DE,HL -; SET 7,D ; SET LBA ACCESS BIT -; ; RESAVE IT -; LD (SEKLBA),HL ; LOWORD -; LD (SEKLBA+2),DE ; HIWORD -; ; SUCCESSFUL FINISH -; XOR A ; SUCCESS -; RET ; DONE -; -#ENDIF ; ; ; @@ -1480,54 +1493,12 @@ DSK_WRITE: ; ; ; -#IFDEF PLTUNA -; -DSK_IO: - PUSH BC - LD DE,(HSTTRK) ; GET TRACK INTO HL - LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS -DSK_IO1: - SLA E ; SHIFT DE LEFT BY 4 BITS - RL D - DJNZ DSK_IO1 ; LOOP TILL ALL BITS DONE - LD A,(HSTSEC) ; GET THE SECTOR INTO A - AND $0F ; GET RID OF TOP NIBBLE - OR E ; COMBINE WITH E - LD E,A ; BACK IN E - LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA - ; APPLY OFFSET NOW - ; OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO OFFSET! - LD A,(HSTOFF) ; LSB OF SLICE OFFSET TO A - ADD A,D ; ADD WITH D - LD D,A ; PUT IT BACK IN D - LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A - CALL ADCHLA ; ADD OFFSET - POP BC ; RECOVER FUNCTION IN B - LD A,(HSTUNIT) ; GET THE UNIT VALUE - LD C,A ; PUT IT IN C - ; DISPATCH TO DRIVER - PUSH BC - EX DE,HL ; DE:HL NOW HAS LBA - LD B,C ; UNIT TO B - LD C,$41 ; UNA SET LBA - RST 08 ; CALL UNA - CALL NZ,PANIC - POP BC ; RECOVER B=FUNC, C=UNIT - LD E,C ; UNIT TO E - LD C,B ; FUNC TO C - LD B,E ; UNIT TO B - LD DE,(DSKBUF) ; SET BUFFER ADDRESS - LD HL,1 ; 1 SECTOR - ; DISPATCH TO UBIOS - RST 08 - OR A ; SET FLAGS BASED ON RESULT - RET -; -#ELSE -; DSK_IO: LD A,(HSTUNIT) ; GET UNIT LD C,A ; UNIT -> C +; +#IFDEF PLTWBW +; PUSH BC ; SAVE FUNC/UNIT LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; GET UNIT INFO, DEVICE TYPE IN D @@ -1549,9 +1520,9 @@ DSK_IO: RL D ; CARRY BIT (HEAD) INTO D JR DSK_IO2 ; DO THE DISK I/O ; +#ENDIF +; LBA_IO: - LD A,(HSTUNIT) ; GET THE UNIT VALUE - LD C,A ; PUT IT IN C PUSH BC ; SAVE FUNC/UNIT ; GET TRACK AND SHIFT TO MAKE ROOM FOR 4 BIT SECTOR VALUE LD HL,(HSTTRK) ; GET TRACK @@ -1569,16 +1540,42 @@ LBA_IO: LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD ADC HL,BC EX DE,HL +#IFDEF PLTWBW SET 7,D ; MAKE SURE LBA ACCESS BIT SET +#ENDIF POP BC ; RESTORE FUNC/UNIT ;JR DSK_IO2 ; DO THE DISK I/O (FALL THRU) ; +#IFDEF PLTUNA +; +; MAKE UNA UBIOS CALL +; HBIOS FUNC SHOULD STILL BE IN B +; UNIT SHOULD STILL BE IN C +; +DSK_IO2: + PUSH BC ; SAVE INCOMING FUNCTION, UNIT + LD B,C ; UNIT TO B + LD C,$41 ; UNA SET LBA + RST 08 ; CALL UNA + POP BC ; RECOVER B=FUNC, C=UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD E,C ; UNIT TO E + LD C,B ; FUNC TO C + LD B,E ; UNIT TO B + LD DE,(DSKBUF) ; SET BUFFER ADDRESS + LD HL,1 ; 1 SECTOR + ; DISPATCH TO UBIOS + RST 08 ; CALL UNA + RET ; DONE +; +#ELSE +; ; MAKE HBIOS CALL ; HBIOS FUNC SHOULD STILL BE IN B ; UNIT SHOULD STILL BE IN C ; DSK_IO2: - PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT + PUSH BC ; SAVE INCOMING FUNCTION, UNIT LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL RST 08 ; DO IT POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT @@ -1587,7 +1584,6 @@ DSK_IO2: LD A,(BNKBIOS) ; GET BIOS BANK LD D,A ; TRANSFER TO/FROM BIOS BANK LD E,1 ; TRANSFER ONE SECTOR - ;CALL PC_ASTERISK ; *DEBUG* RST 08 ; DO IT OR A ; SET FLAGS RET ; DONE @@ -1820,7 +1816,7 @@ DPB_ROM: ; ; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256 -; RAM DISK SIZE = TOTAL RAM - 128K RESERVED FOR SYSTEM USE +; RAM DISK SIZE = TOTAL RAM - 256K RESERVED FOR SYSTEM USE ; ; ALS_RAM, EXM, DSM MUST BE FILLED DYNAMICALLY: ; - ALS_RAM := (BANKS * 2) @@ -1837,7 +1833,7 @@ DPB_RAM: .DB 4 ; BSH: BLOCK SHIFT FACTOR .DB 15 ; BLM: BLOCK MASK .DB 1 ; EXM: (BLKS <= 256) ? 1 : 0 - .DW 192 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 + .DW 128 - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1 .DW 255 ; DRM: DIR ENTRIES - 1 = 255 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE @@ -2343,10 +2339,12 @@ MD_INIT: ; #IFDEF PLTWBW LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT + SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES LD IX,DPB_ROM ; ADDRESS OF DPB CALL MD_INIT1 ; FIX IT UP ; LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT + SUB 8 ; REDUCE BANK COUNT BY RESERVED PAGES LD IX,DPB_RAM ; ADDRESS OF DPB CALL MD_INIT1 ; FIX IT UP ; @@ -2355,7 +2353,6 @@ MD_INIT: MD_INIT1: ; ; PUT USABLE BANK COUNT IN HL - SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES LD L,A ; PUT IN LSB OF HL LD H,0 ; MSB IS ALWAYS ZERO ; diff --git a/Source/CPM3/bioskrnl.asm b/Source/CPM3/bioskrnl.asm index ab3a9ccd..bd21c783 100644 --- a/Source/CPM3/bioskrnl.asm +++ b/Source/CPM3/bioskrnl.asm @@ -507,6 +507,11 @@ seldsk: mov a,m ! inx h ! mov h,m ! mov l,a ; get address of LOGIN routine call ipchl ; call LOGIN pop h ; recover DPH pointer + ; WBW Start + ora a + rz ; successful return + lxi h,0 ; error occurred, clear HL + ; WBW End not$first$select: ret diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index 1af6947d..beeeb878 100644 --- a/Source/CPM3/biosldr.z80 +++ b/Source/CPM3/biosldr.z80 @@ -182,12 +182,12 @@ boot2: cp 0AAh ; should be $AA jr nz,boot5 ; if not, no part table - ; Search part table for CP/M entry (type 0x52) + ; Search part table for CP/M entry (type 0x2E) ld b,4 ; four entries in part table ld hl,mbrsec+1BEh+4 ; offset of first part type boot3: ld a,(hl) ; get part type - cp 52h ; CP/M partition? + cp 2Eh ; CP/M partition? jr z,boot4 ; cool, grab the LBA offset ld de,16 ; part table entry size add hl,de ; bump to next part type diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 7157619d..8ba7574d 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -442,7 +442,7 @@ media: ; If not hard disk, skip partition & slice stuff ld a,(medid) ; get media id cp 4 ; hard disk? - jr nz,media9 ; if not, jump ahead + jp nz,media9 ; if not, jump ahead ; Read MBR ld de,8000h ; LBA address zero @@ -454,7 +454,8 @@ media: ld a,(unit) ; get bootunit ld c,a ; put in C ld b,013h ; HBIOS func: disk read - call dsk$io ; do it, no return on err + call dsk$io ; do it + ret nz ; abort on error ; Check signature ld hl,(mbrsec+1FEh) ; get signature @@ -465,12 +466,12 @@ media: cp 0AAh ; should be $AA jr nz,media5 ; if not, no part table - ; Search part table for CP/M entry (type 0x52) + ; Search part table for CP/M entry (type 0x2E) ld b,4 ; four entries in part table ld hl,mbrsec+1BEh+4 ; offset of first part type media3: ld a,(hl) ; get part type - cp 52h ; CP/M partition? + cp 2Eh ; CP/M partition? jr z,media4 ; cool, grab the LBA offset ld de,16 ; part table entry size add hl,de ; bump to next part type @@ -484,6 +485,28 @@ media4: ld de,lba ; loc to store lba offset ld bc,4 ; 4 bytes (32 bits) ldir ; copy it + + ; Check that requested slice is "inside" partition. + ; Slice size is exactly 16,384 sectors (8mb), so we can just + ; right shift partition sector count by 14 bits + ld e,(hl) ; HL points to first byte + inc hl ; ... of 32 bit partition + ld d,(hl) ; ... sector count, + inc hl ; ... load sector count + push de ; ... into DE:HL + ld e,(hl) ; ... + inc hl ; ... + ld d,(hl) ; ... + pop hl ; ... DE:HL = part size in sectors + ld b,2 ; DE = DE:HL >> 2 (tricky!) + call rl32 ; DE = slicecnt + ex de,hl ; HL = slicecnt + ld a,(slice) ; get target slice + ld c,a ; put in C + ld b,0 ; BC := requested slice # + scf ; set carry! + sbc hl,bc ; max slices - slice - 1 + jp c,err_noslice ; slice too high, error exit ; For now, it is implied that a slice within a partition ; table will be in the "new" disk format. So, we now @@ -772,9 +795,6 @@ str_err_diskio db ", Disk I/O",0 str_err_sig db ", No system",0 str_err_api db ", API failure",0 -; -; -; retry$adr dw ?wboot ; error retry address curdph dw 0 ; working dph value medid db 0 ; working media id value diff --git a/Source/Doc/Graphics/Hard Disk Anatomy.vsd b/Source/Doc/Graphics/Hard Disk Anatomy.vsd index 680e16e3..9e78f36f 100644 Binary files a/Source/Doc/Graphics/Hard Disk Anatomy.vsd and b/Source/Doc/Graphics/Hard Disk Anatomy.vsd differ diff --git a/Source/Doc/SIO+CTC Baud Rate Options.xlsx b/Source/Doc/SIO+CTC Baud Rate Options.xlsx new file mode 100644 index 00000000..632283c5 Binary files /dev/null and b/Source/Doc/SIO+CTC Baud Rate Options.xlsx differ diff --git a/Source/HBIOS/diskdefs b/Source/HBIOS/diskdefs index dad4c46e..a03e42f0 100644 --- a/Source/HBIOS/diskdefs +++ b/Source/HBIOS/diskdefs @@ -345,8 +345,20 @@ diskdef wbw_fd120 os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# Legacy format, 512 dir entries, 8,320 sectors / slice +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 tracks 1040 @@ -393,9 +405,9 @@ end # RomWBW 8MB Hard Disk -# New format, 1024 dir entries, 8,192 sectors / slice +# New format, 1024 dir entries, 16,384 sectors / slice # Pure filesystem image, no prefix -diskdef wbw_hd_new +diskdef wbw_hdnew seclen 512 tracks 1024 sectrk 16 @@ -406,10 +418,9 @@ diskdef wbw_hd_new os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# New format, 1024 dir entries, 8,192 sectors / slice -# Assumes 256 sector (16 track) hard disk prefix -diskdef wbw_hd0_new +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 tracks 1040 sectrk 16 @@ -420,7 +431,7 @@ diskdef wbw_hd0_new os 2.2 end -diskdef wbw_hd1_new +diskdef wbw_hdnew1 seclen 512 tracks 2064 sectrk 16 @@ -431,7 +442,7 @@ diskdef wbw_hd1_new os 2.2 end -diskdef wbw_hd2_new +diskdef wbw_hdnew2 seclen 512 tracks 3112 sectrk 16 @@ -442,7 +453,7 @@ diskdef wbw_hd2_new os 2.2 end -diskdef wbw_hd3_new +diskdef wbw_hdnew3 seclen 512 tracks 4136 sectrk 16 diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 3c8825bb..a5d3b0ff 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -135,15 +135,11 @@ HDSK_RESET: ; ; GET DISK CAPACITY ; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE -; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS -; ASSUME 8 SLICES, SO 16640 X 8 = 133,120 TOTAL SECTORS -; -; 2048 TRKS X 16 HDS X 16 SPT = 524288 OR 80000H +; ASSUME 1GB MEDIA SIZE, SO 1GB / 512B +; IS $200000 SECTORS ; HDSK_CAP: - ;LD DE,133120 >> 16 ; BLOCK COUNT MSW - ;LD HL,133120 & $FFFF ; BLOCK COUNT LSW - LD DE,8 ; BLOCK COUNT MSW + LD DE,$20 ; BLOCK COUNT MSW LD HL,0 ; BLOCK COUNT LSW LD BC,512 ; 512 BYTE SECTOR XOR A ; SIGNAL SUCCESS diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 8449108c..f17704ee 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -123,7 +123,7 @@ start: rst 08 ; do it ld a,c ; previous bank to A ld (bid_ldr),a ; save previous bank for later - cp BID_IMG0 ; starting from ROM? + bit 7,a ; starting from ROM? #endif ; #if (BIOS == BIOS_UNA) @@ -131,8 +131,7 @@ start: ld de,BID_USR ; select user bank rst 08 ; do it ld (bid_ldr),de ; ... for later - ld a,d ; starting from ROM? - or e ; ... bank == 0? + bit 7,d ; starting from ROM? #endif ; ; For app mode startup, use alternate table @@ -675,18 +674,23 @@ diskboot: ; If non-zero slice requested, confirm device can handle it ld a,(bootslice) ; get slice or a ; set flags - jr z,diskboot1 ; slice 0, skip slice check + jr z,diskboot0 ; slice 0, skip slice check ld a,d ; disk type to A cp $41 ; IDE? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK cp $42 ; PPIDE? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK cp $43 ; SD? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK cp $44 ; DSD? - jr z,diskboot1 ; if so, OK + jr z,diskboot0 ; if so, OK jp err_noslice ; no such slice, handle err ; +diskboot0: + ; Below is wrong. It assumes we are booting from a hard + ; disk, but it could also be a RAM/ROM disk. However, it is + ; not actually possible to boot from those, so not gonna + ; worry about this. ld a,4 ; assume legacy hard disk ld (mediaid),a ; save media id ; @@ -732,7 +736,7 @@ diskboot1: ld hl,bl_mbrsec+$1BE+4 ; offset of first entry part type diskboot2: ld a,(hl) ; get part type - cp $52 ; cp/m partition? + cp $2E ; cp/m partition? jr z,diskboot3 ; cool, grab the lba offset ld de,16 ; part table entry size add hl,de ; bump to next entry part type diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index c33d9604..01e52351 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -4,25 +4,43 @@ setlocal echo. echo Building Floppy Disk Images... echo. -call BuildFD.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys -call BuildFD.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys -call BuildFD.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys -call BuildFD.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys -call BuildFD.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys -call BuildFD.cmd ws4 wbw_fd144 +call BuildDisk.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys +call BuildDisk.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys +call BuildDisk.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys +call BuildDisk.cmd ws4 wbw_fd144 echo. -echo Building Hard Disk Images... +echo Building Legacy Hard Disk Images... echo. -call BuildHD.cmd cpm22 wbw_hd0 ..\cpm22\cpm_wbw.sys -call BuildHD.cmd zsdos wbw_hd0 ..\zsdos\zsys_wbw.sys -call BuildHD.cmd nzcom wbw_hd0 ..\zsdos\zsys_wbw.sys -call BuildHD.cmd cpm3 wbw_hd0 ..\cpm3\cpmldr.sys -call BuildHD.cmd zpm3 wbw_hd0 ..\cpm3\cpmldr.sys -call BuildHD.cmd ws4 wbw_hd0 +call BuildDisk.cmd cpm22 wbw_hd ..\cpm22\cpm_wbw.sys +call BuildDisk.cmd zsdos wbw_hd ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd nzcom wbw_hd ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd cpm3 wbw_hd ..\cpm3\cpmldr.sys +call BuildDisk.cmd zpm3 wbw_hd ..\cpm3\cpmldr.sys +call BuildDisk.cmd ws4 wbw_hd if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp wbw_hd echo. -echo Building Combo Disk Image... +echo Building Combo Disk (legacy format) Image... 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 + +echo. +echo Building New Hard Disk Images... +echo. +call BuildDisk.cmd cpm22 wbw_hdnew ..\cpm22\cpm_wbw.sys +call BuildDisk.cmd zsdos wbw_hdnew ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd nzcom wbw_hdnew ..\zsdos\zsys_wbw.sys +call BuildDisk.cmd cpm3 wbw_hdnew ..\cpm3\cpmldr.sys +call BuildDisk.cmd zpm3 wbw_hdnew ..\cpm3\cpmldr.sys +call BuildDisk.cmd ws4 wbw_hdnew + +if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp wbw_hdnew + +copy hd_prefix.dat ..\..\Binary\ + +echo. +echo Building Combo Disk (new format) Image... +copy /b hdnew_prefix.bin + ..\..\Binary\hdnew_cpm22.img + ..\..\Binary\hdnew_zsdos.img + ..\..\Binary\hdnew_nzcom.img + ..\..\Binary\hdnew_cpm3.img + ..\..\Binary\hdnew_zpm3.img + ..\..\Binary\hdnew_ws4.img ..\..\Binary\hdnew_combo.img diff --git a/Source/Images/BuildDisk.cmd b/Source/Images/BuildDisk.cmd new file mode 100644 index 00000000..d280c1fd --- /dev/null +++ b/Source/Images/BuildDisk.cmd @@ -0,0 +1 @@ +@PowerShell -ExecutionPolicy Unrestricted .\BuildDisk.ps1 %* \ No newline at end of file diff --git a/Source/Images/BuildHD.ps1 b/Source/Images/BuildDisk.ps1 similarity index 56% rename from Source/Images/BuildHD.ps1 rename to Source/Images/BuildDisk.ps1 index 525e2d4a..8401560f 100644 --- a/Source/Images/BuildHD.ps1 +++ b/Source/Images/BuildDisk.ps1 @@ -1,25 +1,46 @@ -Param($Disk, $Format="wbw_hd_new", $SysFile="") +Param($Disk, $Format="", $SysFile="") $ErrorAction = 'Stop' -if ($Format -like "*_new") +$CpmToolsPath = '../../Tools/cpmtools' + +$env:PATH = $CpmToolsPath + ';' + $env:PATH + +if ($Format.Length -eq 0) { - # New hard disk format!!! - $MediaID = 10 - $Size = 8 * 1MB - $ImgFile = "hd_${Disk}.bin" + Write-Error "No disk format specified!" -ErrorAction Stop + return } -else + +switch ($Format) { - # Legacy hard disk format - $MediaID = 4 - $Size = 8320KB - $ImgFile = "hd_${Disk}.img" -} + "wbw_fd144" + { + # 1.44MB Floppy Disk + $Desc = "1.44MB Floppy Disk" + $ImgFile = "fd144_${Disk}.img" + $MediaID = 6 + $Size = 1440KB + } -$CpmToolsPath = '../../Tools/cpmtools' + "wbw_hd" + { + # Legacy Hard Disk Format + $Desc = "Hard Disk (legacy format)" + $ImgFile = "hd_${Disk}.img" + $MediaID = 4 + $Size = 8MB + 128KB + } -$env:PATH = $CpmToolsPath + ';' + $env:PATH + "wbw_hdnew" + { + # New Hard Disk Format + $Desc = "Hard Disk (new format)" + $ImgFile = "hdnew_${Disk}.img" + $MediaID = 10 + $Size = 8MB + } +} if (-not (Test-Path("d_${Disk}/"))) { @@ -27,7 +48,7 @@ if (-not (Test-Path("d_${Disk}/"))) return } -"Generating Hard Disk ${Disk}..." +"Generating $Desc $Disk..." if ($SysFile.Length -gt 0) { [byte[]]$SysImg = [System.IO.File]::ReadAllBytes($SysFile) } @@ -36,10 +57,10 @@ else $Image = ($SysImg + ([byte[]](0xE5) * ($Size - $SysImg.length))) -$Image[1410] = 0x4D -$Image[1411] = 0x49 -$Image[1412] = 0x44 -$Image[1413] = $MediaID +# $Image[1410] = 0x4D +# $Image[1411] = 0x49 +# $Image[1412] = 0x44 +# $Image[1413] = $MediaID [System.IO.File]::WriteAllBytes($ImgFile, $Image) diff --git a/Source/Images/BuildFD.cmd b/Source/Images/BuildFD.cmd deleted file mode 100644 index b251f23e..00000000 --- a/Source/Images/BuildFD.cmd +++ /dev/null @@ -1 +0,0 @@ -@PowerShell -ExecutionPolicy Unrestricted .\BuildFD.ps1 %* \ No newline at end of file diff --git a/Source/Images/BuildFD.ps1 b/Source/Images/BuildFD.ps1 deleted file mode 100644 index f1c0d25d..00000000 --- a/Source/Images/BuildFD.ps1 +++ /dev/null @@ -1,63 +0,0 @@ -Param($Disk, $Format="wbw_fd144", $SysFile="") - -$ErrorAction = 'Stop' - -$ImgFile = "fd_${Disk}.img" -$MediaID = 6 -$Size = 1440KB - -$CpmToolsPath = '../../Tools/cpmtools' - -$env:PATH = $CpmToolsPath + ';' + $env:PATH - -if (-not (Test-Path("d_${Disk}/"))) -{ - Write-Error "Source directory d_${Disk} for disk ${Disk} not found!" -ErrorAction Stop - return -} - -"Generating Floppy Disk ${Disk}..." - -if ($SysFile.Length -gt 0) - { [byte[]]$SysImg = [System.IO.File]::ReadAllBytes($SysFile) } -else - { [byte[]]$SysImg = @() } - -$Image = ($SysImg + ([byte[]](0xE5) * ($Size - $SysImg.length))) - -$Image[1410] = 0x4D -$Image[1411] = 0x49 -$Image[1412] = 0x44 -$Image[1413] = $MediaID - -[System.IO.File]::WriteAllBytes($ImgFile, $Image) - -for ($Usr=0; $Usr -lt 16; $Usr++) -{ - if (Test-Path ("d_${Disk}/u${Usr}/*")) - { - $Cmd = "cpmcp -f $Format $ImgFile d_${Disk}/u${Usr}/*.* ${Usr}:" - $Cmd - Invoke-Expression $Cmd - } -} - -if (Test-Path("d_${Disk}.txt")) -{ - foreach($Line in Get-Content "d_${Disk}.txt") - { - $Spec = $Line.Trim() - if (($Spec.Length -gt 0) -and ($Spec.Substring(0,1) -ne "#")) - { - $Cmd = "cpmcp -f $Format $ImgFile ${Spec}" - $Cmd - Invoke-Expression $Cmd - } - } -} - -"Moving image $ImgFile into output directory..." - -Move-Item $ImgFile -Destination "..\..\Binary\" -Force - -return \ No newline at end of file diff --git a/Source/Images/BuildHD.cmd b/Source/Images/BuildHD.cmd deleted file mode 100644 index c7db537e..00000000 --- a/Source/Images/BuildHD.cmd +++ /dev/null @@ -1 +0,0 @@ -@PowerShell -ExecutionPolicy Unrestricted .\BuildHD.ps1 %* \ No newline at end of file diff --git a/Source/Images/BuildNew.cmd b/Source/Images/BuildNew.cmd deleted file mode 100644 index eb1b0174..00000000 --- a/Source/Images/BuildNew.cmd +++ /dev/null @@ -1,40 +0,0 @@ -@echo off -setlocal - -echo. -echo Building Floppy Disk Images... -echo. -call BuildFD.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys -call BuildFD.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys -call BuildFD.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys -call BuildFD.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys -call BuildFD.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys -call BuildFD.cmd ws4 wbw_fd144 - -echo. -echo Building Hard Disk Images... -echo. -call BuildHD.cmd cpm22 wbw_hd_new ..\cpm22\cpm_wbw.sys -call BuildHD.cmd zsdos wbw_hd_new ..\zsdos\zsys_wbw.sys -call BuildHD.cmd nzcom wbw_hd_new ..\zsdos\zsys_wbw.sys -call BuildHD.cmd cpm3 wbw_hd_new ..\cpm3\cpmldr.sys -call BuildHD.cmd zpm3 wbw_hd_new ..\cpm3\cpmldr.sys -call BuildHD.cmd ws4 wbw_hd_new - -if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp wbw_hd_new - -copy hd_prefix.dat ..\..\Binary\ - -echo. -echo Build Hard Disk Images... -copy /b hd_prefix.dat + ..\..\Binary\hd_cpm22.bin ..\..\Binary\hd_cpm22.img -copy /b hd_prefix.dat + ..\..\Binary\hd_zsdos.bin ..\..\Binary\hd_zsdos.img -copy /b hd_prefix.dat + ..\..\Binary\hd_nzcom.bin ..\..\Binary\hd_nzcom.img -copy /b hd_prefix.dat + ..\..\Binary\hd_cpm3.bin ..\..\Binary\hd_cpm3.img -copy /b hd_prefix.dat + ..\..\Binary\hd_zpm3.bin ..\..\Binary\hd_zpm3.img -copy /b hd_prefix.dat + ..\..\Binary\hd_ws4.bin ..\..\Binary\hd_ws4.img -if exist ..\..\Binary\hd_bp.bin copy /b hd_prefix.dat + ..\..\Binary\hd_bp.bin - -echo. -echo Building Combo Disk Image... -copy /b hd_prefix.dat + ..\..\Binary\hd_cpm22.bin + ..\..\Binary\hd_zsdos.bin + ..\..\Binary\hd_nzcom.bin + ..\..\Binary\hd_cpm3.bin + ..\..\Binary\hd_zpm3.bin + ..\..\Binary\hd_ws4.bin ..\..\Binary\hd_combo.img diff --git a/Source/Images/Common/FDISK80.COM b/Source/Images/Common/FDISK80.COM index 28a97094..7e862d67 100644 Binary files a/Source/Images/Common/FDISK80.COM and b/Source/Images/Common/FDISK80.COM differ diff --git a/Source/Images/Makefile b/Source/Images/Makefile index 13fbbdb0..ea5a4e63 100644 --- a/Source/Images/Makefile +++ b/Source/Images/Makefile @@ -1,26 +1,23 @@ # -# this makefile subsumes all the work done in Build.cmd, Build{Hd,Fd}.* +# this makefile subsumes all the work done in Build.cmd, BuildDisk.cmd, BuildDisk.ps1 # SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys -FDIMGS = fd_cpm22.img fd_zsdos.img fd_nzcom.img \ - fd_cpm3.img fd_zpm3.img fd_ws4.img -FDBIN = fd_cpm22.bin fd_zsdos.bin fd_nzcom.bin \ - fd_cpm3.bin fd_zpm3.bin fd_ws4.bin +FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_nzcom.img \ + fd144_cpm3.img fd144_zpm3.img fd144_ws4.img HDIMGS = hd_cpm22.img hd_zsdos.img hd_nzcom.img \ hd_cpm3.img hd_zpm3.img hd_ws4.img -HDBIN = hd_cpm22.bin hd_zsdos.bin hd_nzcom.bin \ - hd_cpm3.bin hd_zpm3.bin hd_ws4.bin # HDIMGS += hd_bp.img -# HDBIN += hd_bp.bin +HDNEWIMGS = hdnew_cpm22.img hdnew_zsdos.img hdnew_nzcom.img \ + hdnew_cpm3.img hdnew_zpm3.img hdnew_ws4.img +# HDNEWIMGS += hdnew_bp.img -HDPREFIX = # Legacy -#HDPREFIX = hd_prefix.dat # New +HDPREFIX = +HDNEWPREFIX = hdnew_prefix.bin -OBJECTS = $(FDIMGS) $(HDIMGS) hd_combo.img # Legacy -#OBJECTS = $(FDIMGS) $(HDIMGS) $(HDBIN) hd_combo.img # New +OBJECTS = $(FDIMGS) $(HDIMGS) hd_combo.img $(HDNEWIMGS) hdnew_combo.img -OTHERS = blank144 blankhd $(FDBIN) $(HDBIN) +OTHERS = blank144 blankhd blankhdnew DEST=../../Binary @@ -29,7 +26,10 @@ include $(TOOLS)/Makefile.inc DIFFPATH = $(DIFFTO)/Binary -hd_combo.img: $(HDPREFIX) $(HDBIN) +hd_combo.img: $(HDPREFIX) $(HDIMGS) + cat $^ > $@ + +hdnew_combo.img: $(HDNEWPREFIX) $(HDNEWIMGS) cat $^ > $@ # @@ -47,35 +47,32 @@ blank144: @echo Making Blank Floppy of size $(FDSIZE)k @LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null -HDSIZE := 8320 # Legacy -#HDSIZE := 8192 # New +HDSIZE := 8320 +HDNEWSIZE := 8192 blankhd: @echo Making Blank Hd of size $(HDSIZE)k @LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null -%.img: %.bin - @if echo $@ | grep -q ^f ; then \ - cat $< > $@ ; \ - else \ - cat $(HDPREFIX) $< > $@ ; \ - fi ; \ - -%.bin: $(SYSTEMS) blank144 blankhd Makefile +blankhdnew: + @echo Making Blank HdNew of size $(HDNEWSIZE)k + @LC_CTYPE=en_US.US-ASCII tr '\000' '\345' /dev/null + +%.img: $(SYSTEMS) blank144 blankhd blankhdnew Makefile @sys= ; \ case $@ in \ (*cpm22*) sys=../CPM22/cpm_wbw.sys;; \ (*zsdos* | *nzcom*) sys=../ZSDOS/zsys_wbw.sys;; \ (*cpm3* | *zpm3*) sys=../CPM3/cpmldr.sys;; \ esac ; \ - if echo $@ | grep -q ^f ; then \ - fmt=wbw_fd144 ; type=fd_ ; proto=blank144 ; \ - mid="MID\006" ; \ - else \ - #fmt=wbw_hd_new ; type=hd_ ; proto=blankhd ; \ - #mid="MID\012" ; \ - fmt=wbw_hd0 ; type=hd_ ; proto=blankhd ; \ - mid="MID\004" ; \ + if echo $@ | grep -q ^fd144_ ; then \ + fmt=wbw_fd144 ; type=fd144_ ; proto=blank144 ; \ + fi ; \ + if echo $@ | grep -q ^hd_ ; then \ + fmt=wbw_hd ; type=hd_ ; proto=blankhd ; \ + fi ; \ + if echo $@ | grep -q ^hdnew_ ; then \ + fmt=wbw_hdnew ; type=hdnew_ ; proto=blankhdnew ; \ fi ; \ d=$$(echo $(basename $@) | sed s/$$type//) ; \ echo Generating $@ ; \ @@ -84,7 +81,7 @@ blankhd: echo copying system $$sys to $@ ; \ $(BINDIR)/mkfs.cpm -f $$fmt -b $$sys $@ ; \ fi ; \ - LC_CTYPE=en_US.US-ASCII echo $$mid | dd bs=1 count=4 seek=1410 conv=notrunc of=$@ ; \ + # LC_CTYPE=en_US.US-ASCII echo $$mid | dd bs=1 count=4 seek=1410 conv=notrunc of=$@ ; \ for u in $$(seq 0 15) ; do \ dir=d_$$d/u$$u ; \ if [ -d $$dir ] ; then \ @@ -114,13 +111,17 @@ clean:: @rm -f *.ls imgdiff: - @for i in $(FDIMGS) $(HDIMGS) ; do \ + @for i in $(FDIMGS) $(HDIMGS) $(HDNEWIMGS) ; do \ echo $$i ; \ - if echo $$i | grep -q ^f ; then \ - fmt=wbw_fd144 ; \ - else \ - fmt=wbw_hd0_1024 ; \ - fi ; \ + if echo $$i | grep -q ^fd144_ ; then \ + fmt=wbw_fd144 ; \ + fi ; \ + if echo $$i | grep -q ^hd_ ; then \ + fmt=wbw_hd ; \ + fi ; \ + if echo $$i | grep -q ^hdnew_ ; then \ + fmt=wbw_hdnew ; \ + fi ; \ $(BINDIR)/cpmls -i -f $$fmt $$i > $$i.ls ; \ $(BINDIR)/cpmls -i -f $$fmt $(DIFFPATH)/$$i > $$i.diff.ls ; \ done \ diff --git a/Source/Images/diskdefs b/Source/Images/diskdefs index dad4c46e..a03e42f0 100644 --- a/Source/Images/diskdefs +++ b/Source/Images/diskdefs @@ -345,8 +345,20 @@ diskdef wbw_fd120 os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# Legacy format, 512 dir entries, 8,320 sectors / slice +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 tracks 1040 @@ -393,9 +405,9 @@ end # RomWBW 8MB Hard Disk -# New format, 1024 dir entries, 8,192 sectors / slice +# New format, 1024 dir entries, 16,384 sectors / slice # Pure filesystem image, no prefix -diskdef wbw_hd_new +diskdef wbw_hdnew seclen 512 tracks 1024 sectrk 16 @@ -406,10 +418,9 @@ diskdef wbw_hd_new os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# New format, 1024 dir entries, 8,192 sectors / slice -# Assumes 256 sector (16 track) hard disk prefix -diskdef wbw_hd0_new +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 tracks 1040 sectrk 16 @@ -420,7 +431,7 @@ diskdef wbw_hd0_new os 2.2 end -diskdef wbw_hd1_new +diskdef wbw_hdnew1 seclen 512 tracks 2064 sectrk 16 @@ -431,7 +442,7 @@ diskdef wbw_hd1_new os 2.2 end -diskdef wbw_hd2_new +diskdef wbw_hdnew2 seclen 512 tracks 3112 sectrk 16 @@ -442,7 +453,7 @@ diskdef wbw_hd2_new os 2.2 end -diskdef wbw_hd3_new +diskdef wbw_hdnew3 seclen 512 tracks 4136 sectrk 16 diff --git a/Source/Images/hd_prefix.dat b/Source/Images/hdnew_prefix.bin similarity index 99% rename from Source/Images/hd_prefix.dat rename to Source/Images/hdnew_prefix.bin index 3248248d..8ab54de5 100644 Binary files a/Source/Images/hd_prefix.dat and b/Source/Images/hdnew_prefix.bin differ diff --git a/Source/RomDsk/ROM_1024KB/FDISK80.COM b/Source/RomDsk/ROM_1024KB/FDISK80.COM index 28a97094..7e862d67 100644 Binary files a/Source/RomDsk/ROM_1024KB/FDISK80.COM and b/Source/RomDsk/ROM_1024KB/FDISK80.COM differ diff --git a/Source/RomDsk/ROM_512KB/FDISK80.COM b/Source/RomDsk/ROM_512KB/FDISK80.COM index 28a97094..7e862d67 100644 Binary files a/Source/RomDsk/ROM_512KB/FDISK80.COM and b/Source/RomDsk/ROM_512KB/FDISK80.COM differ diff --git a/Source/UBIOS/ubios.inc b/Source/UBIOS/ubios.inc index 546c671d..58684c02 100644 --- a/Source/UBIOS/ubios.inc +++ b/Source/UBIOS/ubios.inc @@ -11,27 +11,17 @@ BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS BF_DIO .EQU $40 BF_DIOREAD .EQU BF_DIO + 2 ; DISK READ BF_DIOWRITE .EQU BF_DIO + 3 ; DISK WRITE -;; -;; MEMORY BANK CONFIGURATION -;; -;ROMSIZE .EQU 512 -;RAMSIZE .EQU 512 ; -;BID_ROM0 .EQU $0000 -;BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1)) -;BID_RAM0 .EQU $8000 -;BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) +; MEDIA ID VALUES ; -;BID_BOOT .EQU BID_ROM0 ; BOOT BANK -;BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK -;BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK -;BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK -;BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK -;BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK -; -;BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK -;BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK -;BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) -;BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK -;BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) -;BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K +MID_NONE .EQU 0 +MID_MDROM .EQU 1 +MID_MDRAM .EQU 2 +MID_RF .EQU 3 +MID_HD .EQU 4 +MID_FD720 .EQU 5 +MID_FD144 .EQU 6 +MID_FD360 .EQU 7 +MID_FD120 .EQU 8 +MID_FD111 .EQU 9 +MID_HDNEW .EQU 10 diff --git a/Source/ver.inc b/Source/ver.inc index 49be83dd..dea2c716 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.1" +#DEFINE BIOSVER "3.1.1-pre.2" diff --git a/Source/ver.lib b/Source/ver.lib index f71eb627..cff1d4a5 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.1" + db "3.1.1-pre.2" endm diff --git a/Tools/cpmtools/diskdefs b/Tools/cpmtools/diskdefs index dad4c46e..a03e42f0 100644 --- a/Tools/cpmtools/diskdefs +++ b/Tools/cpmtools/diskdefs @@ -345,8 +345,20 @@ diskdef wbw_fd120 os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# Legacy format, 512 dir entries, 8,320 sectors / slice +# RomWBW 8320KB Hard Disk Slice +# Legacy format, 512 dir entries, 16,630 sectors / slice +diskdef wbw_hd + seclen 512 + tracks 1040 + sectrk 16 + blocksize 4096 + maxdir 512 + skew 0 + boottrk 16 + os 2.2 +end + +# First 4 slices of wbw_hd diskdef wbw_hd0 seclen 512 tracks 1040 @@ -393,9 +405,9 @@ end # RomWBW 8MB Hard Disk -# New format, 1024 dir entries, 8,192 sectors / slice +# New format, 1024 dir entries, 16,384 sectors / slice # Pure filesystem image, no prefix -diskdef wbw_hd_new +diskdef wbw_hdnew seclen 512 tracks 1024 sectrk 16 @@ -406,10 +418,9 @@ diskdef wbw_hd_new os 2.2 end -# RomWBW 8MB Hard Disk, first 4 slices -# New format, 1024 dir entries, 8,192 sectors / slice -# Assumes 256 sector (16 track) hard disk prefix -diskdef wbw_hd0_new +# First 4 slices of wbw_hdnew +# Assumes 128KB prefix (256 sectors) +diskdef wbw_hdnew0 seclen 512 tracks 1040 sectrk 16 @@ -420,7 +431,7 @@ diskdef wbw_hd0_new os 2.2 end -diskdef wbw_hd1_new +diskdef wbw_hdnew1 seclen 512 tracks 2064 sectrk 16 @@ -431,7 +442,7 @@ diskdef wbw_hd1_new os 2.2 end -diskdef wbw_hd2_new +diskdef wbw_hdnew2 seclen 512 tracks 3112 sectrk 16 @@ -442,7 +453,7 @@ diskdef wbw_hd2_new os 2.2 end -diskdef wbw_hd3_new +diskdef wbw_hdnew3 seclen 512 tracks 4136 sectrk 16 diff --git a/Tools/simh/Sim.cfg b/Tools/simh/Sim.cfg index 8c8af2bf..a8c126f5 100644 --- a/Tools/simh/Sim.cfg +++ b/Tools/simh/Sim.cfg @@ -27,8 +27,8 @@ attach hdsk0 ..\..\Binary\hd_combo.img attach hdsk1 ..\..\Binary\hd_combo.img set hdsk0 format=HDSK set hdsk1 format=HDSK -set hdsk0 geom=T:2048/N:256/S:512 -set hdsk1 geom=T:2048/N:256/S:512 +set hdsk0 geom=T:8192/N:256/S:512 +set hdsk1 geom=T:8192/N:256/S:512 set hdsk0 wrtenb set hdsk1 wrtenb