diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index c3c5eb9..652f37a 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -1,555 +1,899 @@ -;[BEGIN] -;//MODULE: AUTOIDE -;//CREATE: 27-07-2001 AUTHOR: Denis Parinov -;----------------------------------------------------------------------- -;Rev Date Name Description -;----------------------------------------------------------------------- -;R02 17.08.2023 BAO Fixed bug with AUTODETECT ATAPI Drives -;R01 01.08.2001 DNS FIX BUG INT "SELECT_IDE" -;R00 24.07.2001 DNS ADD SECONDARY IDE -; 24.07.2001 DNS INITIAL NEW VERSION 2.48 -;======================================================================= - -; 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 - -WAIT_IDE EQU #0000 -WAIT_SML EQU #1000 -WAIT_ERROR EQU #0400 - -SELECT_IDE: - AND A ;%0000'0011 - LD D,IDE.Drive.Master - JR Z,.AUTO_0 - DEC A - LD D,IDE.Drive.Slave - JR Z,.AUTO_0 - DEC A - ;R00 - LD D,IDE.Drive.Master - JR Z,.AUTO_1 - DEC A - LD D,IDE.Drive.Slave -.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY - OUT (IDE.Chanel.Set),A - ;LD A,1 - JP .AUTO -.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY - OUT (IDE.Chanel.Set),A - ; - ;LD A,0 - XOR A -.AUTO: LD (ICHANEL),A - ;R01 - LD BC,IDE.Write.DeviceHead - OUT (C),D - ; - RET - - - -IDE__CD: - CALL SELECT_IDE -;MASTER -CDAUTO: - LD A,IDE.Device.CDROM - LD (IDEDEV),A - LD A,#FF ;!FIXIT можно оптимизировать - JP CDMASTR - -IDEAUTO: - ;Disable 8-bit data transfer - ;!TODO - ; - - CALL SELECT_IDE - LD A,IDE.Device.NONE - LD (IDEDEV),A -CDMASTR: - LD (SKIP),A - LD BC,IDE.Write.DeviceHead - OUT (C),D - DEC B - INC C ; LD BC,IDE.Read.Status - IN A,(C) - AND #80 - LD HL,280 - JR Z,NO_BUSY - LD HL,1550 ; задержка - 31 секунда - EI -CLRBUSY: - HALT - DEC HL - LD A,H - OR L - JP Z,ABSENT - CALL SKIPKEY - JP C,ABSENT - LD BC,IDE.Read.Status ;!FIXIT можно закомментировать? - IN A,(C) - AND #80 - JR NZ,CLRBUSY - -NO_BUSY: - LD E,#05 - LD BC,IDE.Write.Counter - OUT (C),E - - LD BC,#0010 ;задержка 50092 такта + int -.pause: DJNZ .pause - DEC C - JR NZ,.pause - - LD C,IDE.Read.Counter ; LD BC,IDE.Read.Counter - IN A,(C) - CP E - JP NZ,ABSENT - - ;!FIXIT CD-ROM Autodetect error! - LD A,(IDEDEV) -;!TODO -; I haven,t done too many tests but this works on all the hardware i have. -; 1 select device (port+6) -; 2 read status byte(port+7) if =-1 then there is no disk -; if busy to many time then no disk -; 3 send id command #ec if error then send packet device id command -; #a1 if error then no disk. -; commands must be send byte by byte dword operations are used only for data transfers. - ;R02 - CP IDE.Device.NONE - JR NZ,.check_next - ;JP NZ,DETECT_ATA_ATAPI - ; -/* -DETECT_ATA_ATAPI: ;R02 -; 1. Set the Sectorcount, LBAlo, LBAmid, and LBAhi IO ports to 0 (port 0x1F2 to 0x1F5). - LD BC,IDE.Write.Counter - OUT (C),0 ;out0-ok - INC C ;IDE.Write.Sector - OUT (C),0 ;out0-ok - INC C ;IDE.Write.CylinderLow - OUT (C),0 ;out0-ok - INC C ;IDE.Write.CylinderHigh - OUT (C),0 ;out0-ok - ; -; 2. Send the IDENTIFY command (0xEC) to the Command IO port (0x1F7). - LD BC,IDE.Write.Command - LD E,IDE.ATA.IdentifyDevice - OUT (C),E - ; -; 3. Read the Status port (0x1F7) again. -; 3.1 If the value read is 0, the drive does not exist. - LD B,0 -.pause: DJNZ .pause - LD BC,IDE.Read.Status - IN A,(C) - JP Z,ABSENT -; 3.2 For any other value: poll the Status port (0x1F7) until bit 7 (BSY, value = 0x80) clears. - LD HL,WAIT_SML - LD DE,#8000 - CALL WAIT_PRT - JP C,ABSENT -; 3.3 At this point you need to check the LBAmid and LBAhi ports (0x1F4 and 0x1F5) to see -; if they are non-zero. If so, the drive is not ATA, and you should stop polling. - LD BC,IDE.Read.CylinderLow - IN A,(C) - INC C ;IDE.Read.CylinderHigh - IN B,(C) - OR B - JP NZ,Non_ATA ; IT IS ATAPI -; 3.5 Otherwise, continue polling one of the Status ports until bit 3 (DRQ, value = 8) sets, or until bit 0 (ERR, value = 1) sets. - LD HL,WAIT_SML - LD DE,#0908 - CALL WAIT_PRT - JP C,ABSENT - ; -; 4. At that point, if ERR is clear, the data is ready to read from the Data port (0x1F0). Read 256 16-bit values, and store them. - LD A,IDE.Device.HDD - LD (IDEDEV),A - JP GETPARM - ; -;;;;;;;;;;;;;;;;;;;;;;; R02 -*/ - - -NO_BUSY.check_next: - CP IDE.Device.CDROM - JP Z,Non_ATA - -;!TODO прибраться тут. После R02 тут можно убрать много лишнего -;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=; - LD E,IDE.ATA.Nop - LD BC,IDE.Write.Command - OUT (C),E - DEC B ; LD BC, IDE.Read.Status -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) - ;!TEST detect drives - ;AND #C0 - ;CP #40 - AND #81 - CP 1 - ; - JR NZ,WXREADY - -; LD A,#90 ;????? -; CALL IDE_CMD - - LD A,IDE.Device.HDD - LD (IDEDEV),A - LD E,IDE.ATA.IdentifyDevice - LD BC,IDE.Write.Command - OUT (C),E - - LD B,0 -.pause: DJNZ .pause - - LD HL,WAIT_SML - LD DE,#0101 - CALL WAIT_PRT - JP NC,Non_ATA -;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=; -GETPARM: - LD HL,WAIT_IDE - 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 - ;!TEST save hdd parameters to cmos for "setup" in settings - CALL SaveToCMOS - ; -.exit: AND A - RET - -Non_ATA: LD A,IDE.Device.CDROM - LD (IDEDEV),A - LD E,#A1 ;!HARDCODE IDENTIFY ATAPI - LD BC,IDE.Write.Command - OUT (C),E - - LD B,0 -.pause: DJNZ .pause - - ;LD HL,WAIT_SML - LD HL,WAIT_ERROR - LD DE,#0101 - 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 - ;Check write caching - LD A,(TEMP+85*2) ; !TODO сделать через структуру. Включен ли кэш записи? - AND %0010'0000 - JR Z,.NoWriteCache - ;Disable write caching - LD BC,IDE.Write.Features - LD A,IDE.ATA.SetFeatures.DisableWriteCache - OUT (C),A - LD A,IDE.ATA.SetFeatures - CALL IDE_CMD -.NoWriteCache: - 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.DeviceHead - OUT (C),A - AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask - LD HL,ICHANEL - OR (HL) - LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),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 - IF IDE_Optimization - LD B,high IDE.Write.Counter - ELSE - LD BC,IDE.Write.Counter - ENDIF - OUT (C),A - LD A,IDE.ATA.InitializeDeviceParameters - CALL IDE_CMD -; RET C - LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track - LD B,0 - LD H,B - LD L,B - LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD -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: - ;!TEST save hdd parameters to cmos for "setup" in settings - LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) ; for save to cmos in GETPARM - ; - 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.DRV_Flags),A - JR NOSPEC - -IDE_CMD: - PUSH AF - LD HL,WAIT_IDE - LD DE,#C040 - CALL WAIT_PRT - POP DE - RET C - INC B ; LD BC,IDE.Write.Command - OUT (C),D - LD HL,WAIT_IDE - LD DE,#C040 - JP WAIT_PRT - -WAITHDD: - EI - LD HL,1533 ;!HARDCODE HDD -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 -; IN: -; HL - Waiting delay -; DE - MASK : PATTERN -; OUT: -; NC: (PORT & D)-E = 0 -; CF: waiting delay exceeded -WAIT_PRT: - LD BC,IDE.Read.Status - ; -.loop: IN A,(C) - AND D - CP E - RET Z - DEC HL - CALL SKIPKEY - RET C - LD A,L - OR H - JP NZ,.loop - ; - 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 - -;!TEST save hdd parameters to cmos for "setup" in settings -; IN: A' = DRV_Flags -SaveToCMOS: - LD A,(IDEDEV) - CP IDE.Device.HDD - RET NZ - - EX AF,AF' - ;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - AND %0001'0001 - LD IX,PRIM_MASTER_CMOS_T - JR Z,.save_to_cmos - ; - DEC A - LD IX,SEC_MASTER_CMOS_T - JR Z,.save_to_cmos - ; - CP %0001'0000 - LD IX,SEC_SLAVE_CMOS_T - JR Z,.save_to_cmos - ; - LD IX,PRIM_SLAVE_CMOS_T -.save_to_cmos: - LD HL,(TEMP+1*2) - LD B,L - LD A,(IX+0) - CALL WRITCMS ; Cylinder low - - LD B,H - LD A,(IX+1) - CALL WRITCMS ; Cylinder high - - LD A,(TEMP+3*2) - LD B,A - LD A,(IX+2) - CALL WRITCMS ; Heads - - LD A,(TEMP+6*2) - LD B,A - LD A,(IX+3) - JP WRITCMS ; Heads -;;;;;;;;;; - - -SKIP: DB #FF -IDEDEV: DB #FF -ICHANEL: DB #00 - -; ENDMODULE - -;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 \ No newline at end of file +;[BEGIN] +;//MODULE: AUTOIDE +;//CREATE: 27-07-2001 AUTHOR: Denis Parinov +;----------------------------------------------------------------------- +;Rev Date Name Description +;----------------------------------------------------------------------- +;R02 17.08.2023 BAO Fixed bug with AUTODETECT ATAPI Drives +;R01 01.08.2001 DNS FIX BUG INT "SELECT_IDE" +;R00 24.07.2001 DNS ADD SECONDARY IDE +; 24.07.2001 DNS INITIAL NEW VERSION 2.48 +;======================================================================= + +; 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 + + MODULE CONFIGURE_IDE_DRIVES + + MODULE PAUSES +HALT: +.Time_2s EQU 100 +.SMALL EQU 200 ; 04 сек +.BIG EQU 1550 ; 31 сек +WAIT: +.IDE EQU #0000 +.SMALL EQU #0200 +.ERROR EQU #0400 + ENDMODULE + +WAIT_IDE EQU #0000 +WAIT_SML EQU #1000 +WAIT_ERROR EQU #0400 + +M_CYLL EQU #12 +M_CYLH EQU #13 +M_HEAD EQU #14 +M_SECT EQU #15 + +S_CYLL EQU #16 +S_CYLH EQU #17 +S_HEAD EQU #18 +S_SECT EQU #19 + +SM_CYLL EQU #37 +SM_CYLH EQU #38 +SM_HEAD EQU #39 +SM_SECT EQU #3A + +SS_CYLL EQU #3B +SS_CYLH EQU #3C +SS_HEAD EQU #3D +SS_SECT EQU #3E + + MACRO PAUSE_DJNZ num + IF num<255 + LD B,num +.loop: DJNZ .loop + ELSE + ASSERT 0, "WRONG PAUSE NUMBER!!!" + ENDIF + ENDM + +/////////////////////////////////////////////////////////////////////[v] +START: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD HL,IDE.INIT_TBL_IDE0 + LD BC,256*(IDE.HDD_INIT_TABLE * 4) + #FF ;R02 +;CLEAR HDD VARIABLE +.FILLIDE: + LD (HL),C + INC HL + DJNZ .FILLIDE + EX AF,AF' + OUT (SLOT3),A + + LD IY,IDE.INIT_TBL_IDE0 + XOR A + CALL STEP1_GETCMOS + + LD IY,IDE.INIT_TBL_IDE1 + LD A,#01 + CALL STEP1_GETCMOS + + LD IY,IDE.INIT_TBL_IDE2 + LD A,#02 + CALL STEP1_GETCMOS + + LD IY,IDE.INIT_TBL_IDE3 + LD A,#03 + CALL STEP1_GETCMOS + + ;!TEST save hdd parameters to cmos for "setup" in settings + CALL WRITING + ; + CALL ScreenPOS.CRLF + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +AUTODETECT: + LD A,L ;DETECT MESSAGE + CALL POSTMSG + CALL ScreenPOS.SUBNAME + LD A,(MasterSlave) + ; + CALL AUTODETECTING +.IDEJUMPBACK: + CALL NC,MODEL + LD A,(SKIP) + INC A + LD A,msgStrings.ideNone + JR Z,.NOSKIPKEY + LD A,msgStrings.ideSkiped +.NOSKIPKEY: + CALL C,POSTMSG + CALL ScreenPOS.CRLF + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +; !HARDCODE заменить числа на метки в этой процедуре +STEP1_GETCMOS: + LD (MasterSlave),A + LD H,A ;SAVE DRIVE NUMBER + CALL SELECT_IDE + LD A,IDE.Device.NONE + LD (IDEDEV),A + LD (SKIP),A + LD A,H + ; + AND A + LD BC,#3011 ;CMOS VALUE + LD L,msgStrings.detectIdePrMA + JR Z,.choose + ; + DEC A + LD BC,#C011 ;CMOS VALUE + LD L,msgStrings.detectIdePrSL + JR Z,.choose + ; + DEC A + LD BC,#3020 + LD L,msgStrings.detectIdeSecMA + JR Z,.choose + ; + DEC A + LD BC,#C020 + LD L,msgStrings.detectIdeSecSL + JR Z,.choose + SCF + RET + ;0 - AUTODETECT + ;1 - GETTING FROM SETUP + ;2 - CD-ROM (ATAPI device) + ;3 - DISABLED +.choose: + EI + ; + CALL G_VALUE + OR A + JR Z,AUTODETECT ;AUTO DETECT + ; + DEC A + JR Z,SETUP_FROM_CMOS ;Get from CMOS (SETUP) + ; + DEC A + JR Z,IT_IS_ATAPI ;CD-ROM + RET ;DON'T CHECK THIS DEVICE +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +IT_IS_ATAPI: + LD A,L ;DETECT MESSAGE + CALL POSTMSG + CALL ScreenPOS.SUBNAME + + LD HL,PAUSES.HALT.BIG + CALL BITS_WAITS.Clear_BUSY + JR C,AUTODETECTING.IDE_ABSENT + + CALL AUTODETECTING.Its_ATAPI + JP AUTODETECT.IDEJUMPBACK +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +AUTODETECTING: CALL DETECTORS.CheckChanel + JR C,.IDE_ABSENT + + CALL Bug31SecCheck + JR C,.next + + LD HL,PAUSES.HALT.BIG + CALL BITS_WAITS.Clear_BUSY + JR C,.IDE_ABSENT + +.next: CALL DETECTORS.Counter + JR C,.IDE_ABSENT + + CALL DETECTORS.NOP_Check + JR C,.IDE_ABSENT + + ; CALL DISABLE_8bit ; DISABLE 8 bit data transfer + + CALL DETECTORS.IdentDevCheck + JR C,.IDE_ABSENT + JR Z,.Its_ATA + + ; enter point for ATAPI in setup +.Its_ATAPI: CALL DETECTORS.IdentPDevChk + JR C,.IDE_ABSENT + LD A,IDE.Device.CDROM + LD (IDEDEV),A + JR .get + +.Its_ATA: LD A,IDE.Device.HDD + LD (IDEDEV),A +.get: CALL GETPARAM + JR C,.IDE_ABSENT + ;CALL DisableWriteCache + ;CALL DisableStandBy + AND A + RET + ; +.IDE_ABSENT: LD A,IDE.Device.NONE + LD (IDEDEV),A + LD A,IDE.ATA.Nop + LD BC,IDE.Write.Command + OUT (C),A + DEC B + IN A,(C) ; IDE.Read.Status + SCF + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +SETUP_FROM_CMOS: + LD A,H + LD IX,PRIM_MASTER_CMOS_T + OR A + JR Z,.step1 + ; + LD IX,PRIM_SLAVE_CMOS_T + CP 1 + JR Z,.step1 + ; + LD IX,SEC_MASTER_CMOS_T + CP 2 + JR Z,.step1 + ; + LD IX,SEC_SLAVE_CMOS_T +.step1: LD HL,TEMP + LD DE,TEMP+1 + LD BC,511 + LD (HL),0 + LDIR + ; + CALL Bug31SecCheck + JR C,.step2 + ; + LD HL,PAUSES.HALT.BIG + CALL BITS_WAITS.Clear_BUSY + JR C,AUTODETECTING.IDE_ABSENT + ; +.step2: LD A,(IX+2) ;M_HEAD + CALL READCMS + LD (TEMP+3*2),A ; !TODO сделать через структуру. HEADS PER TRACK + ; + LD A,(IX+1) ;M_CYLH + CALL READCMS + PUSH AF + ; + LD A,(IX+0) ;M_CYLL + CALL READCMS + POP HL + LD L,A + LD (TEMP+1*2),HL ; !TODO сделать через структуру. CYLINDERS + ; + LD A,(IX+3) ;M_SECT + CALL READCMS + LD (TEMP+6*2),A ; !TODO сделать через структуру. SECTOR PER TRACK + ; + LD A,IDE.Device.HDD + LD (IDEDEV),A + CALL IDESPEC + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +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 +; ;Check write caching +; LD A,(TEMP+85*2) ; !TODO сделать через структуру. Включен ли кэш записи? +; AND %0010'0000 +; JR Z,.NoWriteCache +; ;Disable write caching +; LD BC,IDE.Write.Features +; LD A,IDE.ATA.SetFeatures.DisableWriteCache +; OUT (C),A +; LD A,IDE.ATA.SetFeatures +; CALL IDE_CMD +; .NoWriteCache: + 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.DeviceHead + OUT (C),A + AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask + LD HL,ICHANEL + OR (HL) + LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),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 + IF IDE_Optimization + LD B,high IDE.Write.Counter + ELSE + LD BC,IDE.Write.Counter + ENDIF + OUT (C),A + LD A,IDE.ATA.InitializeDeviceParameters + CALL IDE_CMD + LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track + LD B,0 + LD H,B + LD L,B + LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD + +.loop: ADD HL,BC + DEC A + JR NZ,.loop + + LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L + LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H +.END: ;!TEST save hdd parameters to cmos for "setup" in settings + LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) ; for save to cmos in GETPARM + ; + 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.DRV_Flags),A + JR IDESPEC.END +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +IDE_CMD: + PUSH AF + LD HL,PAUSES.WAIT.IDE + LD DE,256*IDE.ControlByte.Busy + 0 + CALL BITS_WAITS.WAIT_PRT + POP HL + RET C + INC B ; LD BC,IDE.Write.Command + OUT (C),H + LD HL,PAUSES.WAIT.IDE + ;LD DE,256*IDE.ControlByte.Busy + 0 + JR BITS_WAITS.WAIT_PRT +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +MODEL: LD HL,TEMP+27*2 ; !TODO сделать через структуру. + LD A,(HL) + OR A + JR Z,.unknown + LD B,20 ;!HARDCODE + CALL DWPRINT + AND A + RET +.unknown: + LD A,msgStrings.ideUnknown + CALL POSTMSG + AND A + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +BITS_WAITS: +; IN: +; HL - Waiting delay +; DE - MASK : PATTERN +; OUT: +; NC: (PORT & D)-E = 0 +; CF: waiting delay exceeded +.WAIT_PRT: + LD BC,IDE.Read.Status + ; +.loop: IN A,(C) + AND D + CP E + RET Z + DEC HL + CALL SKIPKEY + RET C + LD A,L + OR H + JP NZ,.loop + ; + SCF + RET + ; + +; Pause for clear BUSY and DATA REQUEST +.Clear_BUSY: LD BC,IDE.Read.Status + IN A,(C) + ;!TEST for normal bus with pull-ups + ;CP #FF + ;SCF + ;RET Z + ; + AND IDE.ControlByte.Busy; + IDE.ControlByte.DataRequest + RET Z + ; + HALT + DEC HL + LD A,H + OR L + SCF + RET Z + ; + CALL SKIPKEY + RET C + ; + JR .Clear_BUSY +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +SELECT_IDE: + AND A ;%0000'0011 + LD B,IDE.Drive.Master + JR Z,.AUTO_0 + ; + DEC A + LD B,IDE.Drive.Slave + JR Z,.AUTO_0 + ; + DEC A + ;R00 + LD B,IDE.Drive.Master + JR Z,.AUTO_1 + ; + DEC A + LD B,IDE.Drive.Slave +.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY + OUT (IDE.Chanel.Set),A + JP .AUTO + ; +.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY + OUT (IDE.Chanel.Set),A + ; + XOR A +.AUTO: LD (ICHANEL),A + ;R01 + LD A,B + LD BC,IDE.Write.DeviceHead + OUT (C),A + ; + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +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 +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +;!TEST save hdd parameters to cmos for "setup" in settings +; IN: A' = DRV_Flags +SaveToCMOS: + LD A,(IDEDEV) + CP IDE.Device.HDD + RET NZ + + EX AF,AF' + ;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) + AND %0001'0001 + LD IX,PRIM_MASTER_CMOS_T + JR Z,.save_to_cmos + ; + DEC A + LD IX,SEC_MASTER_CMOS_T + JR Z,.save_to_cmos + ; + CP %0001'0000 + LD IX,SEC_SLAVE_CMOS_T + JR Z,.save_to_cmos + ; + LD IX,PRIM_SLAVE_CMOS_T +.save_to_cmos: + LD HL,(TEMP+1*2) + LD B,L + LD A,(IX+0) + CALL WRITCMS ; Cylinder low + + LD B,H + LD A,(IX+1) + CALL WRITCMS ; Cylinder high + + LD A,(TEMP+3*2) + LD B,A + LD A,(IX+2) + CALL WRITCMS ; Heads + + LD A,(TEMP+6*2) + LD B,A + LD A,(IX+3) + JP WRITCMS ; Heads +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +RESET_Slave_ATAPI: + LD A,IDE.Drive.Slave + LD BC,IDE.Write.DeviceHead + OUT (C),A + PAUSE_DJNZ 16 + LD BC,IDE.Write.Command + LD A,IDE.ATAPI.Reset + OUT (C),A + PAUSE_DJNZ 16 + LD A,IDE.Drive.Master + LD BC,IDE.Write.DeviceHead + OUT (C),A + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +; Check bug with 31 sec freeze +Bug31SecCheck: LD A,(MasterSlave) + AND 1 + RET NZ + ; + LD HL,PAUSES.HALT.Time_2s + CALL BITS_WAITS.Clear_BUSY + CCF + RET C + ; + JP RESET_Slave_ATAPI +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +GETPARAM: + LD HL,PAUSES.WAIT.IDE + LD DE,IDE.ControlByte.DataRequest * 256 + IDE.ControlByte.DataRequest + CALL BITS_WAITS.WAIT_PRT + RET C + LD BC,IDE.Read.Data + LD HL,TEMP + INIR + INIR + CALL IDESPEC + ;!TEST save hdd parameters to cmos for "setup" in settings + CALL SaveToCMOS + ; + AND A + RET +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +DETECTORS: +;-------; + ; CHECK BY COUNTER PORT. + ; Exit: CF - No device +.test_counter EQU 5 +.Counter: LD A,.test_counter + LD BC,IDE.Write.Counter + OUT (C),A + LD HL,PAUSES.WAIT.SMALL + LD DE,IDE.ControlByte.Busy*256 + 0 + CALL BITS_WAITS.WAIT_PRT + RET C + ; + LD BC,IDE.Read.Counter ; LD BC,IDE.Read.Counter + IN A,(C) + CP .test_counter + SCF + RET NZ + AND A + RET +;-------; + +;-------; + ; CHECK BY EXECUTING NOP COMMAND AND WAIT. + ; Exit: CF - No device +.NOP_Check: LD E,IDE.ATA.Nop + LD BC,IDE.Write.Command + OUT (C),E + DEC B ; LD BC, IDE.Read.Status + LD HL,PAUSES.HALT.SMALL + ; + + ;!TEST DVD detect bug check + PAUSE_DJNZ 0 + ; + +.loop: IN A,(C) + SCF + RET Z + ; + AND IDE.ControlByte.Busy + IDE.ControlByte.DataRequest + IDE.ControlByte.Error + CP IDE.ControlByte.Error + RET Z + ; + HALT + DEC HL + LD A,H + OR L + SCF + RET Z ; Absent + ; + CALL SKIPKEY + RET C ; Skipped = Absent + ; + JR .loop +;-------; + +;-------; + ; CHECK WITH Identify Device. + ; Exit: CF - No device + ; NC and ZF - ATA + ; NC and NZ - ATAPI +.IdentDevCheck: LD E,IDE.ATA.IdentifyDevice + LD BC,IDE.Write.Command + OUT (C),E + ; + LD DE,IDE.ControlByte.Busy * 256 + 0 + LD HL,PAUSES.WAIT.IDE + CALL BITS_WAITS.WAIT_PRT + RET C ; Absent + ; + LD BC,IDE.Read.Status + IN A,(C) + RRCA + JR C,.non_ATA + ; + AND (IDE.ControlByte.DataRequest + IDE.ControlByte.Ready) / 2 + SCF + RET Z + ; + XOR A + RET ; ATA + ; +.non_ATA: LD BC,IDE.Read.Error + IN A,(C) + AND IDE.ErrorByte.Abort + RET NZ ; ATAPI + ; + SCF ; Absent + RET +;-------; + +;-------; + ; ATAPI or Absent + ; Exit: CF - No device + ; NC - ATAPI +.IdentPDevChk: LD E,IDE.ATAPI.IdentifyPackedDevice + LD BC,IDE.Write.Command + OUT (C),E + LD HL,PAUSES.WAIT.IDE + LD DE,IDE.ControlByte.Busy*256 + 0 + CALL BITS_WAITS.WAIT_PRT + RET C + ; + LD BC,IDE.Read.Status + IN A,(C) + RRCA + RET C + XOR A + RET +;-------; + +;-------; +; если канал пустой, то читается из порта то, что было выставлено +; последним на шину c чётного адреса в памяти а это первый или второй +; байт кода команды + ALIGN 2 ; тут нужно выравнивание по задуманным адресам для команд чтения из портов +.CheckChanel: LD BC,IDE.Read.Status + IN A,(C) ;#ED78 A=#78 + IN L,(C) ;#ED68 L=#68 + LD D,A + IN A,(C) ;#ED60 A=#ED + LD E,L + LD HL,#7868 + #ED + SBC HL,DE + XOR L + RET NZ ; not absent + SCF + RET ; absent +;-------; +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +; DisableWriteCache: +; LD BC,IDE.Write.Features +; LD A,IDE.ATA.SetFeatures.DisableWriteCache +; OUT (C),A +; LD A,IDE.ATA.SetFeatures +; JP IDE_CMD +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +;Disable StandBy timer +; DisableStandBy: +; LD BC,IDE.Write.Counter +; XOR A +; OUT (C),A +; LD A,IDE.ATA.Idle +; JP IDE_CMD +/////////////////////////////////////////////////////////////////////[^] + + +/////////////////////////////////////////////////////////////////////[v] +; DISABLE_8bit: +; LD BC,IDE.Write.Features +; LD A,IDE.ATA.SetFeatures.Disable8bit +; OUT (C),A +; LD A,IDE.ATA.SetFeatures +; JP IDE_CMD +/////////////////////////////////////////////////////////////////////[^] + + +;!FIXIT CMOS переделать под названия ячеек из SP2000.inc +PRIM_MASTER_CMOS_T: + DB M_CYLL,M_CYLH,M_HEAD,M_SECT +PRIM_SLAVE_CMOS_T: + DB S_CYLL,S_CYLH,S_HEAD,S_SECT +SEC_MASTER_CMOS_T: + DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT +SEC_SLAVE_CMOS_T: + DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT + + +SKIP: BYTE #FF +IDEDEV: BYTE #FF +ICHANEL: BYTE #00 +MasterSlave BYTE #00 + + +;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 + + ENDMODULE +; \ No newline at end of file diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index f58a48f..aee63ed 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -72,51 +72,6 @@ ;FDD EQU #03 -;!!!!!!!!!!!!!!!!!!!!!! -; !FIXIT проверить такие же ли адреса CMOS в Settings используются -; SM_CYLL EQU #2F -; SM_CYLH EQU #30 -; SM_HEAD EQU #31 -; SM_SECT EQU #32 - -; SS_CYLL EQU #33 -; SS_CYLH EQU #34 -; SS_HEAD EQU #35 -; SS_SECT EQU #36 - -; M_CYLL EQU #37 -; M_CYLH EQU #38 -; M_HEAD EQU #39 -; M_SECT EQU #3A - -; S_CYLL EQU #3B -; S_CYLH EQU #3C -; S_HEAD EQU #3D -; S_SECT EQU #3E - -M_CYLL EQU #12 -M_CYLH EQU #13 -M_HEAD EQU #14 -M_SECT EQU #15 - -S_CYLL EQU #16 -S_CYLH EQU #17 -S_HEAD EQU #18 -S_SECT EQU #19 - -SM_CYLL EQU #37 -SM_CYLH EQU #38 -SM_HEAD EQU #39 -SM_SECT EQU #3A - -SS_CYLL EQU #3B -SS_CYLH EQU #3C -SS_HEAD EQU #3D -SS_SECT EQU #3E - -;!!!!!!!!!!!!!!!!!!!!!! - - TEMP EQU #7E00 ; !HARDCODE MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 TPOINTD EQU TEMP-32 @@ -681,13 +636,14 @@ INFO_MESSAGE: ;!FIXIT ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE - CALL TSETUP + CALL TSETUP ;!TODO может пихнуть её на прерывания? - CALL AUTODET + CALL CONFIGURE_IDE_DRIVES.START CALL CTRLKEY LD A,B AND #10 JR NZ,ABOOT + CALL TSETUP @@ -742,7 +698,7 @@ TSETUP: AND A SBC HL,DE JR NZ,TSETUP - POP HL + POP HL ; убираем лишнее JP EXIT_SETUP CSETUP: XOR A LD (ITEM_Restore),A @@ -1115,226 +1071,6 @@ NOFDD1: RET -AUTODET: - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD HL,IDE.INIT_TBL_IDE0 - LD BC,256*(IDE.HDD_INIT_TABLE * 4) + #FF ;R02 -;CLEAR HDD VARIABLE -.FILLIDE: - LD (HL),C - INC HL - DJNZ .FILLIDE - EX AF,AF' - OUT (SLOT3),A - - ;======== старая нумерация дисков! ======== - ; CALL GET_AVAILABLE_STRUCT - ; LD A,#00 - ; CALL COMMONIDE - - ; CALL GET_AVAILABLE_STRUCT - ; LD A,#01 - ; CALL COMMONIDE - - ; CALL GET_AVAILABLE_STRUCT - ; LD A,#02 - ; CALL COMMONIDE - - ; CALL GET_AVAILABLE_STRUCT - ; LD A,#03 - ; CALL COMMONIDE - ;========================================== - - LD IY,IDE.INIT_TBL_IDE0 - XOR A - CALL COMMONIDE - - LD IY,IDE.INIT_TBL_IDE1 - LD A,#01 - CALL COMMONIDE - - LD IY,IDE.INIT_TBL_IDE2 - LD A,#02 - CALL COMMONIDE - - LD IY,IDE.INIT_TBL_IDE3 - LD A,#03 - CALL COMMONIDE - - ;!TEST save hdd parameters to cmos for "setup" in settings - CALL WRITING - ; - CALL ScreenPOS.CRLF - RET -; - ;======== старая нумерация дисков! ======== -;GET_AVAILABLE_STRUCT - ;LD C,SLOT3 - ;IN B,(C) - ;LD A,SYS_PAGE - ;OUT (C),A - ;CALL FIND_AVAILABLE_STRUCT - ;OUT (C),B - ;RET -;FIND_AVAILABLE_STRUCT - ;LD IY,IDE0 - ;LD A,(IY+DTYPE_H) - ;INC A - ;RET Z - ;LD IY,IDE1 - ;LD A,(IY+DTYPE_H) - ;INC A - ;RET Z - ;LD IY,IDE2 - ;LD A,(IY+DTYPE_H) - ;INC A - ;RET Z - ;LD IY,IDE3 - ;LD A,(IY+DTYPE_H) - ;INC A - ;RET - ;========================================== - - -; !HARDCODE заменить числа на метки в этой процедуре -COMMONIDE: - AND A - LD H,A ;SAVE DRIVE NUMBER - LD BC,#3011 ;CMOS VALUE - LD L,msgStrings.detectIdePrMA - JR Z,COMMON2 - DEC A - LD BC,#C011 ;CMOS VALUE - LD L,msgStrings.detectIdePrSL - JR Z,COMMON2 - DEC A - -; !HARDCODE заменить числа на метки в этой процедуре - LD BC,#3020 - LD L,msgStrings.detectIdeSecMA - JR Z,COMMON2 - DEC A - LD BC,#C020 - LD L,msgStrings.detectIdeSecSL - JR Z,COMMON2 - SCF - RET - -;0 - AUTODETECT -;1 - GETTING FROM SETUP -;2 - CD-ROM (ATAPI device) -;3 - DISABLED -COMMON2: - CALL G_VALUE - OR A - JP Z,AUTODETECT ;AUTODECECT - DEC A - JP Z,SETUPDETECT ;SETUP - DEC A - JP Z,IT_IS_CDROM ;CDROM - RET ;DON'T CHECK THIS DEVICE - -AUTODETECT: - PUSH HL - LD A,L ;DETECT MESSAGE - CALL POSTMSG - CALL ScreenPOS.SUBNAME -; - EI -; - POP HL - LD A,H ;RESTORE DRIVE NUMBER - CALL IDEAUTO -IDEJUMPBACK: - CALL NC,MODEL - LD A,(SKIP) - INC A - LD A,msgStrings.ideNone - JR Z,NOSKIPKEY - LD A,msgStrings.ideSkiped -NOSKIPKEY: - CALL C,POSTMSG - CALL ScreenPOS.CRLF - RET - -IT_IS_CDROM: - PUSH HL - LD A,L ;DETECT MESSAGE - CALL POSTMSG - CALL ScreenPOS.SUBNAME -; - EI -; - POP HL - LD A,H ;RESTORE DRIVE NUMBER - CALL IDE__CD - JP IDEJUMPBACK -; ????? посмотреть -PRIM_MASTER_CMOS_T: - DB M_CYLL,M_CYLH,M_HEAD,M_SECT -PRIM_SLAVE_CMOS_T: - DB S_CYLL,S_CYLH,S_HEAD,S_SECT -SEC_MASTER_CMOS_T: - DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT -SEC_SLAVE_CMOS_T: - DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT - -SETUPDETECT: - LD A,H - LD IX,PRIM_MASTER_CMOS_T - OR A - JR Z,SETUPD2 - ; - LD IX,PRIM_SLAVE_CMOS_T - CP 1 - JR Z,SETUPD2 - ; - LD IX,SEC_MASTER_CMOS_T - CP 2 - JR Z,SETUPD2 - ; - LD IX,SEC_SLAVE_CMOS_T -SETUPD2: - CALL SELECT_IDE - LD HL,TEMP - LD DE,TEMP+1 - LD BC,511 - LD (HL),0 - LDIR - CALL WAITHDD - RET C - ;; - LD A,(IX+2) ;M_HEAD - CALL READCMS - LD (TEMP+3*2),A ; !TODO сделать через структуру. HEADS PER TRACK - ; - LD A,(IX+1) ;M_CYLH - CALL READCMS - PUSH AF - ; - LD A,(IX+0) ;M_CYLL - CALL READCMS - POP HL - LD L,A - LD (TEMP+1*2),HL ; !TODO сделать через структуру. CYLINDERS - ; - LD A,(IX+3) ;M_SECT - CALL READCMS - LD (TEMP+6*2),A ; !TODO сделать через структуру. SECTOR PER TRACK - ; - ;LD A,IDE.Drive.Master - ;LD BC,IDE.Write.DeviceHead - ;OUT (C),A - LD A,IDE.Device.HDD - LD (IDEDEV),A - CALL IDESPEC - RET - -;ID_BUFFER: BLOCK #100,0 ;!HARDCODE ; !FIXIT уменьшить буфер или перенести? - PIDNUM: LD HL,memBUFFER.ID LD BC,#00FF XOR A @@ -1454,20 +1190,6 @@ PRNTIME: OUT (SLOT3),A RET -MODEL: LD HL,TEMP+27*2 ; !TODO сделать через структуру. - LD A,(HL) - OR A - JR Z,.unknown - LD B,20 - CALL DWPRINT - AND A - RET -.unknown: - LD A,msgStrings.ideUnknown - CALL POSTMSG - AND A - RET - PMEMORY: ADD HL,HL ADD HL,HL diff --git a/src/bios/rom/SETUP/SETTINGS.asm b/src/bios/rom/SETUP/SETTINGS.asm index 2673ec0..be52514 100644 --- a/src/bios/rom/SETUP/SETTINGS.asm +++ b/src/bios/rom/SETUP/SETTINGS.asm @@ -603,16 +603,16 @@ PITEM: LD E,(HL) ; x-coordinate ENDIF ;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-[^] +; Не портит HL G_VALUE: PUSH BC LD A,C CALL READCMS POP BC AND B -RRLPX: - RRCA +.loop: RRCA RRC B - JR NC,RRLPX + JR NC,.loop RLCA RET