diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 29f6a5a..de7bf5c 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -534,6 +534,12 @@ GET_BPB: LD HL,#0000 JP NC,.loop3 .loop3.end: ; LD (FatBuffer.BytesPerCluster),HL + ; LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ; AND A + ; SBC HL,DE + ; CCF + ; RET C ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) + ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD BC,0 LD A,H diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 49a4799..108e827 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -180,66 +180,85 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number -OPENDSK:;!TEST DRV.Open обход R10 - LD C,A - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - CP C - IF CHECK_DRIVE_CHANGE - JR NZ,.open - PUSH BC - LD C,Dss.DRV.MediaCheck - RST ToDSS.DRV - POP BC - ENDIF - JR Z,.exit +OPENDSK: ;!TEST DRV.Open обход R10 + LD C,A + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + CP C + IF CHECK_DRIVE_CHANGE + JR NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC + ENDIF + JR Z,.exit -.open: LD A,C - ; -.force: PUSH AF - LD C,Dss.DRV.Open - RST ToDSS.DRV - POP BC - JP C,.error - ;[x] 29/02/2024 fix "open drive error" - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) - LD D,A - PUSH DE - ; - LD A,B - LD (CORE_BUFFERS.FatBuffer.DRIVE),A - ; - CALL RD_BPB - ;[x] 29/02/2024 fix "open drive error" - POP DE - LD A,D - JR C,.error_disk - ; RET C - ; -.exit: LD A,(LDRIVE) - AND A - RET - ; -.error: CP DSS_Error.sys.INVALID_DRIVE - SCF - RET Z - LD A,DSS_Error.sys.NOT_READY - RET - ;[x] 29/02/2024 fix "open drive error" -.error_disk: - CALL OPENDSK.force - LD A,(BOOTDSK.NUM) - CALL C,OPENDSK.force - ; проверка на ошибку - LD HL,.NOT_READY - LD E, +(80-.NOT_READY.size)/2 ; coord X - LD BC,.NOT_READY.size - JP C,KERNEL_PANIC - ; - LD A,DSS_Error.sys.NOT_READY - SCF - RET - ; -.NOT_READY: DZ "Boot drive not ready..." +.open: LD A,C + ; +.force: PUSH AF + LD C,Dss.DRV.Open + RST ToDSS.DRV + POP BC + JP C,.error + ;[x] 29/02/2024 fix "open drive error" + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + LD D,A + PUSH DE + ; + LD A,B + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + ; + CALL RD_BPB + ;[x] 29/02/2024 fix "open drive error" + POP DE + JR C,.error_bpb + ; RET C + ; +.exit: LD A,(LDRIVE) + AND A + RET + ; +.error: CP DSS_Error.sys.INVALID_DRIVE + SCF + RET Z + LD A,DSS_Error.sys.NOT_READY + RET +;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed +.error_bpb: PUSH AF ; сохраняем номер ошибки + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + CP D + JR Z,.next_check + ; + LD A,D + CP #FF + SCF + JR Z,.set_panic + ; + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + CALL OPENDSK.force + LD A,(BOOTDSK.NUM) + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + CALL C,OPENDSK.force + ; +.err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) + ADD 'A' + LD (CORE_BUFFERS.CurrentPath),A + POP AF + RET + ; +.next_check: LD A,(BOOTDSK.NUM) + CP D + SCF +.reBPB: CALL NZ,OPENDSK.force + ; проверка на ошибку +.set_panic: LD HL,.NOT_READY + LD E, +(80-.NOT_READY.size)/2 ; coord X + LD BC,.NOT_READY.size + JR NC,.err_exit + JP KERNEL_PANIC + ; +.errorCycle: DB 0 +.NOT_READY: DZ "Boot drive error..." .NOT_READY.size EQU $-.NOT_READY ;----------------------------------------------------------------------; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index cebeac6..7dff503 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -547,6 +547,10 @@ LOADDIR: ;!TODO optimize RET ;----------------------------------------------------------------------; + +;!TODO FAT procedures +;----------------------------------------------------------------------; + LOAD_SAVE_DIR_PREPARE: ;!TODO optimize XOR A ; FILE MANIPULATOR = 0 @@ -571,7 +575,56 @@ LOAD_SAVE_DIR_PREPARE: EX AF,AF' RET -;!TODO FAT procedures +;----------------------------------------------------------------------; +; скопировать запись в список диска (каталога) de ix iy +; и сбросить кеш каталога на диск +; вход: (HANDBUF) - запись каталога +WRT_HND: SET_PAGE_X DIRPAGE + EX AF,AF' + LD HL,DIRPAGE.buffer + ;!TEST 9/11/23 record index + ; EXX + ; LD DE,0 + ; EXX + ; + LD BC,FAT_DIRECTORY_RECORD +.loop: ;LD A,(IX+00) + LD A,(HL) + OR A + JR Z,.WRT_HN2 + CP #E5 + JR Z,.WRT_HN2 + ;ADD IX,BC + ADD HL,BC + JR NC,.loop ;!FIXIT количество записей каталога = страница + ; + EX AF,AF' + OUT (SLOT3),A + LD A,DSS_Error.sys.ROOT_OVERFLOW + SCF + RET + ; +.WRT_HN2: ;LD D,XH + ;LD E,XL + EX DE,HL + LD HL,HANDBUF + LD BC,HANDBUF.SIZE + LDIR + EX AF,AF' + OUT (SLOT3),A + LD HL,DIRPAGE.buffer + LD BC,(SAVEDIR.DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + JR NC,SAVEDIR + LD HL,(SAVEDIR.DIRSIZE) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) + ADD HL,BC + LD (SAVEDIR.DIRSIZE),HL + AND A + ;JP SAVEDIR ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора @@ -619,62 +672,6 @@ SAVEDIR: ;!TODO optimize RET ;----------------------------------------------------------------------; - -;----------------------------------------------------------------------; -; скопировать запись в список диска (каталога) de ix iy -; и сбросить кеш каталога на диск -; вход: (HANDBUF) - запись каталога -WRT_HND: SET_PAGE_X DIRPAGE - EX AF,AF' - ; - ;LD IX,DIRPAGE.buffer - LD HL,DIRPAGE.buffer - ;!TEST 9/11/23 record index - ; EXX - ; LD DE,0 - ; EXX - ; - LD BC,FAT_DIRECTORY_RECORD -.loop: ;LD A,(IX+00) - LD A,(HL) - OR A - JR Z,.WRT_HN2 - CP #E5 - JR Z,.WRT_HN2 - ;ADD IX,BC - ADD HL,BC - JR NC,.loop ;!FIXIT количество записей каталога = страница - ; - EX AF,AF' - OUT (SLOT3),A - LD A,DSS_Error.sys.ROOT_OVERFLOW - SCF - RET -.WRT_HN2: - ;LD D,XH - ;LD E,XL - EX DE,HL - LD HL,HANDBUF - LD BC,HANDBUF.SIZE - LDIR - EX AF,AF' - OUT (SLOT3),A - LD HL,DIRPAGE.buffer - LD BC,(SAVEDIR.DIRSIZE) - DEC BC - ADD HL,BC - AND A - SBC HL,DE - JP NC,SAVEDIR - LD HL,(SAVEDIR.DIRSIZE) - LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) - ADD HL,BC - LD (SAVEDIR.DIRSIZE),HL - AND A - JP SAVEDIR -;----------------------------------------------------------------------; - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; [x] fat32 ;!TEST RD_BPB: ; LD C,SLOT3 @@ -811,6 +808,10 @@ RD_BPB: ; LD C,SLOT3 JP NC,.loop3 .loop3.end: ; LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL + ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO + ;AND A + ;SBC HL,DE + ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov) //////////////////////////////////////////////////////////////////////// ;!TODO не используется значения вычисляемые и сохраняемые в FatBuffer ; EX DE,HL diff --git a/DSS/defines.inc b/DSS/defines.inc index 03662e3..db6a0e6 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -14,7 +14,7 @@ ; MOUSE DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default) DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B -;DEFINE MOUSE_READ_PORT_TIMEOUT 3072 ; Костыльный тайм-аут на ожидание байта от мышки. Просто есть кривые переходники + DEFINE MOUSE_READ_PORT_TIMEOUT 16*1024 ; Костыльный тайм-аут на ожидание байта от мышки. ; KEYBOARD DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A diff --git a/DSS/drivers/Input/MOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM index 87506e2..64add82 100644 --- a/DSS/drivers/Input/MOUSE.ASM +++ b/DSS/drivers/Input/MOUSE.ASM @@ -7,6 +7,32 @@ PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data +//////////////////////////////////////////////////////////////////////// + MACRO READ_MOUSE_PACKET + IF MOUSE_INT_ENABLED + IN A,(PORT_MOUSE.Ctrl) + RRCA + RET NC + ELSE + ;[x] mouse freeeeezzzz + ;LD BC,MOUSE_READ_PORT_TIMEOUT + ; +.READ_BYTE: IN A,(PORT_MOUSE.Ctrl) + RRCA + ;[x] mouse freeeeezzzz + ;JR C,.NEXT + ;DEC BC + ;LD A,B + ;OR C + ;JR NZ,.READ_BYTE + ;RET + JR NC,.READ_BYTE +.NEXT: ; + ENDIF + ENDM +//////////////////////////////////////////////////////////////////////// + + ; MOUSE SOFTWARE SPECIFICATION ;--------------------------------------------- ; COMMAND 00h (INITIALIZATION) @@ -633,146 +659,179 @@ MOUSE: LD A,(MODE_M) ;----------------------------------------------------------------------; CLEAR_MOUSE_BUFFER: - IN A,(Z84.SIO.Ch_B.Data) - IN A,(Z84.SIO.Ch_B.Ctrl) - RRCA - JR C,CLEAR_MOUSE_BUFFER - SCF - RET + IN A,(Z84.SIO.Ch_B.Data) + IN A,(Z84.SIO.Ch_B.Ctrl) + RRCA + IF MOUSE_INT_ENABLED + JR C,CLEAR_MOUSE_BUFFER + ; + XOR A + LD (READ_M.Step),A + RET + ELSE + ;RET NC + ;JR CLEAR_MOUSE_BUFFER + JR C,CLEAR_MOUSE_BUFFER + SCF + RET + ENDIF ;----------------------------------------------------------------------; -READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера - ; reg 1 - LD A,1 - OUT (PORT_MOUSE.Ctrl),A - IN A,(PORT_MOUSE.Ctrl) - AND %0010'0000 ; check receiver overrun error - ; JP NZ,.Receiver_Overrun - JR Z,.READ_FIRST_BYTE - ; reg 0 - error reset - LD A,%0011'0000 - OUT (Z84.SIO.Ch_B.Ctrl),A - JP CLEAR_MOUSE_BUFFER +READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера + ; reg 1 + LD A,1 + OUT (PORT_MOUSE.Ctrl),A + IN A,(PORT_MOUSE.Ctrl) + AND %0010'0000 ; check receiver overrun error + IF MOUSE_INT_ENABLED + JR Z,.Prepare + ELSE + JR Z,.READ_FIRST_BYTE + ENDIF + ; reg 0 - error reset + LD A,%0011'0000 + OUT (Z84.SIO.Ch_B.Ctrl),A + ; reg 0 - return from int + ;LD A,%0011'1000 + ;OUT (Z84.SIO.Ch_B.Ctrl),A + ; + JR CLEAR_MOUSE_BUFFER + ; + IF MOUSE_INT_ENABLED +.Prepare: LD HL,.Step + LD A,(HL) + OR A + JR Z,.READ_FIRST_BYTE + DEC A + JR Z,.READ_SECOND_BYTE + DEC A + JR Z,.READ_THIRD_BYTE + XOR A + LD (HL),A + ENDIF .READ_FIRST_BYTE: - IN A,(PORT_MOUSE.Ctrl) - RRCA - RET NC - ; AND 1 - ; RET Z - - IN A,(PORT_MOUSE.Data) - LD L,A - AND %0100'0000 - ;BIT 6,A - ;CCF - RET Z - - ;[x] mouse freeeeezzzz - ;LD BC,MOUSE_READ_PORT_TIMEOUT - ; -.READ_SECOND_BYTE: - IN A,(PORT_MOUSE.Ctrl) - RRCA - ;[x] mouse freeeeezzzz - ;JR C,.NXT_1 - ;DEC BC - ;LD A,B - ;OR C - ;JR NZ,.TST_01 - ;RET - JR NC,.READ_SECOND_BYTE - ; - -;.NXT_1: - IN A,(PORT_MOUSE.Data) - LD E,A - AND %0100'0000 - ;CCF - RET NZ - - ;[x] mouse freeeeezzzz - ;LD BC,MOUSE_READ_PORT_TIMEOUT - ; -.READ_LAST_BYTE: - IN A,(PORT_MOUSE.Ctrl) - RRCA - ;[x] mouse freeeeezzzz - ;JR C,.NXT_2 - ;DEC BC - ;LD A,B - ;OR C - ;JR NZ,.READ_LAST_BYTE - ;RET - JR NC,.READ_LAST_BYTE - ; -;.NXT_2: - IN A,(PORT_MOUSE.Data) - LD D,A - ;BIT 6,A - AND %0100'0000 - ;CCF - RET NZ - ; все три байта пакета прочитаны - ; - LD A,E - AND #3F - LD E,A - LD A,L - AND #03 - RRCA - RRCA - OR E - LD E,A - LD A,D - AND #3F - LD D,A - LD A,L - AND #0C - RRCA - RRCA - RRCA - RRCA - OR D - LD D,A - LD A,L - RLCA - RLCA - RLCA - RES 6,A - JR NC,.STBU - SET 6,A -.STBU: RLCA - RLCA - AND #03 - LD (MOUSE_BUTTONS),A - CALL SENSE - LD (MOUSE_COORDINATES),DE - ; LD A,E - ; LD (MX),A - ; LD A,D - ; LD (MY),A - SCF - RET -;[ ] 14/03/2024 проверка на переполнение буфера -/* -.Receiver_Overrun: - ; empty the buffer - IN A,(Z84.SIO.Ch_B.Data) - IN A,(Z84.SIO.Ch_B.Ctrl) - RRCA - JR C,.Receiver_Overrun - ; reg 0 - error reset - LD A,%0011'0000 - OUT (Z84.SIO.Ch_B.Ctrl),A - ;!TEST - ; reg 0 - return from int - ; LD A,%0011'1000 - ; OUT (Z84.SIO.Ch_B.Ctrl),A - ; - RET -*/ + IN A,(PORT_MOUSE.Ctrl) + RRCA + RET NC + IN A,(PORT_MOUSE.Data) + IF MOUSE_INT_ENABLED + LD (.Reg_L),A + ELSE + LD L,A + ENDIF + AND %0100'0000 + ;RET Z + JP Z,CLEAR_MOUSE_BUFFER + ; + IF MOUSE_INT_ENABLED + INC (HL) + ENDIF + ; +.READ_SECOND_BYTE: + READ_MOUSE_PACKET + ; + IN A,(PORT_MOUSE.Data) + IF MOUSE_INT_ENABLED + LD (.Reg_E),A + AND %0100'0000 + JR Z,.nxt1 + LD (HL),0 + JR .READ_FIRST_BYTE +.nxt1: ; + INC (HL) + ELSE + LD E,A + AND %0100'0000 + ;!TEST + RET NZ + ;JR Z,.READ_THIRD_BYTE + ;LD L,E + ;JR .READ_SECOND_BYTE + ENDIF + ; +.READ_THIRD_BYTE: + READ_MOUSE_PACKET + ; + IN A,(PORT_MOUSE.Data) + IF MOUSE_INT_ENABLED + LD (.Reg_D),A + AND %0100'0000 + JR Z,.nxt2 + LD (HL),0 + JR .READ_FIRST_BYTE +.nxt2: ; + LD (HL),0 + LD DE,(.Reg_E) + LD HL,(.Reg_L) + ELSE + LD D,A + AND %0100'0000 + ;!TEST + RET NZ + ;JR Z,.packet_end + ;LD L,D + ;JR .READ_SECOND_BYTE +.packet_end: ; + ENDIF + ; + ; все три байта пакета прочитаны + ; + LD A,E + AND #3F + LD E,A + LD A,L + AND #03 + RRCA + RRCA + OR E + LD E,A + LD A,D + AND #3F + LD D,A + LD A,L + AND #0C + RRCA + RRCA + RRCA + RRCA + OR D + LD D,A + ; +; LD A,L +; RLCA +; RLCA +; RLCA +; RES 6,A +; JR NC,.STBU +; SET 6,A +; .STBU: RLCA +; RLCA +; AND #03 + LD A,L + AND #30 + RRCA + RRCA + RRCA + RRCA + ; + LD (MOUSE_BUTTONS),A + CALL SENSE + LD (MOUSE_COORDINATES),DE + ; LD A,E + ; LD (MX),A + ; LD A,D + ; LD (MY),A + SCF + RET + ; + IF MOUSE_INT_ENABLED +.Reg_L: DB 0 +.Reg_E: DB 0 +.Reg_D: DB 0 +.Step: DB 0 + ENDIF MCORECT: LD HL,(PIX_X) diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM index b1268e3..20f168c 100644 --- a/SHELL/Commands/CHDIR.ASM +++ b/SHELL/Commands/CHDIR.ASM @@ -21,7 +21,7 @@ cmd_chdir: dec hl .chdir: ld c,Dss.ChDir ; сменить тек. каталог RST ToDSS - jp c,print_err_message ; вывод сообщения + call c,print_err_message ; вывод сообщения jp Get_Path ; сохр. тек. диск и путь ; ; вывод сист. пути на экран ; ld c,8Eh ; узнать полож. курсора diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index cd4c2ff..606d367 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -304,16 +304,10 @@ Print_Header: ; %1 ld bc,16+16+16-1-2 ldir ; - ld hl,Buffers.work.free + 256 + 128 ; сист. путь - ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер + ld hl,Buffers.work.free + 256 + 128; сист. путь + ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер call make_short_path - ;pop hl - - ; ld hl,Buffers.screen_path ; !FIXIT если ввести "DIR gamez\*.*", то отображаемый путь в заголовке будет неверным - ; ld de,PRM3 ;+PRM4 ; 32 байта буфер - ; CALL copy_string ; скопир. строку (с нулем) - ; - ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." + ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." JP ECHO_MESSAGE ; вывести строку ; diff --git a/SHELL/build.txt b/SHELL/build.txt index 7b89b22..009bd2c 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -406 \ No newline at end of file +407 \ No newline at end of file