|
|
|
@ -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,17 +1087,20 @@ 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 |
|
|
|
; |
|
|
|
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 |
|
|
|
@ -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 |
|
|
|
; |
|
|
|
|