Crazy-Blaster/Crazy BIOS/exp/EXTENDED/FDD_DRIVER_2.asm
2024-07-31 03:29:05 +10:00

847 lines
14 KiB
NASM

; !FIXIT ALL
;
;[]===========================================================[]
; FDD.CHANGE:
; LD A,#01
; AND A
; RET
;[]===========================================================[]
;Function: Get Current Media Parameters
; A - Disk
;Return:
; H - Heads
; L - Sectors
; DE - Cylinders
; IX - Capacity sector in bytes
; B - Flags
; D7 - "1" - High Density, "0" - Double Density
;[]===========================================================[]
;!FIXIT ¢á¥£¤  ¨¤¥â à ¡®â  á ¤ ­­ë¬¨ ¤«ï ¤¨áª  €
FDD_5x_GETMED:
;!TEST FDD 720/1440
IF FDD_NormalCount
LD IY,FDD_INI_TABLE.FDD_0
DEC A
JR C,.getParams
LD IY,FDD_INI_TABLE.FDD_1
.getParams:
ENDIF
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;!TEST FDD 720/1440
IF FDD_NormalCount
LD L,(IY+1) ;SECTORS
LD H,(IY+2) ;HEADS
LD E,(IY+3) ;CYLINDL
LD D,(IY+4) ;CYLINDH
LD A,(IY+5) ;B_P_S low
LD XL,A
LD A,(IY+6) ;B_P_S High
LD XH,A
LD A,(IY+0) ;F144/720
ELSE
LD HL,(FDD_INI_TABLE.FDD_0.SECTORS)
LD DE,(FDD_INI_TABLE.FDD_0.CYLINDL)
LD IX,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD A,(FDD_INI_TABLE.FDD_0.F144)
ENDIF
LD B,A
EX AF,AF'
OUT (SLOT3),A
;EX AF,AF'
AND A
RET
;[]===========================================================[]
;Function: Set Current Media Parameters
; A - Disk
; H - Heads
; L - Sectors
; DE - Cylinders
; IX - Capacity sector in bytes
; B - Flags
; D7 - "1" - High Density, "0" - Double Density
;Return: None
;[]===========================================================[]
FDD_5x_SETMED: ;!TEST FDD 720/1440
IF FDD_NormalCount
LD IY,FDD_INI_TABLE.FDD_0
DEC A
JR C,.setParams
LD IY,FDD_INI_TABLE.FDD_1
ENDIF
;
.setParams: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
;!TEST FDD 720/1440
IF FDD_NormalCount
LD (IY+1),L ;SECTORS
LD (IY+2),H ;HEADS
LD (IY+3),E ;CYLINDL
LD (IY+4),D ;CYLINDH
LD A,XL
LD (IY+5),A ;B_P_S low
LD A,XH
LD (IY+6),A ;B_P_S High
LD (IY+0),B ;F144/720
LD A,B
ELSE
LD A,B
LD (FDD_INI_TABLE.FDD_0.SECTORS),HL
LD (FDD_INI_TABLE.FDD_0.CYLINDL),DE
LD (FDD_INI_TABLE.FDD_0.BytesPerSector),IX
LD (FDD_INI_TABLE.FDD_0.F144),A
ENDIF
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;
;!TEST FDD 720/1440
IF FDD_NormalCount
AND 1
JP Z,FN_TURBO.SET_FDD_720
JP FN_TURBO..SET_FDD_1440
ELSE
AND A
RET
ENDIF
;[]===========================================================[]
;Function: Detect Disk Density
; A - Disk
;Return:
; A - Flag D7 - "1" - High Density, "0" - Double Density
;[]===========================================================[]
FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
CALL DISK_ID
PUSH AF
CALL SET_DOS_OFF
POP AF
JP SAVE_INTERRUPTS.restore
;RET
;[]===========================================================[]
;Function: Reset Disk
; A - Disk
;Return: None
;[]===========================================================[]
FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
CALL S_FDD
CALL DISK_ID
JR C,.MOTOR_OFF
;
CALL RESWG
XOR A
OUT (FDC_93.Track),A
IN A,(FDC_93.Command)
;LD C,A
CALL SET_DOS_OFF
;LD A,C
AND A
JP SAVE_INTERRUPTS.restore
;RET
.MOTOR_OFF: ;PUSH AF
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
LD A,#00
OUT (FDC_93.DrvCTRL),A
LD A,#3C
OUT (FDC_93.DrvCTRL),A
CALL SET_DOS_OFF
; CF=1
LD A,BIOS.Error.NotReady
;POP AF
JP SAVE_INTERRUPTS.restore
;[]===========================================================[]
;Function: Read Sectors
; A - Disk
; HL:IX - Sector
; DE - Address
; B - Sector counter
;Return:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_READ:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;[]===========================================================[]
;Function: Long Read Sectors
; A - Disk
; HL:IX - Sector
; DE - Address
; B - Sector counter
; A'- Memory Page Number
;Return:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_LONG_READ:
CALL SAVE_INTERRUPTS.switch_off
CALL .Start
JP SAVE_INTERRUPTS.restore
;
.Start: PUSH IY
PUSH BC
PUSH HL
PUSH IX
EX AF,AF'
LD C,A
EX AF,AF'
PUSH BC
CALL SET_DOS_ON
CALL S_FDD
CALL SET_SPEED
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP: LD A,D
EXX
CALL SEEK
EXX
PUSH DE
PUSH BC
PUSH HL
CALL READ_SECTOR
JR C,ERRDOS
LD D,YH
LD E,YL
POP HL
POP BC
ADD HL,DE
JR NC,.THISRD
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
.THISRD: POP DE
LD A,C
INC E
CP E
JR NZ,.NINC_T
LD E,0
INC D
.NINC_T: DJNZ .DSK_LP
.RETDOS: CALL SET_DOS_OFF
LD A,XH
EX AF,AF'
EX DE,HL
POP IX
POP HL
POP BC
POP IY
LD A,B
LD C,B
INC B
DEC B
LD B,0
JR NZ,.ADD8BIT
INC B
.ADD8BIT: ADD IX,BC
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
;
ERRDOS: POP HL
POP BC
POP DE
CALL SET_DOS_OFF
EX DE,HL
EX AF,AF'
EXX
LD C,XH
EXX
LD A,B
POP IX
POP HL
POP BC
POP IY
PUSH AF
LD C,A
LD A,B
SUB C
LD C,A
LD B,0
ADD IX,BC
LD C,B
ADC HL,BC
POP BC
EXX
LD A,C
EXX
EX AF,AF'
SCF
RET
;[]===========================================================[]
;Function: Write Sectors
; A - Disk
; HL:IX - Sector
; DE - Address
; B - Sector counter
;Return:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_WRITE:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;[]===========================================================[]
;Function: Long Write Sectors
; A - Disk
; HL:IX - Sector
; DE - Address
; B - Sector counter
; A'- Memory Page Number
;Return:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_LONG_WRITE:
CALL SAVE_INTERRUPTS.switch_off
CALL .Start
JP SAVE_INTERRUPTS.restore
;
.Start: PUSH IY
PUSH BC
PUSH HL
PUSH IX
EX AF,AF'
LD C,A
EX AF,AF'
PUSH BC
CALL SET_DOS_ON
CALL S_FDD
CALL SET_SPEED
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(FDD_INI_TABLE.FDD_0.BytesPerSector)
LD XH,C
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP2: LD A,D
EXX
CALL SEEK
EXX
PUSH DE
PUSH BC
PUSH HL
CALL WR_SEC
JR C,ERRDOS
LD D,YH
LD E,YL
POP HL
POP BC
ADD HL,DE
JR NC,.THISWR
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
.THISWR: POP DE
LD A,C
INC E
CP E
JR NZ,.NINC_T2
LD E,0
INC D
.NINC_T2: DJNZ .DSK_LP2
CALL SET_DOS_OFF
LD A,XH
EX AF,AF'
EX DE,HL
POP IX
POP HL
POP BC
POP IY
LD A,B
LD C,B
INC B
DEC B
LD B,0
JR NZ,.ADW8BIT
INC B
.ADW8BIT: ADD IX,BC
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
;
;-------------------------------
;READ SECTOR
;-------------------------------
READ_SECTOR: LD D,5 ;RETRY COUNT
.RRETRY: ;DI
PUSH DE
LD A,E
INC A
OUT (FDC_93.Sector),A
.FDREAD: IN A,(SLOT3)
EX AF,AF'
LD A,XH
OUT (SLOT3),A
;
LD B,4 ; áçñâ稪
LD C,FDC_93.Data
LD A,#80 ;!HARDCODE COMMAND READ
OUT (FDC_93.Command),A
.FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND #C0
JR NZ,.FDR004
INC DE
LD A,E
OR D
JR NZ,.FDR001
DJNZ .FDR001
SCF
JR .FDR005
;
.FDR004: INI ;READ BYTE
.FDR002: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.FDR002
JP P,.FDR004
.FDR005: EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;
POP DE
;EI
IN A,(FDC_93.Command)
LD C,A
;R01 ; JP C,ERRRD ;READ ERROR
; [x] 29/06/2024
;JP C,.ERR_XRD
JR NC,.NO_ERR_XRD
DEC D
JR Z,.RSTOP
JR .RRETRY
;
.NO_ERR_XRD: ;
AND #7F
RET Z
BIT 2,C
JR NZ,.ERDATA
LD A,BIOS.Error.Seek
DEC D
JR Z,.RSTOP
PUSH DE
CALL RESWG ; RESET_WG
LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
.ERR_XRD: POP DE
JR .RRETRY
;
.ERDATA: DEC D ; POTERIA DANNYH
JR NZ,.RRETRY
.ERRRD: LD A,BIOS.Error.Read
.RSTOP: EX AF,AF'
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
EX AF,AF'
BIT 0,C
SCF
RET Z
LD A,BIOS.Error.SectorNotFound
RET
; ; ;
;
;-------------------------------
;WRITE SECTOR
;-------------------------------
WR_SEC: LD D,5 ;RETRY COUNT
.WRETRY:
;DI
PUSH DE
LD A,E
INC A
OUT (FDC_93.Sector),A
.FDWRITE:
IN A,(SLOT3)
EX AF,AF'
LD A,XH
OUT (SLOT3),A
LD B,4
LD C,FDC_93.Data
LD A,#A0 ;COMMAND WRITE
OUT (FDC_93.Command),A
.FDW001:
IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND #C0
JR NZ,.FDW004
INC DE
LD A,E
OR D
JR NZ,.FDW001
DJNZ .FDW001
SCF
JR .FDW005
.FDW004:
OUTI ;WRITE BYTE
.FDW002:
IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.FDW002
JP P,.FDW004
.FDW005:
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;-------------------------------
POP DE
;EI
IN A,(FDC_93.Command)
LD C,A
;R01
JR C,.ERR_XWR
AND #7F
RET Z
BIT 6,C
LD A,BIOS.Error.WriteProtect
JR NZ,.WSTOP
BIT 2,C
JR NZ,.EWDATA
LD A,BIOS.Error.Seek
DEC D
JR Z,.WSTOP
.ERR_XWR:
PUSH DE
CALL RESWG ; RESET_WG
LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
POP DE
JR .WRETRY
.EWDATA:
DEC D ; POTERIA DANNYH
JR NZ,.WRETRY
.ERRWR: LD A,BIOS.Error.Write
.WSTOP: EX AF,AF'
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
EX AF,AF'
BIT 0,C
SCF
RET Z
LD A,BIOS.Error.SectorNotFound
RET
;
; ‚àã¡ ¥â âà¥âìî ª àâã ¯®à⮢
SET_DOS_ON:
EX AF,AF'
LD A,CNF_PORT.CNF_3 + ROM.BIOS
OUT (CNF_PORT.vBIOS),A ; - OPEN
EX AF,AF'
RET
; ‚àã¡ ¥â ­ã«¥¢ãî ª àâã ¯®à⮢
SET_DOS_OFF:
EX AF,AF'
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (CNF_PORT.vBIOS),A ; - CLOSE
EX AF,AF'
RET
;
S_FDD: PUSH BC
AND 1
LD B,A
OR #3C
OUT (FDC_93.DrvCTRL),A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INI_TABLE.FDD_0.DISK)
AND #FE
OR B
LD (FDD_INI_TABLE.FDD_0.DISK),A
EX AF,AF'
OUT (SLOT3),A
POP BC
RET
;
;
; MOTOR_OFF:
; PUSH AF
; LD A,#D0
; OUT (FDC_93.Command),A ;STOP OPERATION
; LD A,#00
; OUT (FDC_93.DrvCTRL),A
; LD A,#3C
; OUT (FDC_93.DrvCTRL),A
; CALL SET_DOS_OFF
; POP AF
; RET
;
;
CHANGE_SPEED: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INI_TABLE.FDD_0.F144)
XOR #80
LD (FDD_INI_TABLE.FDD_0.F144),A
AND #80
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
JR Z,FDD.SET720
;JP FDD.SET1440 ;ZF=0
FDD.SET1440: LD A,FDD_Density.SET_1440
OUT (FDD_Density),A
RET
;
;
SET_SPEED: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INI_TABLE.FDD_0.F144)
AND #80
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
JR NZ,FDD.SET1440
;JR FDD.SET720 ;ZF=1
FDD.SET720: LD A,FDD_Density.SET_720
OUT (FDD_Density),A
RET
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
DISK_ID: EXX
CALL SET_SPEED
IN A,(FDC_93.Track)
OUT (FDC_93.Data),A
LD A,#18 ;!TODO ¢ë¯¨á âì ª®¬¬ ­¤ë ‚ƒ ;SEARCH ; !HARDCODE
CALL EXECOM
LD C,4 ; áçñâ稪
.loop_reg_C: LD A,#C0
OUT (FDC_93.Command),A
LD HL,#F000 ; áçñâ稪
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP4
;
.ID_LP2: IN A,(FDC_93.Data)
.ID_LP3: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP3
JP P,.ID_LP2
EXX
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INI_TABLE.FDD_0.F144)
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND #80
RET
;
.ID_LP4: DEC HL
LD A,H
OR L
JR NZ,.loop_reg_HL
CALL CHANGE_SPEED
DEC C
JR NZ,.loop_reg_C
EXX
SCF
RET
;
;
SEEK: LD XL,A
LD C,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INI_TABLE.FDD_0.DISK)
AND 1
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
SRL C
JR C,.GT001
OR #3C
.GT001: OR #2C
OUT (FDC_93.DrvCTRL),A
IN A,(FDC_93.Track)
CP C
PUSH BC
CALL NZ,P50ms
POP BC
LD A,C
OUT (FDC_93.Data),A
IN A,(FDC_93.Track)
CP C
EX AF,AF' ;R.TRACK==PHISICAL TRACK
LD A,#18
CALL EXECOM
RET C
EX AF,AF'
LD A,C
OUT (FDC_93.Track),A
RET Z
.STOL: PUSH BC
CALL P50ms
POP BC
RET
;
;P750ms LD B,3
;PMS2 LD A,255
; CALL P1ms
; DJNZ PMS2
; RET
P50ms: LD A,12
.P1ms: LD C,255
.PMS: DEC C
JR NZ,.PMS
DEC A
JR NZ,.P1ms
RET
;
;
RESWG: LD A,8
EXECOM: OUT (FDC_93.Command),A
LD HL,#0000 ; áçñâ稪
.WREST: DEC HL
LD A,H
OR L
SCF
RET Z
;
IN A,(FDC_93.DrvCTRL)
AND #80
JR Z,.WREST
;AND A
RET
;
;
;-------------------------------
; HL:IX - SECTOR
; H - TRACK, L - SECTOR
;HL:IX/SECTOR_PER_TRACK
NTRACK:
PUSH HL
EX (SP),IX
POP HL
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INI_TABLE.FDD_0.SECTORS)
LD C,A
LD B,0
EX AF,AF'
OUT (SLOT3),A
XOR A
.NTRK: INC A
SBC HL,BC
JR NC,.NTRK
EX AF,AF'
LD A,XL
OR XH
JR Z,.NTRK3
EX AF,AF'
DEC IX
JR .NTRK
.NTRK3: EX AF,AF'
ADD HL,BC
DEC A
LD H,A
RET
;
SAVE_INTERRUPTS:
.switch_off: PUSH AF
LD A,R
LD A,#80
JP PE,.set_R
XOR A
.set_R: LD R,A
DI
POP AF
RET
; ;
.restore: PUSH AF
LD A,R
BIT 7,A
JR Z,.set_di
EI
POP AF ; PE
RET
;
.set_di: DI
POP AF ; PO
RET
;[]===========================================================[]