Sprinter-BIOS/bios/exp/EXTENDED/FDD_DRIVER.asm
2026-05-19 19:48:28 +10:00

781 lines
14 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; !FIXIT ALL
;
;[]===========================================================[]
;!TODO
; ®¡ê¥¤¥­¨âì ¯à®æ¥¤ãàë FDD_5x_LONG_READ ¨ FDD_5x_LONG_WRITE
; ®¡ê¥¤¥­¨âì ¯à®æ¥¤ãàë READ_SECTOR ¨ WR_SEC
; 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
; D0 - FDD drv number
; A - D0 - "1" - Removable media
;[]===========================================================[]
;!FIXIT ¢á¥£¤  ¨¤¥â à ¡®â  á ¤ ­­ë¬¨ ¤«ï ¤¨áª  €
FDD_5x_GET_PAR: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD HL,(SYS_PAGE.FDD_TABLE.SECTORS)
LD DE,(SYS_PAGE.FDD_TABLE.CYLINDL)
LD IX,(SYS_PAGE.FDD_TABLE.BytesPerSector)
LD A,(SYS_PAGE.FDD_TABLE.DISK)
LD B,A
EX AF,AF'
OUT (SLOT3),A
XOR A
INC A ; removable media. CF=0, LD A,1
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_SET_PAR: ;!TEST FDD 720/1440
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,B
LD (SYS_PAGE.FDD_TABLE.SECTORS),HL
LD (SYS_PAGE.FDD_TABLE.CYLINDL),DE
LD (SYS_PAGE.FDD_TABLE.BytesPerSector),IX
LD (SYS_PAGE.FDD_TABLE.DISK),A
;
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND A
RET
;[]===========================================================[]
;Function: Detect Disk Density
; A - Disk
;Return:
; A - Flag D7 - "1" - High Density, "0" - Double Density
; B - bit0=1 removable
;[]===========================================================[]
FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
CALL SET_DOS_ON
CALL DISK_ID
PUSH AF
CALL SET_DOS_OFF
POP AF
LD B,%0000'0001 ;bit0=1 removable, bit1=1 drive changed, bit7..2 reserved ; [ ]
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,.int
; [ ] à §¬¥à  ᥪâ®à 
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD H,B
LD L,0
LD (SYS_PAGE.FDD_TABLE.BytesPerSector),HL
EX AF,AF'
OUT (SLOT3),A
;
.int: CALL SAVE_INTERRUPTS.restore
JR C,.MOTOR_OFF
;
CALL RESWG
XOR A ;!HARDCODE CMD Š<>1818ƒ93
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 ;!HARDCODE CMD Š<>1818ƒ93
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
RET
;[]===========================================================[]
;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:
EXX
LD B,#80 ; COMMAND READ ;!HARDCODE CMD Š<>1818ƒ93
EXX
;
.RW_Shared: 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 ; Memory Page Number
EX AF,AF'
PUSH BC
CALL SET_DOS_ON
CALL S_FDD
CALL SET_SPEED
CALL NTRACK
POP BC
EX DE,HL
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD IY,(SYS_PAGE.FDD_TABLE.BytesPerSector)
LD XH,C ; Memory Page Number
LD A,(SYS_PAGE.FDD_TABLE.SECTORS)
LD C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP: LD A,D
EXX
PUSH BC
CALL SEEK
POP BC
EXX
PUSH DE
PUSH BC
PUSH HL
CALL FDD_RW_SECTOR
JR C,.ERRDOS
; à §¬¥à ᥪâ®à 
LD D,YH
LD E,YL
;
POP HL
POP BC
ADD HL,DE
;
CALL C,CHANGE_MEM_BLK
;
.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 ; Memory Page Number
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
;!TEST
;LD BC,0
;ADC HL,BC
;LD B,A
;XOR A
;RET
;
LD B,A
RET NC
INC HL
XOR A
RET
;
.ERRDOS: POP HL
POP BC
POP DE
CALL SET_DOS_OFF
EX DE,HL
EX AF,AF'
EXX
LD C,XH ; Memory Page Number
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)
;?? B - Sector counter
;[]===========================================================[]
FDD_5x_LONG_WRITE:
EXX
LD B,#A0 ;COMMAND WRITE ;!HARDCODE CMD Š<>1818ƒ93
EXX
JP FDD_5x_LONG_READ.RW_Shared
;
;-------------------------------
;WRITE SECTOR
;-------------------------------
FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
.RETRY: ;DI
PUSH HL
PUSH DE
LD A,E
INC A
OUT (FDC_93.Sector),A
IN A,(SLOT3)
EX AF,AF'
LD A,XH
OUT (SLOT3),A
;
LD B,4
LD C,FDC_93.Data
EXX
LD A,B ; COMMAND read or write
EXX
OUT (FDC_93.Command),A
;
.wait_loop: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR NZ,.RW_PROC
INC DE
LD A,E
OR D
JR NZ,.wait_loop
DJNZ .wait_loop
SCF
JR .after_rw ; error
;
.RW_PROC: EXX
BIT 5,B
EXX
; [ ] 15/04/25 à §¬¥à ᥪâ®à  ¡®«ìè¥, 祬 ãáâ ­®¢«¥­® ¢ SYS_PAGE.FDD_TABLE.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã
LD D,YH
LD E,YL
INC DE
;
JR NZ,.write_loop
;READ BYTE
.read_loop: DEC DE
LD A,D
OR E
JR Z,.SectorSizeError
;
INI
.wait_data_r: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wait_data_r
JP P,.read_loop ; JUMP if "¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0"
.rw_return: ;
.after_rw: EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;
POP DE
POP HL
;EI
LD A,BIOS.Error.NotReady
JR C,.CMD_ERROR
;
IN A,(FDC_93.Command)
LD C,A
AND #7F
; NORMAL EXIT
RET Z
;
BIT 6,C
LD A,BIOS.Error.WriteProtect
JR NZ,.error_exit
;
BIT 2,C
JR NZ,.data_lost
;
LD A,BIOS.Error.Seek
.CMD_ERROR: DEC D
JR Z,.error_exit
;
PUSH DE
PUSH HL
CALL RESWG ; RESET_WG
LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
POP HL
POP DE
JR .RETRY
;
.data_lost: DEC D ; ¯®â¥àï ¤ ­­ëå
JR NZ,.RETRY
;
EXX
BIT 5,B
EXX
LD A,BIOS.Error.Read ; Error Read
JR Z,.error_exit
;
LD A,BIOS.Error.Write ; Error Write
;
.error_exit: EX AF,AF'
LD A,#D0 ;!HARDCODE CMD Š<>1818ƒ93
OUT (FDC_93.Command),A ;STOP OPERATION
EX AF,AF'
BIT 0,C
SCF
RET Z
LD A,BIOS.Error.SectorNotFound
RET
;
;WRITE BYTE
.write_loop: DEC DE
LD A,D
OR E
JR Z,.SectorSizeError
;
OUTI
.wwait_data: IN A,(FDC_93.DrvCTRL)
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR Z,.wwait_data
JP P,.write_loop
JP .rw_return
;
.SectorSizeError:
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
POP DE
POP HL
;EI
; A = 0
LD C,A
LD A,BIOS.Error.UnknownDevice
JR .error_exit
;
; ‚àã¡ ¥â âà¥âìî ª àâã ¯®à⮢
SET_DOS_ON: EX AF,AF'
LD A,CNF_PORT.CNF_3 + ROM.BIOS
OUT (SYS_PORT.ROM),A ; - OPEN
EX AF,AF'
RET
; ‚àã¡ ¥â ­ã«¥¢ãî ª àâã ¯®à⮢
SET_DOS_OFF: EX AF,AF'
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),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,(SYS_PAGE.FDD_TABLE.DISK)
AND #FE
OR B
LD (SYS_PAGE.FDD_TABLE.DISK),A
EX AF,AF'
OUT (SLOT3),A
POP BC
RET
;
;----------------------------------------------------------------------;
; CHANGE_SPEED: IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,(SYS_PAGE.FDD_TABLE.DISK)
; XOR #80
; LD (SYS_PAGE.FDD_TABLE.DISK),A
; RLA
; EX AF,AF'
; OUT (SLOT3),A
; EX AF,AF'
; JR NC,FDD.SET720
; 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,(SYS_PAGE.FDD_TABLE.DISK)
; ;AND #80
; RLA
; EX AF,AF'
; OUT (SLOT3),A
; EX AF,AF'
; JR C,FDD.SET1440
; FDD.SET720: LD A,FDD_Density.SET_720
; OUT (FDD_Density),A
; RET
CHANGE_SPEED: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK)
XOR #80
LD (SYS_PAGE.FDD_TABLE.DISK),A
JR SET_SPEED.set
;
;
SET_SPEED: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK)
.set: AND #80
RRA
RRA
OR 1
OUT (FDD_Density),A
EX AF,AF'
OUT (SLOT3),A
RET
;----------------------------------------------------------------------;
////////////////////////////////////////////////////////////////////////
; ‚室: BC - ¢­ãâ७­¨© ¨ ¢­¥è­¨© áçñâ稪¨
WAIT_FDD_FOR_SEARCH_TRACK:
LD A,#C0 ;!HARDCODE CMD Š<>1818ƒ93
OUT (FDC_93.Command),A
PUSH BC
CALL .LOOP
POP BC
RET NC
CALL CHANGE_SPEED
DEC C
JR NZ,WAIT_FDD_FOR_SEARCH_TRACK
SCF
RET
;
.LOOP: LD HL,#F000
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
AND #C0
RET NZ
;
.ID_LP4: DEC HL
LD A,H
OR L
JR NZ,.loop_reg_HL
;
DJNZ .LOOP
SCF
RET
////////////////////////////////////////////////////////////////////////
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
; ¢ë室: A - FDD_INIT_TABLE.DISK, B - sector size high byte
DISK_ID: EXX
CALL SET_SPEED
IN A,(FDC_93.Track)
OUT (FDC_93.Data),A
LD A,#18 ;!TODO ¢ë¯¨á âì ª®¬¬ ­¤ë ‚ƒ ;SEARCH ;!HARDCODE CMD Š<>1818ƒ93
CALL EXECOM
; ªã᮪ ¤«ï ¡ëáâàëå ä«®¯¯ à¥©
LD BC,#0104 ; 1 - áçñâ稪
CALL WAIT_FDD_FOR_SEARCH_TRACK
JR NC,.Read_Index
; ªã᮪ ¤«ï â®à¬®§­ëå ä«®¯¯ à¥©
LD BC,#0504 ; 1 - áçñâ稪
CALL WAIT_FDD_FOR_SEARCH_TRACK
JR NC,.Read_Index
EXX
;SCF
RET
;
.Read_Index: ;
; „ ­­ë¥ FDC_93.Data:
; ­®¬¥à 樫¨­¤à  BYTE
; ­®¬¥à £®«®¢ª¨ BYTE
; ­®¬¥à ᥪâ®à  BYTE
; ¤«¨­  ᥪâ®à  BYTE
; ª®­â஫쭠ï á㬬  WORD
LD H,4 ; !HARDCODE áçñâ稪 ¤® ¡ ©â  à §¬¥à  ᥪâ®à 
.ID_LP2: IN A,(FDC_93.Data)
DEC H
JR NZ,.ID_LP3
LD L,A ; [ ] à §¬¥à  ᥪâ®à  (áâ à訩 ¡ ©â)
.ID_LP3: IN A,(FDC_93.DrvCTRL)
AND %1100'0000
JR Z,.ID_LP3
JP P,.ID_LP2
LD A,L
EXX
LD B,A ; [ ] à §¬¥à  ᥪâ®à  (áâ à訩 ¡ ©â)
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.DISK)
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND #80
RET
////////////////////////////////////////////////////////////////////////
;
SEEK: LD XL,A
LD C,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(SYS_PAGE.FDD_TABLE.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
CALL NZ,P50ms
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 ;!HARDCODE CMD Š<>1818ƒ93
CALL EXECOM
RET C
EX AF,AF'
LD A,C
OUT (FDC_93.Track),A
RET Z
.STOL: CALL P50ms
RET
;
;P750ms LD B,3
;PMS2 LD A,255
; CALL P1ms
; DJNZ PMS2
; RET
P50ms: PUSH BC
LD A,12
.P1ms: LD C,255
.PMS: DEC C
JR NZ,.PMS
DEC A
JR NZ,.P1ms
POP BC
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
; RET
;
RESWG: LD A,8 ;!HARDCODE CMD Š<>1818ƒ93
;
EXECOM: OUT (FDC_93.Command),A
LD HL,#0000 ; áçñâ稪
PUSH BC
LD B,3 ; áçñâ稪
;
.WREST: DEC HL
LD A,H
OR L
JR NZ,.get_state
;
DJNZ .WREST
;
POP BC
SCF
RET
;
.get_state: IN A,(FDC_93.DrvCTRL)
AND #80
JR Z,.WREST
POP BC
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,(SYS_PAGE.FDD_TABLE.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
DI
LD A,#80
JP PE,.set_R
XOR A
.set_R: LD R,A
POP AF
RET
; ;
.restore: PUSH AF
LD A,R
DI
RLA
JR NC,.set_di
EI
.set_di: POP AF ; PE
RET
;[]===========================================================[]