From 65a295742443ce101cbd3d601c41fc9a6958a67f Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 15 Feb 2025 01:58:14 +1000 Subject: [PATCH] add boot from ATAPI --- Shared_Includes | 2 +- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 2 +- src/bios/exp/EXTENDED/IDE/shared.asm | 114 +++++------ src/bios/rom/SETUP/AUTOIDE.asm | 6 +- src/bios/rom/SETUP/MAIN.asm | 259 ++++++++++++------------ 5 files changed, 193 insertions(+), 190 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 237dd36..831b2da 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 237dd36651b4af124f12d3f1eaee3688467f8fa3 +Subproject commit 831b2da8a66ee3bd78a7c73ef3592609e5f02902 diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index d75b1de..f25dd53 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -131,7 +131,7 @@ ATAPI_5x_SET_PAR: LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),B EX AF,AF OUT (SLOT3),A - RET + RET ;[]================================================================[#59] diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index a27b72e..903ffdb 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -3,66 +3,60 @@ ; Вход: A - номер устройства, C - DriveType ; Выход: A - MediaParameters, C - DriveType ; не портит L -SELECT_DRIVE: - AND #0F - LD IY,IDE.INIT_TBL_IDE0 - JR Z,.channel - DEC A - LD IY,IDE.INIT_TBL_IDE1 - ;R02 - JR Z,.channel - DEC A - LD IY,IDE.INIT_TBL_IDE2 - JR Z,.channel - DEC A - LD IY,IDE.INIT_TBL_IDE3 - ; - JR Z,.channel - LD A,BIOS.Error.BadNumber - SCF - RET - ; -.channel: - EXX - IN A,(SLOT3) - PUSH AF - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters) - LD C,(IY + IDE.HDD_INIT_TABLE.DriveType) - LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags) - POP AF - OUT (SLOT3),A ;возврат страницы - ; - LD A,C - EXX - ; - CP C - ; - EXX - SCF - LD A,BIOS.Error.BadNumber - RET NZ - ; - LD A,B - RRA - LD A,IDE.Chanel.Secondary - JR C,.device - LD A,IDE.Chanel.Primary -.device: OUT (IDE.Chanel.Set),A ;R02 - LD A,B - AND #F0 - LD BC,IDE.Write.DeviceHead - OUT (C),A - LD A,H - EXX - RET - ; -; NODRIVE: -; LD A,BIOS.Error.BadDrvNumber -; SCF -; RET +SELECT_DRIVE: AND #0F + LD IY,IDE.INIT_TBL_IDE0 + JR Z,.channel + DEC A + LD IY,IDE.INIT_TBL_IDE1 + ;R02 + JR Z,.channel + DEC A + LD IY,IDE.INIT_TBL_IDE2 + JR Z,.channel + DEC A + LD IY,IDE.INIT_TBL_IDE3 + ; + JR NZ,.error + ; +.channel: EXX + IN A,(SLOT3) + PUSH AF + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters) + LD C,(IY + IDE.HDD_INIT_TABLE.DriveType) + LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags) + POP AF + OUT (SLOT3),A ;возврат страницы + ; + LD A,C + EXX + ; + CP C + ; + EXX + SCF + LD A,BIOS.Error.BadNumber + RET NZ + ; + LD A,B + RRA + LD A,IDE.Chanel.Secondary + JR C,.device + LD A,IDE.Chanel.Primary +.device: OUT (IDE.Chanel.Set),A ;R02 + LD A,B + AND #F0 + LD BC,IDE.Write.DeviceHead + OUT (C),A + LD A,H + EXX + RET + ; +.error: LD A,BIOS.Error.BadNumber + SCF + RET ;======================================================================= diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 4507232..be1d27a 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -457,9 +457,9 @@ IDESPEC: IN A,(SLOT3) CP BIOS.Error.ATAPI.UnitAttention JR Z,IDESPEC.END ; - CP BIOS.Error.ATAPI.NotReady - SCF - JR NZ,.set_sector ; любая непонятная ошибка - нет носителя + ;CP BIOS.Error.ATAPI.NotReady + ;SCF + ;JR NZ,.set_sector ; любая непонятная ошибка - нет носителя HALT DJNZ .get_error_loop ; diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 62916f6..cf40b26 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -74,9 +74,10 @@ ;FDD EQU #03 ;!FIXIT нормально прописать -TEMP EQU #7E00 ; !HARDCODE +TEMP EQU #7800 ; !HARDCODE +OS_LOAD.SectorSizeAddr EQU TEMP-2 IDENTIFY_DEVICE_BUFFER _ATA_IDENTIFY_DEVICE_DATA = TEMP -MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 +MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM; - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023 ASSERT (low TEMP = 0) or (low MEMMAP2 = 0), "ERROR Align 256!!!" @@ -1059,132 +1060,140 @@ PrepareToBOOT: ;CALL INT_ON ; Error SCF RET - -FDSTART: - PUSH BC - PUSH BC - LD A,msgStrings.bootFdd - CALL POSTMSG - POP AF - CALL FDD_5x_RESET - POP BC - RET C - JP OS_LOAD -;!TODO -CDSTART: - PUSH BC - LD A,msgStrings.bootCd - CALL POSTMSG - POP AF - PUSH AF - CALL PRINT_CHANEL - ; - POP BC - SET 6,B - SCF - RET - -RDSTART: - LD A,msgStrings.bootRamDrv - CALL POSTMSG - LD B,DRIVE_CODES.SPRINTER.RAM ; 6 - тип драйва RAM-DRV, 0 - номер драйва -.loop: PUSH BC - CALL OS_LOAD - POP BC - INC B - LD A,DRIVE_CODES.SPRINTER.RAM + SYS_PAGE.RAMD_KEYS.NUM-1 ; максимальный номер рамдиска - SUB B - JR NC,.loop - RET + ; +FDSTART: PUSH BC + PUSH BC + LD A,msgStrings.bootFdd + CALL POSTMSG + POP AF + CALL FDD_5x_RESET + POP BC + RET C + JP OS_LOAD + ; +CDSTART: LD A,B ; [ ] 15/02/2025 boot from ATAPI + OR DRIVE_CODES.SPRINTER.ATAPI + LD B,A + PUSH BC + LD A,msgStrings.bootCd + CALL POSTMSG + POP AF + PUSH AF + CALL PRINT_CHANEL + ; + POP BC + PUSH BC + CALL OS_LOAD + POP BC + RET NC + LD HL,2048 ;!HARDCODE sector size + LD IX,#0011 + JR OS_LOAD.CD + ; +RDSTART: LD A,msgStrings.bootRamDrv + CALL POSTMSG + LD B,DRIVE_CODES.SPRINTER.RAM ; 6 - тип драйва RAM-DRV, 0 - номер драйва +.loop: PUSH BC + CALL OS_LOAD + POP BC + INC B + LD A,DRIVE_CODES.SPRINTER.RAM + SYS_PAGE.RAMD_KEYS.NUM-1 ; максимальный номер рамдиска + SUB B + JR NC,.loop + RET -HDSTART: - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,B - ; - AND #03 ;R02 %00000011 - LD IY,IDE.INIT_TBL_IDE0 - JR Z,.next - ; - LD IY,IDE.INIT_TBL_IDE1 - CP 1 ;R02 - JR Z,.next - ; - LD IY,IDE.INIT_TBL_IDE2 ;R02 - CP 2 ;R02 - JR Z,.next - ; - LD IY,IDE.INIT_TBL_IDE3 ;R02 - ; -.next: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - CP IDE.Device.ATAPI - JP Z,CDSTART - PUSH AF - PUSH BC - LD A,msgStrings.bootHdd - CALL POSTMSG - POP AF - PUSH AF - CALL PRINT_CHANEL +HDSTART: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,B + ; + AND #03 ;R02 %00000011 + LD IY,IDE.INIT_TBL_IDE0 + JR Z,.next + ; + LD IY,IDE.INIT_TBL_IDE1 + CP 1 ;R02 + JR Z,.next + ; + LD IY,IDE.INIT_TBL_IDE2 ;R02 + CP 2 ;R02 + JR Z,.next + ; + LD IY,IDE.INIT_TBL_IDE3 ;R02 + ; +.next: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + CP IDE.Device.ATAPI + JP Z,CDSTART + PUSH AF + PUSH BC + LD A,msgStrings.bootHdd + CALL POSTMSG + POP AF + PUSH AF + CALL PRINT_CHANEL + ; + POP BC + POP AF + CP #FF + SCF + RET Z + ; +OS_LOAD: LD HL,512 ;!HARDCODE + LD IX,#0001 +.CD: LD (.SectorSizeAddr),HL + LD HL,#0000 + LD DE,TEMP + LD A,B + LD BC,1*256 + BIOS.DRV_READ + PUSH AF + RST ToBIOS_18 + ; + POP BC + RET C + LD A,B + EX AF,AF' + LD HL,TEMP + LD DE,SYSID + LD B,SYSID.length +.loop: LD A,(DE) + CP (HL) + SCF + RET NZ + INC HL + INC DE + DJNZ .loop + EX AF,AF' + PUSH AF + LD A,msgStrings.bootOk + LD E,COLORS.CGA.INK.LGREEN + CALL POSTMSC + CALL ScreenPOS.CRLF + POP AF ; физический номер диска + POP HL +.MOVE0: DI + IM 1 + LD HL,MOVE1 + LD DE,OS_LOAD.SectorSizeAddr - MOVE1.length ; !HARDCODE + LD BC,MOVE1.length + LDIR + JP OS_LOAD.SectorSizeAddr - MOVE1.length + ; +MOVE1: LD HL,#8000 ; !HARDCODE + LD SP,HL + EX DE,HL + LD HL,TEMP + LD BC,(OS_LOAD.SectorSizeAddr) + LDIR + JP #8000+SYSID.length ;#800C ; !HARDCODE + ; +.length EQU $-MOVE1 + - POP BC - POP AF - CP #FF - SCF - RET Z -OS_LOAD: - LD HL,#0000 - LD IX,#0001 - LD DE,TEMP - LD A,B - LD BC,1*256 + BIOS.DRV_READ - PUSH AF - RST ToBIOS_18 - - POP BC - RET C - LD A,B - EX AF,AF' - LD HL,TEMP - LD DE,SYSID - LD B,SYSID.length -.loop: LD A,(DE) - CP (HL) - SCF - RET NZ - INC HL - INC DE - DJNZ .loop - EX AF,AF' - PUSH AF - LD A,msgStrings.bootOk - LD E,COLORS.CGA.INK.LGREEN - ;CALL POSTMSG - CALL POSTMSC - CALL ScreenPOS.CRLF - POP AF - POP HL -; JP MOVE0 -MOVE0: DI - IM 1 - LD HL,MOVE1 - LD DE,#7C00 ; !HARDCODE - LD BC,MOVE1.length - LDIR - JP #7C00 -MOVE1: LD SP,#7FFF ; !HARDCODE - LD HL,TEMP - LD DE,#8000 ; !HARDCODE - LD BC,#0200 ; !HARDCODE - LDIR - JP #8000+SYSID.length ;#800C ; !HARDCODE -.length EQU $-MOVE1 SYSID: DZ "Starting..." .length EQU $-SYSID