From 2e6294830997976fe36e8f408075a907801962cf Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 11 Dec 2020 21:19:41 +0800 Subject: [PATCH] md updates --- Source/CBIOS/cbios.asm | 1 - Source/HBIOS/Build.sh | 4 + Source/HBIOS/md.asm | 172 +++++++++++++++++++++-------------------- 3 files changed, 93 insertions(+), 84 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 6240a81b..a9850fc6 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -290,7 +290,6 @@ DPBMAP: .DW DPB_FD120 ; MID_FD120 .DW DPB_FD111 ; MID_FD111 .DW DPB_HDNEW ; MID_HDNEW (1024 DIR ENTRIES) - .DW DPB_ROM ; MID_MDFSH ; DPBCNT .EQU ($ - DPBMAP) / 2 ; diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 91d4e22c..f8986645 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -4,6 +4,7 @@ set -e CPMCP=../../Tools/`uname`/cpmcp +CPMCH=../../Tools/`uname`/cpmchattrib timestamp=$(date +%Y-%m-%d) #timestamp="2020-02-24" @@ -144,6 +145,9 @@ echo "copying systems to $romdiskfile" $CPMCP -f $romfmt $romdiskfile ../CPM22/cpm_$BIOS.sys 0:cpm.sys $CPMCP -f $romfmt $romdiskfile ../ZSDOS/zsys_$BIOS.sys 0:zsys.sys +echo "setting files in the ROM disk image to read only" +$CPMCH -f $romfmt $romdiskfile r 0:*.* + if [ $platform = UNA ] ; then cp osimg.bin $outdir/UNA_WBW_SYS.bin cp $romdiskfile $outdir/UNA_WBW_ROM$romsize.bin diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 4e0f27ae..936f3ac1 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -10,7 +10,7 @@ ;-------------------------------------------------------------------------------------------------- ; 0x00 MEMORY DISK 0x02 RAM DRIVE %00101000 HD STYLE, NON-REMOVABLE, TYPE-RAM ; 0x00 MEMORY DISK 0x01 ROM DRIVE %00100000 HD STYLE, NON-REMOVABLE, TYPE-ROM -; 0x00 MEMORY DISK 0x01 FLASH DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH +; 0x00 MEMORY DISK 0x01 ROM DRIVE %00111000 HD STYLE, NON-REMOVABLE, TYPE-FLASH ; MD_DEVCNT .EQU 2 ; NUMBER OF MD DEVICES SUPPORTED MD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES @@ -173,27 +173,17 @@ MD_GEOM1: ; MD_DEVICE: LD D,DIODEV_MD ; D := DEVICE TYPE -; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER -; LD E,A ; PUT IN E FOR RETURN -; OR A ; SET FLAGS - LD E,(IY+MD_DEV) - LD C,(IY+MD_ATTRIB) -; LD C,%00100000 ; ASSUME ROM DISK ATTRIBUTES -; JR Z,MD_DEVICE1 ; IF ZERO, IT IS ROM DISK, DONE -; LD C,%00101000 ; USE RAM DISK ATTRIBUTES + LD E,(IY+MD_DEV) ; GET DEVICE NUMBER + LD C,(IY+MD_ATTRIB) ; GET ATTRIBUTE LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,0 ; L := 0, NO BASE I/O ADDRESS -MD_DEVICE1: XOR A ; SIGNAL SUCCESS RET ; ; ; MD_MEDIA: -; LD A,(IY+MD_DEV) ; GET DEVICE NUM -; ADD A,MID_MDROM ; OFFSET BY MD ROM -; LD E,A ; RESULTANT MEDIA ID TO E - LD E,(IY+MD_MID) + LD E,(IY+MD_MID) ; GET MEDIA ID LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE XOR A ; SIGNAL SUCCESS RET @@ -210,7 +200,6 @@ MD_SEEK: LD (IY+MD_LBA+3),D ; ... XOR A ; SIGNAL SUCCESS RET ; AND RETURN - ; ; ; @@ -238,11 +227,8 @@ MD_WRITE: LD BC,MD_WRSEC MD_WR1: LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC -; LD A,(IY+MD_DEV) ; GET DEVICE NUMBER -; OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) -; JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE - LD A,(IY+MD_MID) ; IF THE DEVICES MEDIA - CP MID_MDROM ; IS NOT ROM THEN WE CAN + LD A,(IY+MD_ATTRIB) ; IF THE DEVICES ATTRIBUTE + CP MD_AROM ; IS NOT ROM THEN WE CAN JR NZ,MD_RW ; WRITE TO IT LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN LD A,ERR_READONLY ; SIGNAL ERROR @@ -286,9 +272,73 @@ MD_RW3: ; READ FLASH ; MD_RDSECF: + CALL MD_IOSETUPF CALL MD_RDSEC + PRTS("rf$"); RET ; +; +; +MD_IOSETUPF: + PUSH IY + LD L,(IY+MD_LBA+0) ; HL := LOW WORD OF LBA + LD H,(IY+MD_LBA+1) + INC H ; SKIP FIRST 128MB (256 SECTORS) +; LD DE,256 +; ADD HL,DE +; + CALL PRTHEXWORDHL +; + LD A,L ; SAVE LBA 4K + AND %11111000 ; BLOCK WE ARE + LD C,A ; GOING TO + LD B,H ; ACCESS +; + LD D,0 ; CONVERT LBA + LD E,H ; TO ADDRESS + LD H,L ; MULTIPLY BY 512 + LD L,D ; DE:HL = HLX512 + SLA H + RL E + RL D +; + CALL PC_COLON + CALL PRTHEX32 + CALL PC_SPACE +; + PUSH HL ; IS THE SECTOR + LD HL,MD_LBA4K ; WE WANT TO + LD A,C ; READ ALREADY + CP (HL) ; IN THE 4K + JR NZ,MD_SECR ; BLOCK WE HAVE + INC HL ; IN THE BUFFER + LD A,B + CP (HL) + JR Z,MD_SECM +; +MD_SECR: + POP HL ; DESIRED SECTOR + ; IS NOT IN BUFFER + LD (MD_LBA4K),BC ; WE WILL READ IN + ; A NEW 4K SECTOR. + ; SAVE THE 4K LBA + ; FOR FUTURE CHECKS +; + LD IX,FF_BUFFER ; SET DESTINATION ADDRESS + CALL FF_RINIT ; READ 4K SECTOR +; + LD DE,FF_BUFFER + CALL DUMP_BUFFER + PUSH HL +; +MD_SECM:POP HL + POP IY + RET +; +MD_LBA4K .DW $FFFF + +; +; ; READ RAM / ROM ; MD_RDSEC: @@ -324,6 +374,7 @@ MD_RDSEC: ; MD_WRSECF: CALL MD_WRSEC + PRTS("wf$"); RET ; ; WRITE RAM @@ -424,6 +475,7 @@ MD_IOSETUP2: ; ROM ; ; ; +#IF (MDTRACE >= 2) MD_PRT: PUSH AF PUSH BC @@ -465,6 +517,7 @@ MD_PRT: POP AF RET +#ENDIF ; ; ; @@ -492,7 +545,6 @@ MD_PRT: ;================================================================================================== ; FF_DBG: .EQU 0 ; DEBUG -FF_HBX: .EQU 1 ; =0 USE STACK, =1 USE HBX_BUF ; FF_RW .DB 00h ; READ WRITE FLAG FF_TGT .EQU 0BFB7H ; TARGET CHIP FOR R/W FILESYSTEM @@ -687,55 +739,6 @@ FF_NXT2:CALL PRTSTR ; AFTER SEARCH DISPLAY THE RESULT ; ;====================================================================== ; -#IF (FF_HBX==0) -FF_FNCALL: ; USING STACK FOR CODE AREA - CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY -; - POP DE ; GET ROUTINE TO CALL -; - LD (FF_STACK),SP ; SAVE STACK - LD HL,(FF_STACK) -; - LD BC,64 -; LD BC,FF_I_SZ ; CODE SIZE REQUIRED - CCF ; CREATE A RELOCATABLE - SBC HL,BC ; CODE BUFFER IN THE - LD SP,HL ; STACK AREA -; - PUSH HL ; SAVE THE EXECUTE ADDRESS - EX DE,HL ; PUT EXECUTE / START ADDRESS IN DE -; LD HL,FF_IDENT ; COPY OUR RELOCATABLE - LDIR ; CODE TO THE BUFFER - POP HL ; CALL OUR RELOCATABLE CODE - - PUSH IY ; PUT BANK AND SECTOR - POP BC ; DATA IN BC -; -#IF (FF_DBG==1) - CALL PRTHEXWORD -#ENDIF -; - HB_DI - CALL JPHL ; EXECUTE RELOCATED CODE - HB_EI -; - LD HL,(FF_STACK) ; RESTORE ORIGINAL - LD SP,HL ; STACK POSITION -; -#IF (FF_DBG==1) - CALL PC_SPACE - CALL PRTHEXWORD - CALL PC_SPACE - EX DE,HL - CALL PRTHEXWORDHL - CALL PC_SPACE - EX DE,HL -#ENDIF -; - LD A,C ; RETURN WITH STATUS IN A -; - RET -#ELSE FF_FNCALL: ; USING HBX_BUF FOR CODE AREA CALL FF_CALCA ; GET BANK AND SECTOR DATA IN IY ; @@ -744,10 +747,10 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA LD DE,HBX_BUF ; PUT EXECUTE / START ADDRESS IN DE LD BC,HBX_BUFSIZ ; CODE SIZE REQUIRED ; - PUSH DE ; SAVE THE EXECUTE ADDRESS +; PUSH DE ; SAVE THE EXECUTE ADDRESS ; COPY OUR RELOCATABLE LDIR ; CODE TO THE BUFFER - POP HL ; CALL OUR RELOCATABLE CODE +; POP HL ; CALL OUR RELOCATABLE CODE PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC @@ -757,7 +760,7 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA #ENDIF ; HB_DI - CALL JPHL ; EXECUTE RELOCATED CODE + CALL HBX_BUF ; EXECUTE RELOCATED CODE HB_EI ; #IF (FF_DBG==1) @@ -773,8 +776,6 @@ FF_FNCALL: ; USING HBX_BUF FOR CODE AREA LD A,C ; RETURN WITH STATUS IN A ; RET - -#ENDIF ; ;====================================================================== ; IDENTIFY FLASH CHIP. @@ -865,7 +866,7 @@ FF_EINIT: ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; A CONTAINS CURRENT BANK ; ON EXIT DE CONTAINS ID WORD -; A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; C RETURNS STATUS FLASH 0=SUCCESS FF=FAIL ;====================================================================== ; FF_ERASE: ; THIS CODE GETS RELOCATED TO HIGH MEMORY @@ -1086,19 +1087,22 @@ FF_RINIT: ; ON ENTRY BC CONTAINS BANK AND SECTOR DATA ; IX POINTS TO DATA TO BE WRITTEN ; A CONTAINS CURRENT BANK -; ON EXIT A RETURNS STATUS FLASH 0=SUCCESS FF=FAIL +; ON EXIT NO STATUS RETURNED ;====================================================================== ; FF_SREAD: ; THIS CODE GETS RELOCATED TO HIGH MEMORY -; - PUSH AF ; SAVE CURRENT BANK ; LD H,C ; SECTOR LD L,$00 ; ADDRESS LD D,L ; INITIALIZE LD E,L ; BYTE COUNT ; -FF_RD1: + LD (FF_RST),SP ; SAVE STACK + LD SP,HBX_BUF + (FF_RD1-FF_SREAD) ; SETUP TEMP STACK +; + PUSH AF ; SAVE CURRENT BANK +; +FF_RD1: LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO READ LD C,(HL) ; READ BYTE @@ -1107,7 +1111,7 @@ FF_RD1: PUSH AF ; SELECT BANK CALL HBX_BNKSEL ; TO WRITE LD (IX+0),C ; WRITE BYTE - +; INC HL ; NEXT SOURCE LOCATION INC IX ; NEXT DESTINATION LOCATION ; @@ -1116,10 +1120,12 @@ FF_RD1: JR Z,FF_RD1 POP AF ; RETURN TO ORIGINAL BANK -; CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - XOR A + CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY +; LD C,D ; RETURN STATUS + LD SP,(FF_RST) ; RESTORE STACK ; RET +FF_RST .DW 0 ; SAVE STACK ; FF_R_SZ .EQU $-FF_SREAD ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ;