; ;R01 01.08.2001 FIX BUG INT "SELECT_IDE" ;R00 24.07.2001 ADD SECONDARY IDE ;INITIAL NEW VERSION (2.48) 24.07.2001 ;======================================================== ; MODULE AUTOIDE /* ;Write HDW_3F7 EQU #4155 ;3F7H Command HDW_3F6 EQU #4154 ;3F6H Device Control ;Read HDR_3F7 EQU #4055 ;3F7H Drive Address HDR_3F6 EQU #4054 ;3F6H Alt. Status ;Write IDE.Write.Command EQU #4153 ; #1F7 Command HDW_DRV EQU #4152 ; #1F6 Drive Control HDW_CLH EQU #0155 ; #1F5 Cylinder High HDW_CLL EQU #0154 ; #1F4 Cylinder Low HDW_SEC EQU #0153 ; #1F3 Sector HDW_CNT EQU #0152 ; #1F2 Counter HDW_ERR EQU #0151 ; #1F1 Error HDW_DAT EQU #0150 ; #1F0 Data ;Read HDR_CTL EQU #4053 ; #1F7 Status (Control) HDR_DRV EQU #4052 ; #1F6 Drive Control HDR_CLH EQU #0055 ; #1F5 Cylinder High HDR_CLL EQU #0054 ; #1F4 Cylinder Low HDR_SEC EQU #0053 ; #1F3 Sector HDR_CNT EQU #0052 ; #1F2 Counter HDR_ERR EQU #0051 ; #1F1 Error HDR_DAT EQU #0050 ; #1F0 Data ;Bits for HDR_CTL ;---[] BSY EQU 7 RDY EQU 6 DRQ EQU 3 ERR EQU 0 ;---[] HDD EQU 1 CDROM EQU 2 ;EQU FOR IY+ ;---[] DRVHD_H EQU 0 SC_PT_H EQU 1 IDE.HDD_INIT_TABLE.HeadsNumber EQU 2 CYL_L_H EQU 3 CYL_H_H EQU 4 SPCLL_H EQU 5 SPCLH_H EQU 6 DTYPE_H EQU 7 ;---[] ;-------[ ;!!!!! hardcoded table]------- IDE0 EQU #C1C0 IDE1 EQU #C1C8 IDE2 EQU #C1D0 IDE3 EQU #C1D8 ;--------------------------------------- */ ;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00 ; DB #FF ;SECTORS PER TRACK ;01 ; DB #FF ;HEADS ;02 ; DB #FF ;CYLINDERS LOW ;03 ; DB #FF ;CYLINDERS HIGH ;04 ; DB #FF ;SECTOR PER CYLINDER LOW ;05 ; DB #FF ;SECTOR PER CYLINDER HIGH ;06 ; DB #FF ;DEVICE TYPE ;07 ;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00 ; DB #FF ;SECTORS PER TRACK ;01 ; DB #FF ;HEADS ;02 ; DB #FF ;CYLINDERS LOW ;03 ; DB #FF ;CYLINDERS HIGH ;04 ; DB #FF ;SECTOR PER CYLINDER LOW ;05 ; DB #FF ;SECTOR PER CYLINDER HIGH ;06 ; DB #FF ;DEVICE TYPE ;07 IDE__CD: CALL SELECT_IDE ;MASTER CDAUTO: LD A,IDE.Device.CDROM LD (IDEDEV),A LD A,#FF JP CDMASTR SELECT_IDE: AND A ;%0000'0011 LD D,#A0 JR Z,IAUTO0 DEC A LD D,#B0 JR Z,IAUTO0 DEC A LD D,#A0 ;R00 JR Z,IAUTO1 ;R00 DEC A ;R00 LD D,#B0 ;R00 IAUTO1: LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY OUT (IDE.Chanel.Set),A ;R00 LD A,1 JR IAUTO ;R00 IAUTO0: LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY OUT (IDE.Chanel.Set),A ;R00 LD A,0 IAUTO: LD (ICHANEL),A LD BC,IDE.Write.DriveCtrl ;R01 OUT (C),D ;R01 RET IDEAUTO: CALL SELECT_IDE ;MASTER LD A,#FF LD (IDEDEV),A CDMASTR: LD (SKIP),A LD BC,IDE.Write.DriveCtrl OUT (C),D LD BC,IDE.Read.Status IN A,(C) AND #80 LD HL,280 JR Z,NO_BUSY LD HL,1550 EI CLRBUSY: HALT DEC HL LD A,H OR L JP Z,ABSENT CALL SKIPKEY JP C,ABSENT LD BC,IDE.Read.Status IN A,(C) AND #80 JR NZ,CLRBUSY NO_BUSY: LD E,#05 LD BC,IDE.Write.Counter OUT (C),E LD BC,#0010 DJNZ $ ;!HARDCODE DEC C JR NZ,$-3 ;!HARDCODE LD BC,IDE.Read.Counter IN A,(C) CP E JP NZ,ABSENT LD A,(IDEDEV) CP IDE.Device.CDROM JP Z,NOHDD LD E,#00 ;NOP LD BC,IDE.Write.Command OUT (C),E WXREADY: HALT DEC HL LD A,H OR L JP Z,ABSENT CALL SKIPKEY JP C,ABSENT LD BC,IDE.Read.Status IN A,(C) AND #C0 CP #40 JR NZ,WXREADY ; LD A,#90 ; ; CALL IDE_CMD LD A,IDE.Device.HDD LD (IDEDEV),A LD E,#EC ;IDENTIFY ATA LD BC,IDE.Write.Command OUT (C),E LD B,#00 DJNZ $ ;!HARDCODE LD HL,(WAITSML) LD DE,#0101 LD BC,IDE.Read.Status CALL WAIT_PRT JP NC,NOHDD GETPARM: LD HL,(WAITIDE) LD DE,#0808 LD BC,IDE.Read.Status CALL WAIT_PRT JP C,ABSENT LD BC,IDE.Read.Data LD HL,TEMP INIR INIR CALL IDESPEC AND A RET NOHDD: LD A,IDE.Device.CDROM LD (IDEDEV),A LD E,#A1 ;IDENTIFY ATAPI LD BC,IDE.Write.Command OUT (C),E LD B,#00 DJNZ $ LD HL,(WAITSML) LD DE,#0101 LD BC,IDE.Read.Status CALL WAIT_PRT JP C,GETPARM ABSENT: SCF RET IDESPEC: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD A,(IDEDEV) LD (IY+IDE.HDD_INIT_TABLE.DriveType),A CP IDE.Device.CDROM JP Z,FOR_CDR LD BC,IDE.Read.Control IN A,(C) AND #F0 LD B,A LD A,(TEMP+#06) ; !TODO сделать через структуру. HEADS PER TRACK LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),A DEC A AND #0F OR B LD B,A LD A,(TEMP+#63) ; !TODO сделать через структуру. LBA/NON-LBA bit 1 (FROM ZERO!) BIT 1,A JR Z,NONLBA SET 6,B NONLBA: LD A,B LD BC,IDE.Write.DriveCtrl OUT (C),A AND #F0 LD HL,ICHANEL OR (HL) LD (IY+IDE.HDD_INIT_TABLE.Chanel),A LD HL,(TEMP+#02) ; !TODO сделать через структуру. CYLINDERS LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H LD A,(TEMP+#0C) ; !TODO сделать через структуру. SECTOR PER TRACK LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A LD BC,IDE.Write.Counter OUT (C),A LD A,#91 ; CALL IDE_CMD ; RET C LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track LD B,0 LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD LD HL,0 HDDINI3: ADD HL,BC DEC A JR NZ,HDDINI3 LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H NOSPEC: EX AF,AF' OUT (SLOT3),A AND A RET FOR_CDR: LD BC,IDE.Read.Control IN A,(C) AND #F0 LD HL,ICHANEL OR (HL) LD (IY+IDE.HDD_INIT_TABLE.Chanel),A JR NOSPEC IDE_CMD: PUSH AF LD HL,(WAITIDE) LD DE,#C040 LD BC,IDE.Read.Status CALL WAIT_PRT POP DE RET C LD BC,IDE.Write.Command OUT (C),D LD HL,(WAITIDE) LD DE,#C040 LD BC,IDE.Read.Status JP WAIT_PRT WAITHDD: EI LD HL,1533 WTREADY: HALT LD BC,IDE.Read.Status IN A,(C) AND #C0 CP #40 RET Z DEC HL LD A,H OR L JR NZ,WTREADY SCF RET ;WAITHDD DEC L ; RET NZ ; DEC H ; RET NZ ; DEC E ; RET NZ ; SCF ; RET ; E - Second * 10 ;PAUSE LD HL,#0000 ;PAUSE1 DEC L ; JR NZ,PAUSE1 ; DEC H ; JR NZ,PAUSE1 ; DEC E ; JR NZ,PAUSE1 ; RET ; D - MASK ; E - PATTERN ; BC - PORT WAIT_PRT: IN A,(C) AND D CP E JR NZ,.P2 AND A RET .P2: DEC HL CALL SKIPKEY RET C LD A,L OR H JP NZ,WAIT_PRT .error: SCF RET SKIPKEY: EXX CALL SCANKEY EXX SCF CCF RET Z EXX LD HL,#3E00 ;!HARDCODE AND A SBC HL,DE EXX SCF CCF RET NZ LD A,0 LD (SKIP),A SCF RET WAITIDE: DW #0000 WAITSML: DW #0400 SKIP: DB #FF IDEDEV: DB #FF ICHANEL: DB #00 ; ENDMODULE ;