C'est un problème d'accès à la disquette.
On obtient exactement ce problème quand le contrôleur de disquette retourne une erreur.
GET donne une autre réponse car c'est une commande qui est dans le DOS.
Si tu mets un Trace sur les instructions de lectures de disquettes, tu devrais trouver une fonction qui retourne une fonction d'erreur.
Les fonctions du Flex sont documentées dans le listing qui suit.
Bon courage
Extrait des adresses
DE00 ORG $DE00
>DE00 7E DE3C DREAD JMP LDE3C
DE03 7E DEE5 WRITE JMP LDEE5
DE06 7E DF3A VERFY JMP LDF3A
DE09 7E DF5A RESTOR JMP LDF5A
DE0C 7E DF70 DRIVE JMP LDF70
DE0F 7E DFC7 CHECK JMP LDFC7
DE12 7E DFCF QUICK JMP LDFCF
>DE15 7E DE2C COLDS JMP LDE2C
>DE18 7E DE36 WARMS JMP LDE36
Driver de disquettes:
* DISASSEMBLY BY DYNAMITE OF 1.PRODOS.SYS
* STANDARD PRE-NAMED LABEL EQUATES
LINBUF EQU $C080
SYSFCB EQU $C840
RETADR EQU $CC43
BASFCB EQU $D409
CURFCB EQU $D40B
* EXTERNAL LABEL EQUATES
CMDREG EQU $F000 CMDREG
TRKREG EQU $F001 TRKREG
SECREG EQU $F002 SECREG
DATREG EQU $F003 DATREG
ORG $DE00
DREAD JMP READ READ Read a single sector
DWRITE JMP WRITE WRITE Write a single sector
DVERFY JMP VERIFY VERIFY Verify last sector written
DRESTOR JMP RESTORE RESTORE Restore head to track #0
DDRIVE JMP DRIVE DRIVE Select the specified drive
DCHECK JMP CHKRDY CHKRDY Check for drive ready
DQUICK JMP QUICK QUICK Quick check for drive ready
DCOLDS JMP INIT INIT Driver initialize (cold start)
DWARMS JMP WARM WARM Driver initialize (warm start)
DSEEK JMP SEEKIT SEEK Seek to specified track
DRVTBL FCB $00 MAX SECTOR PER SIDE
LDE1F FCB $DE,$DD,$DB,$D7 DRIVE PRESENT
FCB $00
LDE24 FCB $00 CURRENT DRIVE
LDE25 FCB $00,$00,$00,$00 DRIVE TRACK MEMORY REGISTER
LDE29 FCB $00 COPY OF STATUS REG
LDE2A FCB $00 CURRENT SIDE MASQ
LDE2B FCB $00,$00 STEP RATE
* INIT AND WARM
*
* DRIVER INITIALIZATION
INIT LDX #$DE24 POINT TO VARIABLES
LDB #8 NO. OF BYTES TO CLEAR
LDE31 CLR 0,X+ CLEAR THE STORAGE
DECB
BNE LDE31
WARM LDA #$DF SET MASQ
STA LE080 IN DRIVE REG
RTS
* READ This routine reads the specified sector into memory at the
* specified address. This routine should perform a seek
* operation if necessary. A sector is 256 bytes in length.
*
* ENTRY - (X) = Address in memory where sector is to be placed.
* (A) = Track Number
* (B) = Sector Number
*
* EXIT - (X) May be destroyed
* (A) May be destroyed
* (B) = Error condition
* (Z) = 1 if no error
* = 0 if an error
READ BSR SEEKIT
TST FBFLAG spooling active?
BEQ LDE45 no - proceed
SWI3 give spooler opportunity to run
LDE45 ORCC #$50 disable FIRQ and IRQ
LDA DATREG load command register (useless)
LDA #$8C read sector command
ORA LDE2A CURRENT SIDE MASQ
STA CMDREG issue command
JSR DELAY wait for WD2793 to accept command
CLRB set byte counter
LDE56 LDA CMDREG
BITA #2 TEST DATA READY ?
BNE LDE67 GET IT
BITA #1 STILL BUSY ?
BNE LDE56 LOOP
TFR A,B
BSR LDE84
BRA LDE71
LDE67 LDA DATREG
STA 0,X+ STORE IN FCB
DECB
BNE LDE56 MORE TO COME ?
BSR LDE76
LDE71 BITB #$1C
ANDCC #$AF
RTS
LDE76 TST FBFLAG spooling active?
BEQ LDE7D no - proceed
SWI3 give spooler opportunity to run
LDE7D LDB CMDREG
BITB #1 STILL BUSY ?
BNE LDE7D YES LOOP
LDE84 STB LDE29 SAVES STATUS REG
BITB #$10 RECORD NOT FOUND ERROR ?
BEQ LDEAC NO, PROCEED
LDY #LDE1F
LDA LDE24
LDB A,Y
BITB #$10
BEQ LDEB0
TST LDE23
BNE LDEA1
EORB #$20
STB A,Y
*SET MAX SECTOR BY SIDE
LDEA1 LDA #$0A MAX TRACK SD
BITB #$20
BNE LDEA9
LDA #$12
LDEA9 STA LDE1E
LDEAC LDB LDE29
RTS
LDEB0 LDA #$0F
BRA LDEA9
* SEEK Seeks to the track specified in the 'A' accumulator. In
* double-sided systems, this routine should also select the
* correct side depending on the sector number supplied in 'B'.
*
* ENTRY - (A) = Track Number
* (B) = Sector Number
*
* EXIT - (X) May be destroyed (See text)
* (A) May be destroyed (See text)
* (B) = Error condition
* (Z) = 1 if no error
* = 0 if an error
SEEKIT LBSR LDFB5 WAIT FOR DRIVE READY
CLR LDE2A SIDE 1
CMPB DRVTBL COMPARE TO MAX SECTOR PER SIDE
BLS LDEC5 SIDE 1, JUMP
INC LDE2A MASQ FOR CURRENT SIDE
INC LDE2A
LDEC5 STB SECREG SET SECTOR
CMPA TRKREG CHECK TRACK
BEQ LDEE2 CURRENT TRACK ?
STA DATREG NO, STORE NEW TRACK
JSR DELAY
LDA #$18 SET SEEK COMMAND
ORA LDE2B SET INTERRUPT COMMAND
STA CMDREG SET COMMAND
JSR DELAY
BSR LDE76 CHECK RECORD NOT FOUND ERROR ?
BITB #$10
LDEE2 JMP DELAY DELAY AND RETURN
* WRITE This routine writes the information from the specifed memory
* buffer area to the disk sector specified. This routine should
* perform a seek operation if necessary. A sector is 256 bytes
* in length.
*
* ENTRY - (X) = Address of 256 memory buffer containing data
* to be written to disk
* (A) = Track Number
* (B) = Sector Number
*
* EXIT - (X) May be destroyed
* (A) May be destroyed
* (B) = Error condition
* (Z) = 1 if no error
* = 0 if an error
WRITE BSR SEEKIT
TST FBFLAG
BEQ LDEEE
SWI3
LDEEE ORCC #$50
LDB DATREG
LDB #$AC
ORB LDE2A
LDA 0,X+
STA DATREG
STB CMDREG
JSR DELAY
LDB #2
LDF05 BITB CMDREG
BEQ LDF0F
LDF0A STA DATREG
LDA 0,X+
LDF0F BITB CMDREG
BNE LDF0A
BITB CMDREG
BNE LDF0A
BITB CMDREG
BNE LDF0A
STA LDE29
LDA #1
BITA CMDREG
BEQ LDF32
LDA LDE29
BITB CMDREG
BNE LDF0A
BRA LDF05
LDF32 JSR LDE76
BITB #$5C
LDF37 ANDCC #$AF
RTS
* VERIFY The sector just written to the disk is to be verified to
* determine if there are CRC errors. No seek is required as
* this routine will only be called immediately after a write
* single sector operation.
*
* ENTRY - No entry parameters
*
* EXIT - (X) May be destroyed
* (A) May be destroyed
* (B) = Error condition
* (Z) = 1 if no error
* = 0 if an error
VERIFY BSR LDFB5
TST FBFLAG
BEQ LDF43
SWI3
LDF43 ORCC #$50
LDA DATREG
LDA #$8C
ORA LDE2A
STA CMDREG
JSR DELAY
JSR LDE76
BITB #$18
BRA LDF37
LDF5A PSHS X
BSR DRIVE
LDA #8
ORA LDE2B
STA CMDREG
JSR DELAY
JSR LDE76
BITB #$D8
PULS X,PC
* DRIVE The specified drive is to be selected. The drive is specified
* in the FCB pointed to by the contents of the X register. Note
* that the drive number is the 4th byte of the FCB.
*
* ENTRY - (X) = FCB address (3,X contains drive number)
*
* EXIT - (X) May be destroyed
* (A) May be destroyed
* (B) = $0F if non-existent drive
* = Error condition otherwise
* (Z) = 1 if no error
* = 0 if an error
* (C) = 0 if no error
* = 1 if an error
DRIVE LDA 3,X GET DRIVE NUMBER
CMPA #3 ENSURE IT'S < 4
BLS LDF7B BRANCH IF OK
LDF76 LDB #$0F ELSE SET ERROR VALUE
ORCC #1
RTS RETURN
LDF7B LDY #LDE1F DRIVE TRACK MEMORY REGISTER
LDB A,Y GET CURRENT TRACK OF TARGET DRIVE
BEQ LDF76
JSR LDFE1 FIND TRACK
LDB TRKREG GET CURRENT TRACK
STB 0,X SAVE IT IN REPOSITORY
STA LDE24 SAVE CURRENT DRIVE
LDB A,Y
STB LDE29 SAVE TARGET TRACK
JSR LDEA1 SET MAX SECTOR BY SIDE
CLR LDE2B CLEAR STEP RATE
BITB #$C0
BNE LDFA0
NOP
NOP
NOP
LDFA0 STB LE080 SET NEW DRIVE
BSR LDFE1 FIND NEW TRACK
LDA 0,X GET IT
STA TRKREG PUT NEW TRACK IN WD
BSR LDFB5 WAIT FOR DRIVE READY
LDB CMDREG
BMI LDFDE
LDFB1 CLRB
ANDCC #$FE
RTS
* WAIT FOR DRIVE READY
LDFB5 PSHS A,X
LDX #L0000
LDFBA LEAX -1,X
BEQ LDFC5
NOP
NOP
LDA CMDREG
BMI LDFBA
LDFC5 PULS A,X,PC
CHKRDY BSR DRIVE
BEQ LDFB5
LDB #$80
BRA LDFDE
QUICK LDB CMDREG
BMI LDFDE
LEAX -1,X
NOP
LEAX 1,X
LDB CMDREG
BPL LDFB1
LDFDE ORCC #1
RTS
* FIND TRACK
LDFE1 LDX #LDE25
LDB LDE24 CURDRV
BEQ LDFEA
ABX
LDFEA RTS
DELAY BSR DEL1
DEL1 BSR LDFEF
DEL2 BSR DEL3
DEL3 RTS
END COLDS