diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b7dcfec..7fc636c 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -577,22 +577,25 @@ AUTO_0359: ; [x] 13/06/2025 boot loader from TR-DOS vROM ;███████████████████████████████████████████████████████████████████████ -PREPARE_TO_vROM_BOOT: - LD A,(ZX_VARS.RUN_AUTO_BOOT) - AND A ; признак попытки запуска boot командой RUN без параметров - JP Z,AUTO_03D9 - ; - DI - LD HL,(ZX_VARS.ADR_RET) +; PREPARE_TO_vROM_BOOT: +; LD A,(ZX_VARS.RUN_AUTO_BOOT) +; AND A ; признак попытки запуска boot командой RUN без параметров +; JP Z,AUTO_03D9 +; ; +; DI +; JP vROM_BOOT + +vROM_BOOT: LD HL,(ZX_VARS.ADR_RET) LD (ZX_VARS.FL_START),HL ; временно сохраняем ADR_RET - LD HL,vROM_BOOT ; адрес возврата из AUTO_01D3 + LD HL,vROM_BOOT.continue ; адрес возврата из AUTO_01D3 LD (ZX_VARS.ADR_RET),HL JP AUTO_01D3 ; -vROM_BOOT: LD HL,(ZX_VARS.FL_START) +;vROM_BOOT: +.continue: LD HL,(ZX_VARS.FL_START) LD (ZX_VARS.ADR_RET),HL ; восстанавливаем ADR_RET ; - LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + BOOT_PART_3.SIZE LD (ZX_VARS.FL_START),HL ; длина программы с переменными. LD (ZX_VARS.FL_LEN),HL ; длина программы с переменными. ; @@ -608,7 +611,10 @@ vROM_BOOT: LD HL,(ZX_VARS.FL_START) LD HL,BOOT_PART_2 LD BC,BOOT_PART_2.SIZE LDIR - ; + LD HL,BOOT_PART_3 + LD BC,BOOT_PART_3.SIZE + LDIR + ;LD HL,.StartAddr + BOOT_PART_1.SIZE + BOOT_PART_2.SIZE - 3 LD HL,vROM_Boot.StartLineNum LD (ZX_VARS.E_LINE),HL @@ -1214,9 +1220,27 @@ AUTO_07E7: WG93_EXE_: AND 252 JP WG93_EXE +;************************************** + + +;************************************** +;███████████████████████████████████████████████████████████████████████ +; [x] 13/06/2025 boot loader from TR-DOS vROM +BOOT_PART_3: INCBIN 'build/boot.bin',429 +.SIZE EQU $-BOOT_PART_3 + ; +; PREPARE_TO_vROM_BOOT: +; LD A,(ZX_VARS.RUN_AUTO_BOOT) +; AND A ; признак попытки запуска boot командой RUN без параметров +; JP Z,AUTO_03D9 +; DI +; JP vROM_BOOT +;************************************** + + ;************************************** ;INCLUDE 'trdos/tr_HDD_4.asz' - _mInfoBLOCK #0840-$,255 +; _mInfoBLOCK #0840-$,255 INCLUDE 'trdos/tr_msd_3.asz' @@ -1224,7 +1248,7 @@ WG93_EXE_: ;!TODO russian charset ;ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? ;************************************** - INCLUDE 'trdos/tr_msd_2.asz' + ;INCLUDE 'trdos/tr_msd_2.asz' ; DSS 0E00h,255 @@ -6622,6 +6646,16 @@ REDIR_3D13: JP EXP_FNS ; +; [x] 13/06/2025 boot loader from TR-DOS vROM +;███████████████████████████████████████████████████████████████████████ +PREPARE_TO_vROM_BOOT: + LD A,(ZX_VARS.RUN_AUTO_BOOT) + AND A ; признак попытки запуска boot командой RUN без параметров + JP Z,AUTO_03D9 + DI + JP vROM_BOOT +;███████████████████████████████████████████████████████████████████████ + ;***************************** _mInfoBLOCK #3CFA - $,255 AUTO_3CFA: @@ -6725,6 +6759,8 @@ PRINT_CR: LD A,#0D ; enter PRINT_SYM: JP PRINT_RED +;======================================================================= + _mInfoBLOCK #3D8F-$,#FF ; ХЕР DW 0000 ; ЗНАЕТ diff --git a/SP__48.ASM b/SP__48.ASM index fd074d5..3307182 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19300,7 +19300,7 @@ JMP_EX: PUSH HL ; ------------------------------- ; THE 'ZX SPECTRUM CHARACTER SET' ; ------------------------------- - +;; font ;; char-set ; $20 - Character: ' ' CHR$(32) diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index ecd2838..0a155d6 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -239,7 +239,7 @@ RESTORE_CURRENT_DIR: RET ; ;███████████████████████████████████████████████████████████████████████ -BOOT_PART_2: INCBIN 'build/boot.bin',248 +BOOT_PART_2: INCBIN 'build/boot.bin',248,181 .SIZE EQU $-BOOT_PART_2 ; ; vROM_BOOT: DI @@ -266,4 +266,4 @@ BOOT_PART_2: INCBIN 'build/boot.bin',248 ; ; JP CMD_RETURN ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start - DISPLAY "====================================================" \ No newline at end of file + DISPLAY "====================================================" diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ deleted file mode 100644 index 9d149d9..0000000 --- a/TRDOS/TR_MSD_2.ASZ +++ /dev/null @@ -1,663 +0,0 @@ -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 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 5,'CLEAR' ; очистить RAM-Disk - DW CLEAR_RAMD_X - 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 - CALL AUTO_1D97 - AND A - RET - - -;**************************************************** -;***************************************** -; ERRORS -;***************************************** -; 0 - ГЛАВНАЯ ПРОВЕРКА ПРОГРАММЫ -; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ -; 2 - КОНЕЦ КАТАЛОГА -; -;███████████████████████████████████████████████████████████████████████ - DISPLAY "TR_MSD_2.ASZ size: ",/A,$-File_Start - DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 1073cc9..3243a8f 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -565,7 +565,664 @@ GET_FL_L2: RET Z INC BC RET -;*********************************************************************** + +;********************************** +; 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 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 5,'CLEAR' ; очистить RAM-Disk + DW CLEAR_RAMD_X + 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 + CALL AUTO_1D97 + AND A + RET + + +;**************************************************** +;***************************************** +; ERRORS +;***************************************** +; 0 - ГЛАВНАЯ ПРОВЕРКА ПРОГРАММЫ +; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ +; 2 - КОНЕЦ КАТАЛОГА ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_MSD_3.ASZ size: ",/A,$-File_Start - DISPLAY "====================================================" \ No newline at end of file + DISPLAY "====================================================" + + diff --git a/TRDOS/boot/boot.asm b/TRDOS/boot/boot.asm index be43218..02ad004 100755 --- a/TRDOS/boot/boot.asm +++ b/TRDOS/boot/boot.asm @@ -6,6 +6,7 @@ ;======================================================================= collor_A EQU 0x03 collor_B EQU 0x02 +collor_N EQU 0x04 collor_M EQU 0x08 collor_T EQU 0x07 org_addr EQU #5d3b @@ -27,154 +28,178 @@ filename: DB "boot ",#22,#3a ; ':' 'rem' run ;org #5d65 start: LD (memSP),SP -NewDisk: XOR A - OUT (0xfe),A -; ld de, 0x5aff -; .l0 -; ld (de), a -; dec de -; cp d -; jr nz, .l0 - LD (ZX_VARS.ATTR_P),A - LD (ZX_VARS.BORDER),A - CALL BASIC_FN.x48.cls - LD BC,0x0905 +NewDisk: ;CALL clear_screen + LD BC,#0905 LD DE,0 LD HL,catBuff - ;.3 nop - CALL 0x3d13 + CALL #3D13 LD A,"a" LD (main.markPos),A -main: LD A,collor_T + LD A,1 + JP keys.setCP + ; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ALIGN #10 +TXT_BUTTONS: +.prev: DB '<<< PgUp' +.next: DB 'PgDn >>>' + ; +main.CurrentPage: + DB 1 +main.PagesCounter: + DB 1 +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; +main: LD A,(.CurrentPage) + LD (.PagesCounter),A +.nextLoop: LD A,collor_T LD (var_collor),A - LD HL,0x50cc + LD HL,#50CC LD (var_printPos),HL - LD HL,catBuff+0x08f5 + LD HL,catBuff + #08F5 + + + LD B,8 .p1: LD A,(HL) PUSH HL CALL printChar POP HL INC L - LD A,L - CP low (catBuff+0x08fd) - JR NZ,.p1 + DJNZ .p1 + ; LD A,L + ; CP low (catBuff + #08FD) + ; JR NZ,.p1 - LD HL,0x4000 + LD HL,#4000 LD (var_printPos),HL - - LD HL,catBuff + ; вычитывание каталога +.buffPointer+1: LD HL,catBuff .markPos+2: LD BC,"aa" .l1: LD A,(HL) DEC A - JR Z,.n1 - JP M,.e1 - ;boot detect -; cp "b"-1 -; jr nz, .s2 -; inc l -; ld a, "o" -; cp (hl) -; jr nz, .s2 -; inc l -; cp (hl) -; jr nz, .s2 -; inc l -; ld a, (hl) -; cp "t" -; jr nz, .s2 -; .l4: inc l -; bit 3, l -; jr z, .n1 -; ld a, " " -; cp (hl) -; jr z, .l4 - ; -.s2: LD A,L - AND 0xf0 - ADD A,0x08 - LD L,A + JR Z,.nextRec + ; + JP M,DirShowDone + ; + SET 3,L LD A,(HL) CP "B" RES 3,L - JR NZ,.n1 + JR NZ,.nextRec + ; две спец кнопки + LD A,C ; C - текущий файл + CP "y" + JR NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::" + ; + ; проходной прогон? + LD A,(.PagesCounter) + DEC A + JR NZ,.nextHiddenRec + ; basic file LD A,C - CP B + CP B ; выбранный файл LD A,collor_A - JR NZ,.s1 + JR NZ,.notMarked + ; выделение файла и копирование его в строку запуска XOR collor_M + ; LD DE,filename PUSH BC - LD BC,0x08 + LD BC,8 LDIR POP BC RES 3,L -.s1: LD (var_collor),A - LD A,C - PUSH HL - CALL printChar - LD A," " - CALL printChar - POP HL -.l2: LD A,(HL) - INC HL - PUSH HL - CALL printChar - POP HL - LD A,L - AND 0x07 - JR NZ,.l2 - LD A,(var_printPos) - AND 0x1f - JR Z,.s3 - LD A," " - PUSH HL - CALL printChar - POP HL -.s3: INC C -.n1: LD A,L - AND 0xf0 - LD L,A - LD DE,0x0010 + ; +.notMarked: CALL prn_txt +.nextHiddenRec: INC C +.nextRec: LD DE,#10 ADD HL,DE JR .l1 -.e1:; ld a, c -; sub "a" -; ld (var_files), a + ; + +PRINT_NEXT_BUTTONS: + LD A,(main.PagesCounter) + LD (keys.nxtPage),A + DEC A + JR Z,.noChange + LD (main.PagesCounter),A + LD (main.buffPointer),HL +.noChange: PUSH AF + CALL PRINT_HELP + POP AF + JP Z,keys + JR keys.toMain + +PRINT_HELP: LD HL,#5040 + LD (var_printPos),HL + LD A,collor_N + PUSH BC + LD C," " + LD HL,TXT_BUTTONS.prev + CALL prn_txt + ; + LD A,collor_N + CALL prn_txt + ; + POP BC + RET + + ; +DirShowDone: XOR A + LD (keys.nxtPage),A + CALL PRINT_HELP keys: RES 5,(iy+1) .w1: BIT 5,(iy+1) JR Z,.w1 - LD A,(iy-0x32) + LD A,(iy-#32) + ; CP B JR Z,exit - CP 0x0d + CP #0D ; enter JR Z,exit - CP " " + CP " " ; space JP Z,NewDisk - CP #08 ; left + ; + CP #04 ; pgUp + LD E,-1 + JR Z,.prevPage + ; +.pgdn: CP #05 ; pgDn + LD E,1 + JR Z,.nextPage + ; +.left: CP #08 ; left JR NZ,.sl DEC B JR .c1 + ; .sl: CP #0B ; up JR NZ,.sd DEC B DEC B DEC B JR .c1 + ; .sd: CP #0A ; down JR NZ,.su INC B INC B INC B JR .c1 + ; .su: CP #09 ; right JR NZ,.sr INC B JR .c1 + ; .sr: CP "a" JR C,keys CP C JR NC,keys LD B,A + ; .c1: LD A,B CP "a" JR NC,.sf1 @@ -184,8 +209,30 @@ keys: RES 5,(iy+1) LD A,C DEC A .sf2: LD (main.markPos),A - JP main -; var_files db 0 +.toMain: JP main.nextLoop + +; DE - +24 or -24 +.nextPage: ; +.nxtPage+1: LD A,0 + AND A + JR Z,.skip + XOR A + LD (.nxtPage),A + ; +; DE - +24 or -24 +.prevPage: LD A,(main.CurrentPage) + ADD A,E + JR Z,.skip + ; +.setCP: LD H,A + LD L,A + LD (main.CurrentPage),HL + LD HL,catBuff + LD (main.buffPointer),HL +.skip: CALL clear_screen + JR .toMain + + exit: memSP+1: LD SP,0 @@ -234,8 +281,9 @@ var_printPos+1: LD DE,0x4000 var_collor+1: LD A,0 LD (HL),A SET 5,L - XOR collor_A^collor_B + XOR collor_A ^ collor_B LD (HL),A + ; LD HL,var_printPos LD A,(HL) ADD A,0x21 @@ -247,7 +295,69 @@ var_collor+1: LD A,0 ADD A,0x08 LD (HL),A RET - ; + ; + ; + +clear_screen: XOR A + OUT (0xfe),A + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.BORDER),A + JP BASIC_FN.x48.cls + +; A - current file +; choose_color: CP B ; выбранный файл. #C7 +; LD A,collor_A +; SCF +; RET NZ +; XOR collor_M +; RET + + +; A - COLOR +; C - char of text button +; HL - Text +prn_txt: LD (var_collor),A + LD A,C + PUSH HL + CALL printChar + LD A," " + CALL printChar + POP HL + ; +.loop: LD A,(HL) + INC HL + PUSH HL + CALL printChar + POP HL + LD A,L + AND 0x07 + JR NZ,.loop + ; + LD A,(var_printPos) + AND 0x1f + RET Z + LD A," " + PUSH HL + CALL printChar + POP HL + RET + ; + ; + +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ALIGN #10 +; TXT_BUTTONS: +; .prev: DB '<< PgDn ' +; .next: DB '>> PgUp ' +; ; +; main.CurrentPage: +; DB 1 +; main.PagesCounter: +; DB 1 +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + StartLineNum: DB 0 DW 0 ;DB #80 @@ -258,8 +368,346 @@ l2end: ;ds -$&0x0f ;ALIGN #10 ;filename EQU $ -catBuff EQU $ + (-$&0x0f) +catBuff EQU #6000 ;$ + (-$&0x0f) + ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" EXPORT StartLineNum EXPORT org_addr -; \ No newline at end of file +; + +/* +; device zxspectrum48 + INCLUDE 'inc/rom_routines.inc' + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' + +;======================================================================= +collor_A EQU 0x03 +collor_B EQU 0x02 +collor_N EQU 0x04 +collor_M EQU 0x08 +collor_T EQU 0x07 +org_addr EQU #5d3b + + + ORG org_addr + +bstart: DW #100 ; line number = 1 + DW l1end-l1begin ; line length +l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0 + DB #0e,#00,#00 : DW start : DB #00,#0d ; start address +l1end: DW #200 ; line number = 2 + DW l2end-l2begin ; line length +l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0 + DB #0e,#00,#00 : DW 15619 : DB #00 ; start address + DB #3a,#ea,#3a,#f7,#22 +filename: DB "boot ",#22,#3a ; ':' 'rem' run +;======================================================================= + + ;org #5d65 +start: LD (memSP),SP +NewDisk: CALL clear_screen + ; XOR A + ; ;OUT (0xfe),A + ; LD (ZX_VARS.ATTR_P),A + ; LD (ZX_VARS.BORDER),A + ; CALL BASIC_FN.x48.cls + ; + LD BC,0x0905 + LD DE,0 + LD HL,catBuff + ;.3 nop + CALL 0x3d13 + LD A,"a" + LD (main.markPos),A +main: LD A,collor_T + LD (var_collor),A + LD HL,0x50cc + LD (var_printPos),HL + LD HL,catBuff+0x08f5 +.p1: LD A,(HL) + PUSH HL + CALL printChar + POP HL + INC L + LD A,L + CP low (catBuff+0x08fd) + JR NZ,.p1 + + LD HL,0x4000 + LD (var_printPos),HL + ; вычитывание каталога +.buffPointer+1: LD HL,catBuff +.markPos+2: LD BC,"aa" +.l1: LD A,(HL) + DEC A + JR Z,.n1 + ; + JP M,keys + ; + LD A,L + AND #F0 + ADD A,8 + LD L,A + LD A,(HL) + CP "B" + RES 3,L + JR NZ,.n1 + ; две спец кнопки + LD A,C ; C - текущий файл + CP "y" + JP NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::" + ; + ; basic file + CP B ; выбранный файл + LD A,collor_A + JR NZ,.s1 + ; выделение файла и копирование его в строку запуска + XOR collor_M + ;CALL choose_color + ;JR C,.s1 + ; + LD DE,filename + PUSH BC + LD BC,8 + LDIR + POP BC + RES 3,L + ; +.s1: CALL prn_txt +.s3: INC C +.n1: LD A,L + AND #F0 + LD L,A + LD DE,#10 + ADD HL,DE + JR .l1 + ; + ; + ; + ALIGN #10 +TXT_BUTTONS: +.prev: DB '<< PgDn ' +.next: DB '>> PgUp ' + ; + ; +keys: RES 5,(iy+1) +.w1: BIT 5,(iy+1) + JR Z,.w1 + LD A,(iy-0x32) + ; + CP B + JR Z,exit + CP 0x0d ; enter + JR Z,exit + CP " " ; space + JP Z,NewDisk + ; + CP #04 ; pgUp + LD DE,-384 + JR Z,.nxtPage + ; +.pgdn: CP #05 ; pgDn + LD DE,384 + JR Z,.nxtPage + ; +.left: CP #08 ; left + JR NZ,.sl + DEC B + JR .c1 + ; +.sl: CP #0B ; up + JR NZ,.sd + DEC B + DEC B + DEC B + JR .c1 + ; +.sd: CP #0A ; down + JR NZ,.su + INC B + INC B + INC B + JR .c1 + ; +.su: CP #09 ; right + JR NZ,.sr + INC B + JR .c1 + ; +.sr: CP "a" + JR C,keys + CP C + JR NC,keys + LD B,A + ; +.c1: LD A,B + CP "a" + JR NC,.sf1 + LD A,"a" +.sf1: CP C + JR C,.sf2 + LD A,C + DEC A +.sf2: LD (main.markPos),A +.toMain: JP main + +; DE - +24 or -24 +.nxtPage: LD HL,(main.buffPointer) + ADD HL,DE + BIT 3,H + JR NZ,keys +.EnablePages+1: AND 0 + JR Z,keys + ; + XOR A + LD (.EnablePages),A ; A=0 - Disable Pages + LD (main.buffPointer),HL + CALL clear_screen + JR .toMain +; var_files db 0 + +exit: +memSP+1: LD SP,0 + RET + + + +PRINT_NEXT_BUTTONS: + LD HL,#5040 + LD (var_printPos),HL + LD A,collor_N + LD (keys.EnablePages),A ; A!=0 - Enable Pages + LD HL,TXT_BUTTONS.prev + CALL prn_txt + ; + LD A,collor_N + INC C + CALL prn_txt + ; + JP keys + + +printChar: LD H,A + ADD A,A + ADD A,A + ADD A,A + LD L,A + LD A,H + RLCA + RLCA + RLCA + AND 0x07 + ADD A,0x3c + LD H,A +var_printPos+1: LD DE,0x4000 + +.l1: LD A,(HL) + RRCA + OR (HL) + INC HL + LD (DE),A + INC D + LD (DE),A + INC D + LD A,D + AND 0x07 + JR NZ,.l1 + LD A,D + SUB 0x08 + LD D,A + LD A,E + ADD A,0x20 + LD E,A + AND 0x20 + JR NZ,.l1 + LD HL,(var_printPos) + LD A,H + RRCA + RRCA + RRCA + ADD A,0x50 + LD H,A +var_collor+1: LD A,0 + LD (HL),A + SET 5,L + XOR collor_A ^ collor_B + LD (HL),A + ; + LD HL,var_printPos + LD A,(HL) + ADD A,0x21 + AND 0xdf + LD (HL),A + RET NZ + INC HL + LD A,(HL) + ADD A,0x08 + LD (HL),A + RET + ; + ; + +clear_screen: XOR A + OUT (0xfe),A + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.BORDER),A + JP BASIC_FN.x48.cls + ; + + +; A - current file +; choose_color: CP B ; выбранный файл. #C7 +; LD A,collor_A +; SCF +; RET NZ +; XOR collor_M +; RET + + +; A - COLOR +; C - char of text button +; HL - Text +prn_txt: LD (var_collor),A + LD A,C + PUSH HL + CALL printChar + LD A," " + CALL printChar + POP HL + ; +.loop: LD A,(HL) + INC HL + PUSH HL + CALL printChar + POP HL + LD A,L + AND 0x07 + JR NZ,.loop + ; + LD A,(var_printPos) + AND 0x1f + RET Z + LD A," " + PUSH HL + CALL printChar + POP HL + RET + ; +StartLineNum: DB 0 + DW 0 + ;DB #80 +l2end: +;bend: + DISPLAY "printChar ",/A,$-printChar + DISPLAY "code ",/A,$-start + ;ds -$&0x0f + ;ALIGN #10 +;filename EQU $ +catBuff EQU #6000 ;$ + (-$&0x0f) + + ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" + EXPORT StartLineNum + EXPORT org_addr +; +*/ \ No newline at end of file diff --git a/TRDOS/boot/boot.inc b/TRDOS/boot/boot.inc index 34f5b4d..398b400 100644 --- a/TRDOS/boot/boot.inc +++ b/TRDOS/boot/boot.inc @@ -1,2 +1,2 @@ -StartLineNum: EQU 0x00005EAA +StartLineNum: EQU 0x00005F30 org_addr: EQU 0x00005D3B