diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 9ddfbffb..9789cb8b 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -317,8 +317,14 @@ clrram: di ; no interrupts ld a,(0FFE0h) ; get current bank push af ; save it - ;ld a,(bnkramd) ; first bank of ram disk - ld a,080h ; first bank of ram disk + ld b,0FAh ; HBIOS Peek Function + ld a,(@hbbio) ; HBIOS bank id + ld d,a ; ... goes in D + ld hl,1DCh ; Offset 1DCh is ram disk bank 0 + rst 08 ; Call HBIOS, value in E + ld a,e ; move to A for bank sel + cp 0FFh + jr z,clrram3 ;call hb_bnksel ; select bank call 0FFF3h ; select bank @@ -348,7 +354,6 @@ clrram2: or 0ffh ; flag value for cleared ld (clrflg),a ; save it clrram3: - ;ld a,(bnkuser) ; usr bank (tpa) pop af ; recover original bank ;call hb_bnksel ; select bank call 0FFF3h ; select bank diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 90c0eb1c..0cba818b 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -15,6 +15,7 @@ public @sysdr extrn @bootdu,@bootsl + extrn @hbbio ; Variables containing parameters passed by BDOS @@ -354,6 +355,54 @@ dpb$hdnew: ; 8MB Hard Disk Drive (new format) ; called for first time initialization. dsk$init: + ld b,0FAh ; HBIOS Peek Function + ld a,(@hbbio) ; HBIOS bank id + ld d,a ; ... goes in D + ld hl,10Ch ; Offset 10Ch is ROM bank cnt + rst 08 ; Call HBIOS, value in E + ld a,e ; move count to accum + sub 4 ; reduce by # reserved banks + ld ix,dpb$rom ; address of DPB + call dsk$init1 ; fix it up + + ld b,0FAh ; HBIOS Peek Function + ld a,(@hbbio) ; HBIOS bank id + ld d,a ; ... goes in D + ld hl,10Bh ; Offset 10Bh is RAM bank cnt + rst 08 ; Call HBIOS, value in E + ld a,e ; move count to accum + sub 8 ; reduce by # reserved banks + ld ix,dpb$ram ; address of DPB + call dsk$init1 ; fix it up + + ret ; done + +dsk$init1: + ; Setup HL with bank count + ld l,a ; lsb + ld h,0 ; msb is always zero + + ; Update EXM field + ld a,l ; lsb of bank count + cp 16 + 1 ; compare to EXM threshold + ld a,1 ; assume <= 16 banks, EXM := 0 + jr c,dsk$init2 ; done if so + xor a ; > 16 banks, EXM := 0 +dsk$init2: + ld (ix + 4),a ; save new EXM value + + ; Update DSM field + ld b,4 ; prepare to mult by 16 +dsk$init3: + sla l ; shift lsb + rl h ; shift msb w/ carry + djnz dsk$init3 ; repeat as needed + dec hl ; subtract 1 for proper DSM value + ld (ix+5),l ; save updated + ld (ix+6),h ; ... DSM value + + ret + ;ld a,(@rdrv) ; unit being initialized ;ld hl,@bootdu ;cp (hl) ; compare to boot unit diff --git a/Source/ZZR/Bank Layout.txt b/Source/ZZR/Bank Layout.txt new file mode 100644 index 00000000..d7b4bc64 --- /dev/null +++ b/Source/ZZR/Bank Layout.txt @@ -0,0 +1,19 @@ +Bank ROM RAM RAM +---- --- --- --- +0 HBIOS (IMG) RAMDISK RAMDISK +1 ROMLDR+MON+CP/M2+ZSYS RAMDISK RAMDISK +2 FTH+BAS+TBAS+PLAY+USR RAMDISK RAMDISK +3 RESERVED RAMDISK RAMDISK +4 ROMDISK RAMDISK RAMDISK +5 ROMDISK RAMDISK RAMDISK +6 ROMDISK RAMDISK RAMDISK +7 ROMDISK RAMDISK RAMDISK + +8 ROMDISK BUF (CPM3) BUF (CPM3) +9 ROMDISK BUF (CPM3) BUF (CPM3) +A ROMDISK BUF (CPM3) BUF (CPM3) +B ROMDISK BUF (CPM3) BUF (CPM3) +C ROMDISK AUX (CPM3) TPA (CPM3) +D ROMDISK HBIOS (EXEC) HBIOS (EXEC) +E ROMDISK TPA-LO OS (CPM3) +F ROMDISK COMMON (TPA-HI) COMMON (TPA-HI) \ No newline at end of file diff --git a/Source/ver.inc b/Source/ver.inc index 5b3aafd8..7483a543 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.62" +#DEFINE BIOSVER "3.1.1-pre.63" diff --git a/Source/ver.lib b/Source/ver.lib index dd1b0ca3..280a27a8 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.62" + db "3.1.1-pre.63" endm