From 0af59044c8adfbd6eafe6e09866318c3b03e99b3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 23 Apr 2024 23:56:35 +1000 Subject: [PATCH] bugs --- BOOT/DSSBOOT.ASM | 89 +++++++++++++- DSS/API/diskINF.asm | 8 +- DSS/DOS_Proc.asm | 29 +++-- DSS/Structures.inc | 24 ++-- DSS/build.txt | 2 +- DSS/defines.inc | 2 +- SHELL/Commands/CHDIR.ASM | 4 +- SHELL/Commands/DIR.ASM | 243 ++++++++++++++++++++++++--------------- SHELL/build.txt | 2 +- 9 files changed, 280 insertions(+), 123 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index f1c59b8..76ef5e2 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -93,6 +93,8 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,(FCLUSTR) LD DE,#C000 CALL FLOAD ; загрузка + + DI XOR A OUT (SYS_PORT.OFF),A @@ -434,6 +436,84 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 INC A RET +; ; HL - CLUSTER +; ; DE - ADDRESS +; ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +; FLOAD: LD (READMEM),DE +; .LD_FILE: PUSH HL ; system.dos first cluster +; CALL NSECTOR ; Cluster to Sector +; LD DE,(READMEM) +; LD A,(BOOT.SectorsPerCluster) +; CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов +; LD C,BIOS.DRV_READ_LONG +; JR C,.SMALL_CLUSTER +; LD A,(BANKDOS) +; EX AF,AF' +; ;LD BC,#20*256 + BIOS.DRV_READ_LONG +; LD B,#20 ; !HARDCODE кол-во загружаемых секторов +; .set_drv: LD A,(DRIVE) +; RST ToBIOS_18 +; JP C,GOOD_DRIVE.NoShell +; POP HL +; ; [ ] загрузка system.dos больше #4000 байтов +; ;AND A +; ;RET +; LD A,(BIG_SHELL) +; OR A +; RET Z +; ; +; XOR A +; LD (BIG_SHELL),A +; PUSH HL +; CALL NSECTOR +; LD DE,#20 ; !HARDCODE кол-во прочитанных секторов +; AND A +; ADD IX,DE +; JR NC,.no_inc_hl +; INC HL +; .no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов +; LD DE,#4000 +; JR .set_drv +; ; +; .SMALL_CLUSTER: LD B,A +; ;LD C,BIOS.DRV_READ_LONG +; LD A,(BANKDOS) +; EX AF,AF' +; LD A,(DRIVE) +; RST ToBIOS_18 +; JP C,GOOD_DRIVE.NoShell +; ; +; LD HL,(READMEM) +; LD DE,(CLU_LEN) +; ADD HL,DE +; LD (READMEM),HL +; ; [ ] загрузка system.dos больше #4000 байтов +; ;POP HL +; ;RET C +; CALL C,.more_than_1 +; POP HL +; RET C +; ; +; CALL R_F_FAT ; next cluster in chain +; RET C +; EX DE,HL +; JP .LD_FILE +; ; [ ] загрузка system.dos больше #4000 байтов +; .more_than_1: LD A,(BIG_SHELL) +; OR A +; SCF +; RET Z +; IN A,(SLOT1) +; LD HL,BANKDOS +; CP (HL) +; CCF +; RET Z +; LD (BANKDOS),A +; LD HL,#C000 +; LD (READMEM),HL +; AND A +; RET + ; HL - CLUSTER ; DE - ADDRESS ;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы @@ -442,7 +522,7 @@ FLOAD: LD (READMEM),DE CALL NSECTOR ; Cluster to Sector LD DE,(READMEM) LD A,(BOOT.SectorsPerCluster) - CP #20 + CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов LD C,BIOS.DRV_READ_LONG JR C,.SMALL_CLUSTER LD A,(BANKDOS) @@ -474,7 +554,6 @@ FLOAD: LD (READMEM),DE JR .set_drv ; .SMALL_CLUSTER: LD B,A - ;LD C,BIOS.DRV_READ_LONG LD A,(BANKDOS) EX AF,AF' LD A,(DRIVE) @@ -509,6 +588,12 @@ FLOAD: LD (READMEM),DE LD (BANKDOS),A LD HL,#C000 LD (READMEM),HL + LD A,(BOOT.SectorsPerCluster) + SUB SUBLOAD_SIZE + 1 + CCF + RET NC + LD A,SUBLOAD_SIZE + LD (BOOT.SectorsPerCluster),A AND A RET diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index c4f79b9..4938c26 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -161,9 +161,15 @@ DISKINF: LD C,B EXX LD B,A LD C,A -.loop_free_space: +.loop_free_space:;!FIXIT PUSH BC + EXX + PUSH BC + EXX CALL READ_FROM_FAT + EXX + POP BC + EXX POP BC CP DSS_Error.sys.DISK_FULL RET Z diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 08f26b5..58d3f01 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -399,6 +399,10 @@ DIR_PATH_CHECK: LD A,(HL) ; .checkDir: LD HL,CurrentDirectory+1 LD DE,WorkDirectory+1 + ; счётчик + LD A,B + LD B,C + EX AF,AF' ; .loop: LD A,(DE) AND A @@ -406,8 +410,22 @@ DIR_PATH_CHECK: LD A,(HL) CP (HL) INC HL INC DE - JR Z,.loop - JP .gotoPath + JR NZ,.gotoPath + DJNZ .loop + EX AF,AF' + SUB 1 + RET C + EX AF,AF' + DJNZ .loop + ; +.gotoPath: LD C,B + EX AF,AF' + LD B,A + CALL FINDDIR.CHECK_SLASH + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET C + LD HL,CurrentPath + JP GETWORD ; .end: CP (HL) RET Z @@ -417,12 +435,7 @@ DIR_PATH_CHECK: LD A,(HL) LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) - RET -.gotoPath: CALL FINDDIR.CHECK_SLASH - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET C - LD HL,CurrentPath - JP GETWORD + RET ;----------------------------------------------------------------------; diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 0758840..a4eedd7 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -1,22 +1,22 @@ ; - STRUCT _sStack ; 256 bytes + STRUCT _sStack ; 256 bytes .buffer BLOCK 256,0 .SPoint BYTE 0 ENDS ; ; - STRUCT _sEXE_HEADER ; 512 bytes -.EXE_EXT TEXT 3,{"EX","E"} -.VERSION BYTE 0 -.OFFCOD1 WORD 0 -.OFFCOD2 WORD 0 -.LOADER WORD 0 -.RESERVED BLOCK 6,0 -.LD_ADDR WORD 0 -.PC_REG WORD 0 -.SP_REG WORD 0 -.RESERVED2 BLOCK 490,0 + STRUCT _sEXE_HEADER ; 512 bytes +.EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE Сигнатура +.VERSION BYTE 0 ; 3 Version of EXE file +.OFFCOD1 WORD 00 ; 4-5 С какого смещения в файле будет грузиться код в +.OFFCOD2 WORD 00 ; 6-7 память по адресу (Code_addr) Low addr, High addr. +.LOADER WORD 00 ; 8-9 Размер первичного загрузчика или 0 +.RESERVED BLOCK 6,0 ; 10-15 Reserved +.LD_ADDR WORD 00 ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF) +.PC_REG WORD 00 ; 18-19 Адрес в памяти с которого запустится код (Reg. PC) +.SP_REG WORD 00 ; 20-21 Адрес стека (Reg. SP) +.RESERVED2 BLOCK 490,0 ; 22-512 Можно использовать под текст для выпендрёжа или не использовать ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index 36c9eca..a8a24cb 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -957 \ No newline at end of file +959 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 348c999..2461fc3 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -155,5 +155,5 @@ MOUSE_BAUD: ; ;----------------------------------------------------; ; Внимание, стек хранится в той же странице! -SUBLOAD_SIZE EQU 10 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу +SUBLOAD_SIZE EQU 2 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу ;----------------------------------------------------; diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index 0fda843..5a7a215 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -11,7 +11,7 @@ cmd_chdir: xor a ld hl,work_buffer1; cp (hl) - jr nz,A877B + jr nz,.chdir ld (hl),"." ; ".." родит. папка inc hl ld (hl),"." @@ -19,7 +19,7 @@ cmd_chdir: ld (hl),0 dec hl dec hl -A877B: ld c,Dss.ChDir ; сменить тек. каталог +.chdir: ld c,Dss.ChDir ; сменить тек. каталог RST ToDSS jp c,print_err_message ; вывод сообщения jp Get_Path ; сохр. тек. диск и путь diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index c6d83a5..a64e308 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -181,9 +181,10 @@ cmd_dir: ;ld hl,has_not_full_info ;JR Z,.skip_full_space ; - ld hl,(free_space) ; мл. разряд + ld hl,(free_space_low) ; мл. разряд exx - ld hl,(free_space+2) ; ст. разряд + ld hl,(free_space_medium) ; ст. разряд + ;!FIXIT использовать старший разряд! free_space_high exx CALL Size2Char ld hl,T8B46 ; "0 000 000 000" @@ -495,11 +496,13 @@ A8B16: inc a ret ; -D88DC: dw 0 -D88DE: dw 0 -D88E0: dw 0 -dir_number: dw 0 -free_space: dword 0 +D88DC: WORD 0 +D88DE: WORD 0 +D88E0: WORD 0 +dir_number: WORD 0 +free_space_low: WORD 0 +free_space_medium: WORD 0 +free_space_high: BYTE 0 ; T8B2E: db "000000000" @@ -512,50 +515,76 @@ T8B46: db "0 000 000 000",0 ; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo ; иная логика получения метки тома - сначала ищется в корневой директории, ; если там нет, то берётся из BPB -read_disk_info: - OR #80 - LD HL,work_buffer -.full+1: LD B,0 - LD C,Dss.DskInfo - RST ToDSS - ; Файловая система - ; Серийный номер диска - ; Метка диска в BPB - EX AF,AF' - LD A,(.full) - OR A - JR Z,.no_full_space_option - ; - ; (DE*A)*BC - ;PUSH HL ; общее кол-во кластеров - ;PUSH DE ; свободных кластеров - PUSH BC ; размер сектора в байтах - EX AF,AF' - ; !TEST fat 32 - ;LD C,A ; A - размер кластера в секторах - ;CALL Mult16X8 - ; A:HL = DE*A - LD B,0 - LD C,A - EXX - PUSH DE - EXX - POP HL - ; HL:DE * BC свободные_кластеры * размер_кластера_в_секторах - CALL Mult32 - ; HL:DE = свободные_секторы - ; - ; EX DE,HL - ; LD H,0 - ; LD L,A - POP BC - CALL Mult32 - ; HL:DE = свободное место ;!FIXIT ограничено 4 гигами - ; - LD (free_space+2),HL - EX DE,HL - LD (free_space),HL - ; +read_disk_info: OR #80 + LD HL,work_buffer +.full+1: LD B,0 + LD C,Dss.DskInfo + RST ToDSS + ; Файловая система + ; Серийный номер диска + ; Метка диска в BPB + EX AF,AF' + LD A,(.full) + OR A + JR Z,.no_full_space_option + ; + ; max sector (LBA28) #0FFF'FFFF + ; HL - общее кол-во кластеров + ; DE - свободных кластеров low + ; DE' - свободных кластеров high + ; A - размер кластера в секторах + ; BC - размер сектора в байтах + PUSH IX + ; + PUSH BC ; размер сектора в байтах + EX AF,AF' + ; A - размер кластера в секторах + ; + ; free_clu_L * clu_size_in_sect + LD C,A + EX AF,AF' + CALL Mult16X8 ; DE*C = A:HL + ; A:HL = DE*C + ; + ; free_clu_H * clu_size_in_sect + EXX + EX AF,AF' + LD C,A + PUSH BC + CALL Mult16X8 ; DE*C = A:HL + ; max #0FFF'FFFF sectors for LBA28 + EX AF,AF' + LD D,0 + LD E,A + ADD HL,DE + EXX + ; HL':HL - свободных секторов + ; + EX DE,HL + POP BC ; размер сектора в байтах + PUSH BC + CALL Mult_16x16 ; DE*BC = HL:DE. + EXX + POP BC + CALL Mult_16x16 ; DE*BC = HL:DE. + LD XH,D + LD XL,E + EXX + EX DE,HL + ADD IX,DE + EX DE,HL + EXX + JR NC,.no_inc_HL + INC L + ; потому что не должно быть больше #001F'FFFF'FE00 + ; при секторе в 512 байтов + ; +.no_inc_HL: LD A,L + LD (free_space_high),A + LD (free_space_medium),IX + EXX + LD (free_space_low),DE + POP IX ; .no_full_space_option: ; parse @@ -647,8 +676,7 @@ read_disk_info: .good_label: POP HL PUSH HL ; лишнее - -; есть метка + ; есть метка volume_label: pop DE ; лишнее ; %5 @@ -663,7 +691,6 @@ volume_label: call ncopy_string ; скопир. строку (с нулем) ret ; - ; если не удалось прочитать серийный номер диска или формат неизвестен unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже @@ -787,51 +814,77 @@ Size2Char: ;Процедура умножения (16*8bit) ;На вход: DE * C ;На выход:A:HL = результат -Mult16X8: - SUB A - LD L,A - LD H,A - CP C - RET Z - OR D - OR E - RET Z - LD A,C - LD C,#00 - LD B,#08 -Mlt16x8: - ADD HL,HL - RLA - JR NC,1F - ADD HL,DE - ADC A,C -1: DJNZ Mlt16x8 - RET +Mult16X8: SUB A + LD L,A + LD H,A + CP C + RET Z + OR D + OR E + RET Z + LD A,C + LD C,#00 + LD B,#08 +.loop: ADD HL,HL + RLA + JR NC,.next + ADD HL,DE + ADC A,C +.next: DJNZ .loop + RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;Процедура умножения (32bit) ;На вход: HL:DE * BC ;На выход:HL:DE = результат -Mult32: - PUSH IX - LD IX,#0000 - LD A,#20 - EX DE,HL -mul32b: - ADD IX,IX - ADC HL,HL - RL E - RL D - JR NC,noadd1 - ADD IX,BC - JR NC,noadd1 - INC HL -noadd1: - DEC A - JR NZ,mul32b - LD E,LX - LD D,HX - POP IX - RET + IFUSED Mult32 +Mult32: PUSH IX + LD IX,#0000 + LD A,#20 + EX DE,HL +.loop: ADD IX,IX + ADC HL,HL + RL E + RL D + JR NC,.no_add + ADD IX,BC + JR NC,no_add + INC HL +.no_add: DEC A + JR NZ,.loop + LD E,LX + LD D,HX + POP IX + RET + ENDIF ;----------------------------------------------------------------------; +;INPUT : DE * BC +;OUTPUT: HL:DE +Mult_16x16: LD IX,0 + LD HL,0 + ; + LD A,B + OR C + JR Z,.exit + ; +.loop: SRL B + RR C + JP NC,.no_add + ADD IX,DE + JR NC,.no_add + INC HL + ; +.no_add: LD A,B + OR C + JR Z,.exit + ; + SLA E + RL D + RL L + RL H + JP .loop + ; +.exit: LD D,XH + LD E,XL + RET /////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/SHELL/build.txt b/SHELL/build.txt index 272a458..194ba8c 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -316 \ No newline at end of file +320 \ No newline at end of file