mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 01:11:47 +03:00
855 lines
17 KiB
NASM
855 lines
17 KiB
NASM
;[]===========================================================[]
|
||
|
||
|
||
; FDD.CHANGE:
|
||
; LD A,#01
|
||
; AND A
|
||
; RET
|
||
FDD_COUNTERS:
|
||
.RW_Retries EQU 5
|
||
.INTRQorDRQ EQU 4
|
||
|
||
;[]===========================================================[]
|
||
;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
|
||
; D1-2 - FDD type %01 - 3.5"; %10 - 5.25";
|
||
; D0 - FDD drv number
|
||
; A - D0 - "1" - Removable media
|
||
;[]===========================================================[]
|
||
;[x] ¢á¥£¤ è« à ¡®â á ¤ 묨 ¤«ï ¤¨áª €
|
||
;[x] ç¨â âì ¤ ë¥ á ã«¥¢®© ¤®à®¦ª¨? <20>ਤ㬠âì çâ® ¤¥« âì á £¥®¬¥âਥ© ä«®¯ ३
|
||
FDD_5x_GET_PAR: CALL SELECT_FDD
|
||
RET C
|
||
;
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD L,(IY + FDD_TABLE_s.SECTORS)
|
||
LD H,(IY + FDD_TABLE_s.HEADS)
|
||
LD E,(IY + FDD_TABLE_s.BytesPerSector)
|
||
LD D,(IY + FDD_TABLE_s.BytesPerSector + 1)
|
||
PUSH DE
|
||
POP IX
|
||
LD E,(IY + FDD_TABLE_s.CYLINDL)
|
||
LD D,(IY + FDD_TABLE_s.CYLINDH)
|
||
LD B,(IY + FDD_TABLE_s.DISK)
|
||
LD A,(IY + FDD_TABLE_s.ID)
|
||
SLA A
|
||
OR B
|
||
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: CALL SELECT_FDD
|
||
RET C
|
||
;
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD (IY + FDD_TABLE_s.SECTORS),L
|
||
LD (IY + FDD_TABLE_s.HEADS),H
|
||
LD (IY + FDD_TABLE_s.CYLINDL),E
|
||
LD (IY + FDD_TABLE_s.CYLINDH),D
|
||
PUSH IX
|
||
POP DE
|
||
LD (IY + FDD_TABLE_s.BytesPerSector),E
|
||
LD (IY + FDD_TABLE_s.BytesPerSector + 1),D
|
||
LD A,B
|
||
AND %1000'0000
|
||
RES 7,(IY + FDD_TABLE_s.DISK)
|
||
OR (IY + FDD_TABLE_s.DISK)
|
||
LD (IY + FDD_TABLE_s.DISK),A
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
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 SELECT_FDD
|
||
CALL NC,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 SELECT_FDD
|
||
CALL NC,DISK_ID
|
||
JR C,.int
|
||
; [ ] à §¬¥à ᥪâ®à
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
XOR A
|
||
CP B
|
||
JR NZ,.SetSectorSize
|
||
;
|
||
LD A,#80
|
||
.SetSectorSize: LD (IY + FDD_TABLE_s.BytesPerSector),A
|
||
LD (IY + FDD_TABLE_s.BytesPerSector + 1),B
|
||
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
|
||
JP 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
|
||
EX AF,AF'
|
||
LD C,A ; Memory Page Number
|
||
EX AF,AF'
|
||
CALL SET_DOS_ON
|
||
CALL SELECT_FDD
|
||
CALL C,SET_DOS_OFF
|
||
RET C
|
||
;
|
||
PUSH BC
|
||
PUSH HL
|
||
PUSH IX
|
||
CALL SET_SPEED
|
||
PUSH BC
|
||
CALL NTRACK
|
||
POP BC
|
||
EX DE,HL
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD XH,C ; Memory Page Number
|
||
LD C,(IY + FDD_TABLE_s.SECTORS)
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
;
|
||
.DSK_LP: LD A,D
|
||
EXX
|
||
PUSH BC
|
||
CALL SEEK
|
||
;!FIXIT ª®âà®«ì ®è¨¡ª¨
|
||
POP BC
|
||
EXX
|
||
PUSH DE
|
||
PUSH BC
|
||
PUSH HL
|
||
CALL FDD_RW_SECTOR
|
||
JR C,.ERRDOS
|
||
; à §¬¥à ᥪâ®à
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD E,(IY + FDD_TABLE_s.BytesPerSector)
|
||
LD D,(IY + FDD_TABLE_s.BytesPerSector + 1)
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
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,FDD_COUNTERS.RW_Retries
|
||
.RETRY: PUSH HL
|
||
PUSH DE
|
||
IN A,(SLOT3)
|
||
PUSH AF ; á®åà 塞 ⥪ãéãî áâà ¨æã
|
||
LD A,E
|
||
INC A
|
||
OUT (FDC_93.Sector),A
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
EXX
|
||
; [ ] 15/04/25 à §¬¥à ᥪâ®à ¡®«ìè¥, 祬 ãáâ ®¢«¥® ¢ SYS_PAGE.FDD_TABLE.BytesPerSector ¢ë§®¢¥â ®è¨¡ªã
|
||
LD E,(IY + FDD_TABLE_s.BytesPerSector)
|
||
LD D,(IY + FDD_TABLE_s.BytesPerSector + 1)
|
||
INC DE
|
||
;
|
||
BIT 5,B ; Set Z flag for read or NZ for write
|
||
EX AF,AF
|
||
LD A,B ; COMMAND read or write
|
||
EXX
|
||
LD C,A
|
||
LD A,XH
|
||
OUT (SLOT3),A
|
||
LD A,C ; COMMAND read or write
|
||
;ÛÛÛÛÛÛÛÛÛÛ Š<>ˆ’ˆ—<CB86>›‰ Š ‘ŠŽ<C5A0>Ž‘’ˆ Š“‘ŽŠ <20>Ž‘‹… “‘’€<E28099>Ž‚Šˆ ŠŽŒ€<C592>„› „Ž ‘<>Ÿ’ˆŸ <20>…‡“‹œ’€’€ ÛÛÛÛÛÛÛÛÛÛ
|
||
OUT (FDC_93.Command),A
|
||
LD BC,FDD_COUNTERS.INTRQorDRQ*256 + FDC_93.Data ; ¨¬¥® âãâ ¤«ï § ¤¥à¦ª¨ ¬¥¦¤ã ¯à¥¤ë¤ã饩 ¨ á«¥¤ãî饩 ª®¬ ¤ë
|
||
.wait_loop: IN A,(FDC_93.DrvCTRL) ; 11 ; 11 ;WAIT INTRQ or DRQ
|
||
AND %0100'0000 ; 7 ; 7 ;b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0), b6: DRQ (§ ¯à®á ¤ ëå = 1).
|
||
JR Z,.wait_loop_next ; 7 ; 12 + 34 (.wait_loop_next)
|
||
; âãâ ¬ ªá¨¬ã¬ 64 â ªâ
|
||
EX AF,AF'
|
||
JR NZ,.write_loop ; 11 ; १ã«ìâ â BIT 5,B'
|
||
;
|
||
;EX AF,AF'
|
||
;READ BYTE. ¬¥¦¤ã .wait_loop ¨ .read_loop (INI) 64+11=75 ⠪⮢
|
||
.read_loop: EXX
|
||
DEC DE
|
||
LD A,D
|
||
OR E
|
||
EXX
|
||
JR Z,.SectorSizeError
|
||
; ®â .wait_loop ¤®áî¤ ¬¨¨¬ã¬ 26+11+7+7+11+29=91, ¡ë«® 75+29=104 ⠪⮢
|
||
; ¯à¨¬¥à® 9,1 ¬ªá ¯à¨ ãá«®¢ëå á।¨å 10 Œ£æ
|
||
; ¯à¨¬¥à® 26 ¬ªá ¯à¨ 3,5 Œ£æ
|
||
; „®«¦® ¡ëâì ¥ ¡®«ìè¥ 16 ¬ªá ¤«ï 1.44 ¨«¨ 32 ¬ªá ¤«ï 720
|
||
INI
|
||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||
.wait_data_r: IN A,(FDC_93.DrvCTRL)
|
||
AND %1100'0000 ;b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0). b6: DRQ (§ ¯à®á ¤ ëå = 1).
|
||
JR Z,.wait_data_r
|
||
JP P,.read_loop ; JUMP if "¢ë¯®«ï¥âáï ª®¬ ¤ = 0"
|
||
;
|
||
;
|
||
.after_rw: EX AF,AF'
|
||
POP AF ; ¢®§¢à é ¥¬ ⥪ãéãî áâà ¨æã
|
||
OUT (SLOT3),A
|
||
EX AF,AF'
|
||
;
|
||
POP DE
|
||
POP HL
|
||
LD A,BIOS.Error.NotReady
|
||
JR C,.CMD_ERROR
|
||
;
|
||
IN A,(FDC_93.Command)
|
||
LD C,A
|
||
AND #7F
|
||
RET Z ; NORMAL EXIT
|
||
;
|
||
BIT 6,C
|
||
LD A,BIOS.Error.WriteProtect
|
||
JR NZ,.error_exit
|
||
;
|
||
BIT 2,C
|
||
JR NZ,.data_lost ; Error Read
|
||
;
|
||
LD A,BIOS.Error.Seek
|
||
.CMD_ERROR: DEC D ; FDD_COUNTERS.RW_Retries
|
||
JR Z,.error_exit
|
||
;
|
||
PUSH DE
|
||
PUSH HL
|
||
CALL RESWG ; RESET_WG
|
||
;!FIXIT ª®âà®«ì ®è¨¡ª¨
|
||
LD A,XL
|
||
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
|
||
;!FIXIT ª®âà®«ì ®è¨¡ª¨
|
||
POP HL
|
||
POP DE
|
||
JR .RETRY
|
||
;
|
||
.wait_loop_next:
|
||
INC DE
|
||
LD A,E
|
||
OR D
|
||
JR NZ,.wait_loop ; 26
|
||
;
|
||
DJNZ .wait_loop
|
||
SCF
|
||
JR .after_rw ; error
|
||
;
|
||
;
|
||
.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
|
||
;
|
||
;ÛÛÛÛÛÛÛÛÛÛ Š<>ˆ’ˆ—<CB86>›‰ Š ‘ŠŽ<C5A0>Ž‘’ˆ Š“‘ŽŠ <20>Ž‘‹… “‘’€<E28099>Ž‚Šˆ ŠŽŒ€<C592>„› „Ž ‘<>Ÿ’ˆŸ <20>…‡“‹œ’€’€ ÛÛÛÛÛÛÛÛÛÛ
|
||
;WRITE BYTE
|
||
;.go_write: EX AF,AF'
|
||
.write_loop: EXX
|
||
DEC DE
|
||
LD A,D
|
||
OR E
|
||
EXX
|
||
JR Z,.SectorSizeError
|
||
;
|
||
OUTI
|
||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||
.wait_data_w: IN A,(FDC_93.DrvCTRL)
|
||
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ëå = 1). b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0).
|
||
JR Z,.wait_data_w
|
||
JP P,.write_loop
|
||
JP .after_rw
|
||
;
|
||
.SectorSizeError:
|
||
; A = 0
|
||
LD C,A
|
||
POP AF ; ¢®§¢à é ¥¬ ⥪ãéãî áâà ¨æã
|
||
OUT (SLOT3),A
|
||
POP DE
|
||
POP HL
|
||
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
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
; <20>… ƒ<>Ž•€’œ. ‚¥àá¨ï ¤«ï FDD AUTO ®¤¨¬ ¡ãä¥à®¬ FDD_TABLE
|
||
; SET_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
|
||
////////////////////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////
|
||
SELECT_FDD: PUSH BC
|
||
OR A
|
||
LD IY,SYS_PAGE.FDD_TABLE.A
|
||
JR Z,.IY_Selected
|
||
;
|
||
LD IY,SYS_PAGE.FDD_TABLE.B
|
||
.IY_Selected: ;LD B,A
|
||
OR #3C
|
||
OUT (FDC_93.DrvCTRL),A
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD B,(IY + FDD_TABLE_s.ID)
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
INC B
|
||
POP BC
|
||
RET NZ
|
||
; no drive
|
||
LD A,BIOS.Error.BadNumber
|
||
SCF
|
||
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
|
||
;
|
||
; ‚室: IY - “ª § ⥫ì â ¡«¨æã ¢ë¡à ®£® FDD
|
||
CHANGE_SPEED: IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD A,(IY + FDD_TABLE_s.DISK)
|
||
XOR #80
|
||
LD (IY + FDD_TABLE_s.DISK),A
|
||
JR SET_SPEED.set
|
||
;
|
||
SET_SPEED: IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD A,(IY + FDD_TABLE_s.DISK)
|
||
.set: AND #80
|
||
RRA
|
||
RRA
|
||
OR 1
|
||
OUT (FDD_Density),A
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
RET
|
||
;----------------------------------------------------------------------;
|
||
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
; ‚室: BC - ¢ãâ२© ¨ ¢¥è¨© áçñâ稪¨
|
||
; IY - “ª § ⥫ì â ¡«¨æã ¢ë¡à ®£® FDD
|
||
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
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
; ¯à¥àë¢ ¨ï ¤®«¦ë ¡ëâì ®âª«îç¥ë
|
||
; ‚室: IY - “ª § ⥫ì â ¡«¨æã ¢ë¡à ®£® FDD
|
||
; ‚ë室: A - bit7 - 720/1440, 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 ; áçñâ稪¨
|
||
CALL WAIT_FDD_FOR_SEARCH_TRACK
|
||
JR NC,.Read_Index
|
||
; ªã᮪ ¤«ï â®à¬®§ëå ä«®¯¯ ३
|
||
LD BC,#0804 ; áçñâ稪¨
|
||
CALL WAIT_FDD_FOR_SEARCH_TRACK
|
||
JR NC,.Read_Index
|
||
EXX
|
||
;SCF
|
||
LD A,BIOS.Error.NotReady
|
||
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,(IY + FDD_TABLE_s.DISK)
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
EX AF,AF'
|
||
AND #80
|
||
RET
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
; in: A - track
|
||
SEEK: LD XL,A
|
||
LD C,A
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD A,(IY + FDD_TABLE_s.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
|
||
;
|
||
P50ms: PUSH BC
|
||
LD B,12
|
||
.P1ms: LD C,255
|
||
.PMS: DEC C
|
||
JR NZ,.PMS
|
||
DJNZ .P1ms
|
||
POP BC
|
||
RET
|
||
;
|
||
;
|
||
;P750ms LD B,3
|
||
;PMS2 LD A,255
|
||
; CALL P1ms
|
||
; DJNZ PMS2
|
||
; 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 BC,#0380 ; áçñâ稪 ¨ ¬ áª
|
||
.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 C
|
||
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 C,(IY + FDD_TABLE_s.SECTORS)
|
||
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
|
||
;[]===========================================================[] |