diff --git a/For_4x.asm b/For_4x.asm new file mode 100644 index 0000000..a4fd653 --- /dev/null +++ b/For_4x.asm @@ -0,0 +1,213 @@ +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + +; in: HL - CLUSTER +; out: HL:IX - SECTOR +; Вначале должна быть выполнена инициализация BPB 4x +CLUSTER_TO_SECTOR: + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + EX DE,HL + LD HL,(SYS_PAGE.MSD_DAT_SEC) + LD (.MSD_DAT_SEC),HL + LD HL,(SYS_PAGE.MSD_DAT_SEC2) + LD (.MSD_DAT_SEC2),HL + EX DE,HL + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + ; + LD DE,0 ;!FIXIT for FAT32 + DEC HL + DEC HL + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + ; + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D +.MSD_DAT_SEC+1: LD DE,0 ;first data sector ;!FIXIT а если начальный сектор > #FFFF + XOR A + ADD IX,DE +.MSD_DAT_SEC2+1: + LD DE,0 + ADC HL,DE + ;!TODO а надо ли проверять переполнение HL:IX? + RET +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; +SET_IMAGE_DIR_SECTOR: + LD HL,ONE_FILE + LD DE,TMP_BUFF + LD A,FAT_ATTR.DIRECTORY + LD BC,Dss.F_First.FATname + RST ToDSS + RET C + ; + LD HL,(TMP_BUFF+26) ; ;!HARDCODE first dir cluster + CALL CLUSTER_TO_SECTOR + LD (RESET_TO_ZX.DIR_SEC_L),IX + LD (RESET_TO_ZX.DIR_SEC_H),HL + RET +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; +SET_CURRENT_HDD: +.NUMBER+1: LD A,#FF + CP #FF + LD C,BIOS.HDD_INIT + JP Z,ToBIOS_18 + LD C,BIOS.HDD_PART ; IDE-1/IDE-2 + JP ToBIOS_18 +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; +BPB_SetUp: LD A,SYS_PAGE + LD HL,SYS_PAGE.MS_BPB + LD C,BIOS.HDD_READ_BPB + RST ToBIOS +.PARAMS: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.MS_BPB+FORM_CODE) + CP #F0 + JP C,.ERROR_BPB + + LD DE,SYS_PAGE.MS_BPB+FAT_ID + LD HL,.FAT1_MSG + LD B,4 +.L1: LD A,(DE) + CP ' ' + JR NZ,.L11 + INC DE + JR .L1 +.L11: CP (HL) + JR NZ,.PC_DOS + + INC HL + INC DE + DJNZ .L1 + LD A,(DE) + CP '6' + LD HL,#81FF ; FAT16 флаг + JR Z,.FAT + CP '2' + JP NZ,.ERROR_BPB + +.PC_DOS: LD HL,#01FF ; FAT12 флаг +.FAT: LD (SYS_PAGE.FAT_FLAG),HL + + LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек + LD (SYS_PAGE.MSD_SECS),A + + LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) + LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) +.NO_LD_SPECIAL: LD BC,0 + LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) + + ADD IX,DE + ADC HL,BC + + LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT + + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs +.NEXT_ADD: + ADD IX,DE + ADC HL,BC + DEC A + JR NZ,.NEXT_ADD + LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + LD A,B + RL C + RLA + RL C + RLA + RL C + RLA + LD C,A + LD B,0 ; BC - число файловых записей в секторе + LD (SYS_PAGE.FilesPerSector),A + LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей + + EX DE,HL + DEC HL + XOR A +.NEXT_ADD2: + INC A + JR Z,.ERROR_BPB + SBC HL,BC + JR NC,.NEXT_ADD2 + EX DE,HL + + LD E,A ; A - число секторов в DIR + LD BC,0 + LD D,B + LD (SYS_PAGE.SectorsPerCluster),A + + ADD IX,DE ; Начало DATA area + ADC HL,BC + + LD (SYS_PAGE.MSD_DAT_SEC),IX + LD (SYS_PAGE.MSD_DAT_SEC2),HL + + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + ; D = 0 + LD H,D + LD L,D + LD E,D + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + LD D,A + XOR A +.NEXT_ADD3: + ADD HL,BC ; Вычисление длины кластера + ADC A,E + DEC D + JR NZ,.NEXT_ADD3 + + LD (SYS_PAGE.CLASTER_LEN),HL + LD B,E + LD C,A + LD (SYS_PAGE.CLASTER_LEN2),BC + ; + ; DE=0 + EX DE,HL ;LD HL,0 + LD BC,(SYS_PAGE.MS_BPB+S_P_T) + LD A,(SYS_PAGE.MS_BPB+H_P_S) +.BPB_L1: ; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР + ADD HL,BC + DEC A + JR NZ,.BPB_L1 + LD (SYS_PAGE.S_X_H),HL + ; + EX AF,AF' + OUT (SLOT3),A + AND A + RET + ; +.ERROR_BPB: + EX AF,AF' + OUT (SLOT3),A + SCF + RET + ; +.FAT1_MSG: DB "FAT1" +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 4f546cb..7e812bc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4f546cb1d2cd8eeb1aec0de2c3e9902d1bb52fee +Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 diff --git a/spectrum.asm b/spectrum.asm index 8797607..e077547 100644 --- a/spectrum.asm +++ b/spectrum.asm @@ -690,6 +690,7 @@ SET_ROM: DI ;******************************************** ;******************************************** +; Чтение образа TRD/SCL в рамдрайв READ_IMAGE: LD DE,ONE_FILE LD BC,FULL_FILE_NAME_LENGTH LDIR @@ -701,7 +702,7 @@ READ_IMAGE: LD DE,ONE_FILE RET C LD (IMAGE_HANDLER),A - ; [ ] 31/01/2024 поддержка переключения диска/раздела в TR-DOS + ; [x] 31/01/2024 поддержка переключения диска/раздела в TR-DOS LD HL,ONE_FILE LD BC,Dss.EX_Path.GET_ALL RST ToDSS @@ -713,11 +714,11 @@ READ_IMAGE: LD DE,ONE_FILE RST ToDSS JR C,.no_change_Disk JR .getInfoDRV -.currentDisk: ; - LD A,(ONE_FILE) + ; +.currentDisk: LD A,(ONE_FILE) SUB "A" ; -.getInfoDRV: ; +.getInfoDRV: ; Настраиваем HDD OR #80 LD HL,TMP_BUFF LD BC,Dss.DskInfo @@ -730,13 +731,14 @@ READ_IMAGE: LD DE,ONE_FILE LD E,(HL) INC HL DJNZ .loop_param + ; check HDD LD A,(HL) - AND #80 - JR Z,.no_change_Disk - CP #90 + CP DRIVE_CODES.SPRINTER.HDD + JR C,.no_change_Disk + CP DRIVE_CODES.SPRINTER.HDD + 4 + 1 JR NC,.no_change_Disk ; - LD A,3 + LD A,%0000'0011 AND (HL) LD D,A INC HL @@ -747,23 +749,46 @@ READ_IMAGE: LD DE,ONE_FILE OR D AND #0F ; - ;LD C,SLOT3 - ;IN B,(C) - ;EX AF,AF' - ;LD A,SYS_PAGE - ;OUT (C),A - ;EX AF,AF' - ; - LD (RESET_TO_ZX.hdd),A - ;OUT (C),B - ; + LD (SET_CURRENT_HDD.NUMBER),A + OR DRIVE_CODES.TRDOS.HDD + LD (RESET_TO_ZX.CURRENT_DIR_DRIVE),A + ; + ; [x] поддержка переключения папки образа для режима ZX + ; Выделяем путь до папки с образом + LD HL,ONE_FILE + LD BC,ONE_FILE.Size + XOR A + CPIR + DEC HL + DEC HL + PUSH HL + LD HL,ONE_FILE.Size - 2 + SBC HL,BC + LD B,H + LD C,L + POP HL + LD A,'\' ; + CPDR + INC HL + LD (HL),0 + ; устанавливаем и инитим винт + LD A,SYS_PORT.BIOS + OUT (SYS_PORT.ROM),A + CALL SET_CURRENT_HDD + LD A,SYS_PORT.BIOS + OUT (SYS_PORT.RAM),A + ; парсим для расчётов BPB + CALL BPB_SetUp + ; запоминаем сектор директории + CALL SET_IMAGE_DIR_SECTOR + ;;;;;;;;; ; .no_change_Disk:; LD A,(IMAGE_FLAG) AND A JR Z,.Load_TRD - CP 1 ; check if SCL + DEC A ; check if SCL JP Z,Load_SCL ;jp Error_Flag ;!!!!!!!!!!!!!!!! @@ -822,7 +847,6 @@ Get_RAM_Disk_E: LD A,D RET ;--------------------------------------- - ;******************************************** Load_IMAGE_File: LD A,(IMAGE_HANDLER) @@ -936,7 +960,7 @@ RESTORE_PORT_HOLD: JP ToBIOS ; ; ; FIRST_PREPARE: LD A,CNF_PORT.CNF_0 - OUT (SYS_PORT.OFF),A + OUT (SYS_PORT.RAM),A CALL RESTORE_PORT_HOLD LD A,high ZXKeys.Line_7 @@ -1102,7 +1126,6 @@ NO_RET_FN: LD (#FFF4),DE ; LD (#FFF1),A IN A,(SLOT2) ; сохранить страницу LD (#FFF2),A ; программы для возврата - ;IN A,(SLOT3) LD A,(SAVE_SLOT3) LD (#FFF3),A ; ;******************************************** @@ -1113,14 +1136,14 @@ RESET_TO_ZX: DI CALL FIRST_PREPARE JP Z,EXIT_TO_DSS.cont - ; фикс неполной дешифрации порта #FFFD (пишут в #C0FD) -.cont: LD A,#FF - LD HL,%00'010'1'1110'1101 - LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1 - LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG - RST ToBIOS + ; [x] фикс неполной дешифрации порта #FFFD (пишут в #C0FD) +.cont: LD A,#FF + LD HL,%00'010'1'1110'1101 + LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1 + LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG + RST ToBIOS ; - ;[x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD + ; [x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD LD BC,BIOS.SWAP_RAM_DRIVES.ZX RST ToBIOS ; @@ -1132,8 +1155,20 @@ RESET_TO_ZX: DI LD A,ACEX.RET_PORT CALL SET_ROM ; включить возврат + ; [ ] + LD A,SYS_PAGE + OUT (SLOT3),A +.DIR_SEC_L+1: LD HL,0 + LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL +.DIR_SEC_H+1: LD HL,0 + LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL +.CURRENT_DIR_DRIVE+1: + LD A,#FF + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A + ;;;;;;;; + LD A,CNF_PORT.CNF_3 - OUT (SYS_PORT.ON),A ; System-page on & CNF = 3 + OUT (SYS_PORT.ROM),A ; System-page on & CNF = 3 XOR A OUT (BorderColor),A ; border-0 @@ -1162,10 +1197,7 @@ RESET_TO_ZX: DI ;---------------[test!!!!!]------------- ;[ ] 1/02/2024 режим спектрума работает с любыми каналами и основными разделами - ; XOR A ; --> IDE-1 -.hdd+1: LD A,#FF - LD C,BIOS.HDD_PART ; IDE-1/IDE-2 - RST ToBIOS_18 + CALL SET_CURRENT_HDD ;--------------------------------------- ;****************************** @@ -1309,7 +1341,7 @@ PROG_STARTS: LD A,2 OUT (SLOT2),A LD A,E - OUT (SYS_PORT.OFF),A + OUT (SYS_PORT.RAM),A LD A,D AND A JP Z,0 @@ -1402,6 +1434,9 @@ NO_ZX_FLAG DB 0 ;----------------------------------------------------------------------; ; + INCLUDE 'For_4X.asm' + + ; Если параметр задан, то выбирается значение Y PARAMS:; Y / N ; тут значения для ключей записываются как 16 бит значение, значит обратный порядок байтов Turbo__: DW Turbo_, #0302 ; включить TURBO @@ -1455,9 +1490,11 @@ CNF_FILE: DB "SPECTRUM.CFG",0 ;SPECTRUM_HOME_DIR EQU USER_CURRENT_DIR + 256 ; ONE_FILE: WORD 0 -TMP_BUFF EQU ONE_FILE+256 +.Size EQU 256 +TMP_BUFF EQU ONE_FILE + ONE_FILE.Size +.Size EQU 256 ; -PlaceForPalette EQU TMP_BUFF+256 ;#A000 +PlaceForPalette EQU TMP_BUFF + TMP_BUFF.Size ;#A000 PlaceForTXTscreen EQU PlaceForPalette + 1024*4 ;!HARDCODE @@ -1466,4 +1503,144 @@ PlaceForTXTscreen EQU PlaceForPalette + 1024*4 ;!HARDCODE ; Code after Loader ;[]-------------------------------------------------------------------[] ; Code end section -; \ No newline at end of file +; + +; [x] new tr-hdd +; TO INIT by SPECTRUM.EXE: +; .CURRENT_DIR_SEC_L EQU #C196 ; word +; .CURRENT_DIR_SEC_H EQU #C198 ; word +; .CURRENT_DIR_DRIVE EQU #C19A +; .CURRENT_HDD EQU #C12D + +; CORRECT_CUR_DIR: +; DI +; IN A,(SLOT3) +; LD C,A +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,#FF +; JR C,.skip +; LD (SYS_PAGE.CURRENT_HDD),A +; .skip: INC A +; LD H,A +; LD L,A +; LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL +; LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL +; LD A,C +; OUT (SLOT3),A +; RET +/* +INIT_HDD_WORK: + LD A,(RESET_TO_ZX.hdd) + CP #FF + JR Z,.skip_hdd + ; + OR #80 + LD HL,Temp_Buffer + LD BC,Dss.DskInfo + RST ToDSS + ; + LD B,4 ;!HARDCODE номер нужного параметра + LD DE,0 + LD HL,Temp_Buffer +.loop_param: ADD HL,DE + LD E,(HL) + INC HL + DJNZ .loop_param + LD A,(HL) + AND #80 + JR Z,.no_change_Disk + CP #90 + JR NC,.no_change_Disk + ; + LD A,3 + AND (HL) + LD D,A + INC HL + LD A,(HL) + RLCA + RLCA + ; + OR D + AND #0F + JR .start + ; +.no_change_Disk:; + XOR A +.start: LD C,BIOS.HDD_PART ; IDE-1/IDE-2 + RST ToBIOS + ; +.loop: LD C,BIOS.HDD_INIT + RST ToBIOS + JR C,.loop + ; + + CALL BPB_SetUp + + + ;[x] music and dirs + LD HL,SND_DIR + LD DE,Temp_Buffer + LD A,FAT_ATTR.DIRECTORY + LD BC,Dss.F_First.FATname + RST ToDSS + JR NC,.start_setup + ; + LD A,#C9 ; RET opcode - disable music + LD (SoundOnOff2),A + RET + ; +.start_setup: +;-=-=-=-=-=-=-=- + LD HL,(Temp_Buffer+26) ; first dir cluster + CALL NSECTOR + LD (MSD_DATS.MSD_CAT_SEC2),HL + LD (MSD_DATS.MSD_CAT_SEC),IX + ;JP READ_DIR + + + + +.RESTORE_DIR: + PUSH AF + ; + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD HL,(SYS_PAGE.CURRENT_DIR_SEC_L) + LD DE,(SYS_PAGE.CURRENT_DIR_SEC_H) + LD A,H + OR L + OR D + OR E + JR Z,.exit_Res_Dir + ; + LD (SYS_PAGE.MSD_CAT_SEC),HL + LD (SYS_PAGE.MSD_CAT_SEC2),DE +.exit_Res_Dir: + EX AF,AF' + OUT (SLOT3),A + POP AF + RET + +CORRECT_CUR_DIR: + DI + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,#FF + JR C,.skip + LD (SYS_PAGE.CURRENT_HDD),A +.skip: INC A + LD H,A + LD L,A + LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL + LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL + LD A,C + OUT (SLOT3),A + RET + +*/ \ No newline at end of file