File_Start DEFL $ DISPLAY "====================================================" ;███████████████████████████████████████████████████████████████████████ ;********************************** ; MS-DOS system ;********************************** MSDOS_FIND_FILE: PUSH DE ; ИМЯ ИСКОМОГО ФАЙЛА CALL MSDOS_1ST_FL POP DE RET C FIND_LOOP_ALL: CALL MSDOS_KOMP_FL RET Z ; ВОЗВРАТ - ФАЙЛ НАЙДЕН !! ;MSDOS_FIND_NEXT: CALL MSDOS_NEXT_FL JR NC,FIND_LOOP_ALL RET ;*********************************************** ; ; CHECK_BPB: ; IN A,(SLOT3) ; LD E,A ; LD A,SYS_PAGE ; DI ; OUT (SLOT3),A ; ; ; LD A,(SYS_PAGE.BPB_PARSED) ; ADD A,1 ; ; ; LD A,E ; OUT (SLOT3),A ; EI ; RET ;*********************************************** MSDOS_1ST_FL: PUSH DE ; 15/07/2024 ;CALL CHECK_BPB CALL READ_BPB ;CALL C,READ_BPB ; CALL READ_1ST_DIR POP DE MSDOS_TEST_FL: PUSH DE DI IN A,(SLOT3) LD E,A LD A,SYS_PAGE OUT (SLOT3),A LD A,E ; [x] 07/07/2024 пропуск LFN PUSH HL LD DE,#0B ; FAT_DIRECTORY_RECORD.ATTRIBUT ADD HL,DE LD D,(HL) POP HL ; LD E,(HL) OUT (SLOT3),A EI ; [x] 07/07/2024 пропуск LFN LD A,D CP #0F ; FAT_ATTR.LFS_Entry JR NZ,.nxt POP DE JR MSDOS_NEXT_FL ; .nxt: LD A,E POP DE AND A SCF RET Z ; КОНЕЦ КАТАЛОГА CP #E5 JR Z,MSDOS_NEXT_FL AND A RET ;********************** MSDOS_NEXT_FL: PUSH DE LD DE,32 ; FAT_DIRECTORY_RECORD size ADD HL,DE DI IN A,(SLOT3) LD D,A LD A,SYS_PAGE OUT (SLOT3),A LD A,(SYS_PAGE.COUNT_FL) DEC A LD (SYS_PAGE.COUNT_FL),A LD E,A LD A,D OUT (SLOT3),A ; RET_PAGE3 EI LD A,E POP DE AND A ; СБРОС CF !! JR NZ,MSDOS_TEST_FL PUSH DE DI IN A,(SLOT3) LD D,A LD A,SYS_PAGE OUT (SLOT3),A LD A,(SYS_PAGE.COUNT_SEC) DEC A LD (SYS_PAGE.COUNT_SEC),A LD E,A LD A,D OUT (SLOT3),A ; RET_PAGE3 EI LD A,E POP DE AND A SCF RET Z PUSH DE CALL READ_NEXT_DIR POP DE LD HL,SYS_PAGE.MS_DIR JR MSDOS_TEST_FL ;********************************** MSDOS_CAT: PUSH DE CALL AUTO_1D97 ; CLS CALL OPEN_CH2 LD A,"\r" RST #10 POP DE ; СТРОКА ПОСЛЕ CAT .loop: LD A,(DE) CP " " ;JR NZ,CAT_NO_SPACE INC DE JR Z,.loop DEC DE ;CAT_NO_SPACE: CP "\r" JR NZ,CAT_ALL LD DE,CAT_FILES CAT_ALL: ; CALL MSDOS_FIND_FILE CALL MSDOS_1ST_FL JR C,CAT_END CAT_LOOP: JR Z,CAT_NO_PRINT CALL MSDOS_KOMP_FL JR NZ,CAT_NO_PRINT PUSH HL PUSH DE CALL OPEN_CH2 POP DE POP HL ; CALL COPY_NAME_MSD CALL PRINT_MSD_NAME CALL PRINT_MSD_DATS ; CALL MSDOS_FIND_NEXT CAT_NO_PRINT: CALL MSDOS_NEXT_FL JR NC,CAT_LOOP CAT_END: CALL OPEN_CH0 JP AUTO_03E1 PRINT_MSD_NAME: PUSH HL PUSH DE LD HL,ZX_VARS.FL_NAME LD A,' ' RST #10 LD A,' ' RST #10 ; LD B,8 .L1: LD A,(HL) ;AND #7F ; баг с именем, если на FAT имена с UTF8 RST #10 INC HL DJNZ .L1 ; LD A,' ' RST #10 ; LD B,3 .L2: LD A,(HL) ;AND #7F ; баг с именем, если на FAT имена с UTF8 RST #10 INC HL DJNZ .L2 ; LD A,6 RST #10 POP DE POP HL RET PRINT_MSD_DATS: PUSH HL PUSH DE LD HL,ZX_VARS.FL_PLACE+1 LD A,(HL) DEC HL CALL PRINT_HEX_A LD A,(HL) DEC HL CALL PRINT_HEX_A LD A,(HL) DEC HL CALL PRINT_HEX_A LD A,' ' RST 10H LD A,(HL) DEC HL CALL PRINT_HEX_A LD A,(HL) DEC HL CALL PRINT_HEX_A LD A,13 RST 10H POP DE POP HL RET ;********************************************** CAT_FILES: DB '*.*',13 ;********************************************** COPY_NAME_MSD: PUSH HL PUSH DE DI IN A,(SLOT3) LD C,A LD A,SYS_PAGE OUT (SLOT3),A LD A,C LD DE,ZX_VARS.FL_NAME LD BC,11 LDIR LD BC,15 ADD HL,BC LD BC,5 LDIR LD L,(HL) OUT (SLOT3),A ; RET_PAGE3 EI LD A,L POP DE POP HL AND A ; A = 0 ДЛЯ ФАЙЛА ДЛИНОЙ < 16 Мб. RET ;********************************************* ;****************************************************** CMD_MSDOS: ; MS-DOS командер !! ;****************************************************** CALL SINTAX_RET LD HL,WORDS LOOP_FIND2: LD DE,(ZX_VARS.ADR_DOS_COM) INC DE ; Пропустить / LD A,(HL) AND A JR Z,END_TAB LD B,A INC HL LOOP_FIND: LD A,(DE) AND 223 CP (HL) JR NZ,NEXT_WORD INC DE INC HL DJNZ LOOP_FIND LD A,(DE) CP "\r" JR Z,CMD_EXE1 CP ' ' JR Z,CMD_EXE JR NEXT_WORD2 CMD_EXE: INC DE CMD_EXE1: LD A,(HL) INC HL LD H,(HL) LD L,A CALL JP_HL JP AUTO_03E1 JP_HL: JP (HL) NEXT_WORD: INC HL DJNZ NEXT_WORD NEXT_WORD2: INC HL INC HL JR LOOP_FIND2 END_TAB: INC DE LD A,(DE) CP ':' DEC DE JR NZ,END_TAB3 LD A,(DE) AND 223 SUB 'A' JR C,END_TAB3 CP 4 JR NC,END_TAB2 LD (ZX_VARS.OPER_DISK),A LD (ZX_VARS.CONT_DISK),A LD B,A LD A,(ZX_VARS.PDOS_COPY) AND #7C OR B LD (ZX_VARS.PDOS_COPY),A OUT (FDC_93.DrvCTRL),A ; [ ] 19/07/2024 на каждый диск трдос свой раздел hdd можно замапить LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS CP #40 JR C,.exit ; AND #0F LD C,BIOS.HDD_PART CALL EXP_FNS ;LD HL,MSG_3 ;CALL C,AUTO_03C3 ; .exit: JP AUTO_03E1 END_TAB2: SUB 4 CP SYS_PAGE.RAMD_KEYS.NUM JR NC,END_TAB3 CALL RAMD_SET1 JP AUTO_03E1 END_TAB3: LD A,0 JP LOAD_RMD_XX MSD_ERR: LD HL,MSDOS_MSG ; File not found... JP AUTO_03E4 ;************************************ LOAD_RMD: CALL RAMD_SYM ; получить номер RAM-Disk из (DE) JP C,MSD_ERR LOAD_RMD_XX: LD (ZX_VARS.MED_START+1),A ; сохранить CALL MSDOS_FIND_FILE JP C,MSD_ERR CALL RMD_BLKS_FL ; B - число блоков , DE - абсолютный сектор LD A,(ZX_VARS.MED_START+1) PUSH AF CALL CLEAR_RMD_A ; освободить RAM-Disk A POP AF CALL GET_RMD_A ; установить RAM-Disk A размером B LD HL,#C000 CALL MSDOS_READ_FILE JP AUTO_03E1 SAVE_RMD: CALL RAMD_SYM ; получить номер RAM-Disk из (DE) JP C,MSD_ERR LD (ZX_VARS.MED_START+1),A CALL MSDOS_FIND_FILE JP C,MSD_ERR CALL RMD_BLKS_FL LD A,(ZX_VARS.MED_START+1) CALL TEST_RAMD ; проверить наличие RAM-Disk A размером B JP C,MSD_ERR ; A - номер первого блока JP Z,MSD_ERR LD HL,#C000 CALL MSDOS_WRITE_FILE JP AUTO_03E1 RMD_BLKS_FL: LD A,(ZX_VARS.FL_SIZE+2) PUSH HL LD HL,(ZX_VARS.FL_SIZE) LD B,A AND A RL L RL H RL B AND A RL L RL H RL B LD A,H OR L JR Z,RMD_BLKS_L2 INC B RMD_BLKS_L2: POP HL RET ; B - ЧИСЛО БЛОКОВ RAM_DISK ;**************************************** ; DE - ИМЯ ФАЙЛА СО *,? ; HL - ИМЯ В КАТАЛОГЕ MSDOS_KOMP_FL: CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS LD A,(ZX_VARS.FL_NAME) AND A JR NZ,KOMP_CONT1 LD A,2 ; КОНЕЦ КАТАЛОГА AND A ; NZ - ИМЯ НЕ СОВПАДАЕТ RET KOMP_CONT1: CP 0A5h JR NZ,KOMP_CONT2 LD A,1 ; СТЕРТЫЙ ФАЙЛ - ИМЯ НЕ СОВПАДАЕТ AND A RET KOMP_CONT2: PUSH DE PUSH HL LD HL,ZX_VARS.FL_NAME CALL MSDOS_KOMP_ALL POP HL POP DE RET MSDOS_KOMP_ALL: LD A,(DE) INC DE CP " " JR Z,MSDOS_KOMP_ALL CP "\r" JR Z,KOMP_ERROR_NAME ; НЕВЕРНОЕ ИМЯ DEC DE LD B,8 CALL KOMP_TX RET NZ LD A,(DE) CP "." JR Z,KOMP_POINT CP "\r" JR Z,KOMP_SPACING3 CP " " JR Z,KOMP_SPACING3 KOMP_ERROR_NAME: ; НЕВЕРНОЕ ИМЯ LD A,1 AND A RET KOMP_POINT: INC DE LD B,3 CALL KOMP_TX RET NZ LD A,(DE) CP 13 RET Z CP 20H RET Z JR KOMP_ERROR_NAME ;**************************************************** KOMP_TX: LD A,(DE) CP "\r" JR Z,KOMP_SPACING CP " " JR Z,KOMP_SPACING CP "." JR Z,KOMP_SPACING CP "?" JR Z,KOMP_EX_OK CP "*" JR Z,KOMP_EX_OK2 CP "a" JR C,KOMP_EXEC CP "z"+1 JR NC,KOMP_EXEC AND %1101'1111 KOMP_EXEC: CP (HL) RET NZ ; нет совпадения KOMP_EX_OK: INC DE KOMP_EX_OK2: INC HL DJNZ KOMP_TX CP '*' JR NZ,KOMP_NO_STAR1 INC DE KOMP_NO_STAR1: XOR A RET KOMP_SPACING3: LD B,3 KOMP_SPACING: LD A,20H KOMP_L2: CP (HL) INC HL RET NZ DJNZ KOMP_L2 RET ;************************************************ CALC_CLAST: ; HL - стартовый кластер PUSH BC PUSH HL DEC HL DEC HL DI 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 BC,0 LD H,B LD L,B LD HX,B LD LX,B CALC_CL_LP: ADD IX,DE ADC HL,BC DEC A JR NZ,CALC_CL_LP LD DE,(SYS_PAGE.MSD_DAT_SEC) LD BC,(SYS_PAGE.MSD_DAT_SEC2) ADD IX,DE ADC HL,BC ; HL,IX - СМЕЩЕНИЕ КЛАСТЕРА ОТ НАЧАЛА ДАННЫХ EX AF,AF' OUT (SLOT3),A PUSH IX EX (SP),HL POP IX EX DE,HL EI POP HL POP BC RET HD_TX: DC ' - HDD error' ;HD_TX: DC 'HDD error #' HD_TX2: DC 'HDD not found' MSG_3: DC '*ERROR*' MSDOS_MSG: DC 'File not found' NO_MEMORY: DC 'Out of memory' ;NO_MEMORY: DC 'No RAM-Disk MEM' WORDS: DB 5,'CLEAR' ; очистить RAM-Disk DW CLEAR_RAMD_X DB 3,'CAT' ; каталог MS-DOS DW MSDOS_CAT DB 3,'DIR' ; каталог MS-DOS DW MSDOS_CAT DB 3,'HDD' ; подключить HDD DW HDD_SET DB 3,'FDD' ; подключить FDD DW FDD_SET DB 3,'RMD' ; подключить RMD DW RAMD_SET DB 3,'HDT' ; тест HDD DW HDD_PROG DB 2,'RD' ; тест RAM-Disk space DW RAMD_FAT_PROG DB 4,'SAVE' ; сохранить RAM-Disk DW SAVE_RMD DB 4,'LOAD' ; загрузить RAM-Disk DW LOAD_RMD DB 4,'TBON' ; включить турбо DW TB_ONOFF DB 5,'TBOFF' ; выключить турбо DW TB_ONOFF DB 4,'INIT' ; реинизиализация DW INIT_RMD DB 8,"SPRINTER" DW SPR_1 DB 2,"AY" DW AY8910 DB 0 ;SAVE_AUTOEXEC: ; LD C,0FEH ; CALL EXP_FNS ; RET AY8910: LD A,#EA LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; CALL AUTO_1D97 AND A RET SPR_1: LD A,(DE) INC DE CP " " JR Z,SPR_1 CP "1" LD C,BIOS.RST_CONF.SP97_1 JR Z,SP_1 CP "2" SCF RET NZ LD C,BIOS.RST_CONF.SP97_2 SP_1: LD A,(DE) CP " "+1 CCF RET C CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI ; CALL AUTO_1D97 AND A RET ;**************************************************** ;***************************************** ; ERRORS ;***************************************** ; 0 - ГЛАВНАЯ ПРОВЕРКА ПРОГРАММЫ ; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ ; 2 - КОНЕЦ КАТАЛОГА ; ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_MSD_2.ASZ size: ",/A,$-File_Start DISPLAY "===================================================="