From 23fa77a8b9364e122028de3d9ba781d1827e41d0 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Mar 2024 03:32:06 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20(=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=20=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20XLAT=5FT).=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20ctrl+c=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Ex_Path.asm | 2 +- DSS/API/Execute.ASM | 8 +- DSS/DSS_MACROSES.Z80 | 176 +++++----- DSS/FS/FAT/FAT.asm | 10 +- DSS/FS/FAT/FAT_X.asm | 259 ++++++++------ DSS/KEYINTER.ASM | 626 ++++++++++++++++++++++------------ DSS/Media_drivers/ide-drv.asm | 4 +- DSS/build.txt | 2 +- DSS/defines.inc | 9 +- SHELL/Commands/DIR.ASM | 2 +- SHELL/EXEC.ASM | 4 +- SHELL/Procedures/Print.ASM | 2 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 14 files changed, 681 insertions(+), 427 deletions(-) diff --git a/DSS/API/Ex_Path.asm b/DSS/API/Ex_Path.asm index 6545b4c..aab7a8b 100644 --- a/DSS/API/Ex_Path.asm +++ b/DSS/API/Ex_Path.asm @@ -10,7 +10,7 @@ ; 3 - Выделить имя файла ; 4 - Выделить расширение файла ; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла -; 6 - Зарезервировано +; 6 - Зарезервировано ;!TODO преобразовать относительный путь в полный ; [ ] ; 7 - Выделить параметр командной строки ; 8 - Преобразовать из 11 символьного формата в формат ДОС ; 9 - Преобразовать из формата ДОС в 11 символьный формат diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM index 1dbefd2..fa52f6e 100644 --- a/DSS/API/Execute.ASM +++ b/DSS/API/Execute.ASM @@ -565,11 +565,13 @@ LEAVE: LD A,B LD A,(ErrorLevel) ;R12 CP DSS_Error.sys.UNEXPECTED_APP_TRMN - JR NZ,.exit - SCF + JR Z,.error_exit + CP DSS_Error.sys.USER_ABORT + JR NZ,.norm_exit +.error_exit: SCF JP (HL) ; -.exit: AND A +.norm_exit: AND A JP (HL) ;///////////////////////////////////////////////////////////////////// diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 index b495a90..7589bb9 100644 --- a/DSS/DSS_MACROSES.Z80 +++ b/DSS/DSS_MACROSES.Z80 @@ -1,101 +1,101 @@ ; - MACRO BUFFER_KEYINTER - _mInfoALIGN 256,0 -;KEYBOARD BUFFER -SBUF: BLOCK 64,0 +; MACRO BUFFER_KEYINTER +; _mInfoALIGN 256,0 +; ;KEYBOARD BUFFER +; SBUF: BLOCK 64,0 -HEAD DB #00 -HOST DB #00 +; HEAD DB #00 +; HOST DB #00 -K_LOCK EQU $-KEYFLAG -LANG_L EQU 7 -PAUSE_L EQU 6 -RES5_L EQU 5 -RES4_L EQU 4 -NUM_L EQU 3 -SCRL_L EQU 2 -INS_L EQU 1 -CAPS_L EQU 0 -KEYFLAG DB #02 ;D0-Key Pressed +; K_LOCK EQU $-KEYFLAG +; LANG_L EQU 7 +; PAUSE_L EQU 6 +; RES5_L EQU 5 +; RES4_L EQU 4 +; NUM_L EQU 3 +; SCRL_L EQU 2 +; INS_L EQU 1 +; CAPS_L EQU 0 +; KEYFLAG DB #02 ;D0-Key Pressed -K_SHIFT EQU $-KEYFLAG -L_SHIFT EQU 7 -R_SHIFT EQU 6 -X_CTRL EQU 5 -X_ALT EQU 4 -L_CTRL EQU 3 -L_ALT EQU 2 -R_CTRL EQU 1 -R_ALT EQU 0 -KEYCTRL DB #00 +; K_SHIFT EQU $-KEYFLAG +; L_SHIFT EQU 7 +; R_SHIFT EQU 6 +; X_CTRL EQU 5 +; X_ALT EQU 4 +; L_CTRL EQU 3 +; L_ALT EQU 2 +; R_CTRL EQU 1 +; R_ALT EQU 0 +; KEYCTRL DB #00 -KEYFLG EQU $-KEYFLAG -FLAG_E0 EQU 7 -FLAG_F0 EQU 6 -FLAG_E1 EQU 5 -FLAG_04 EQU 4 -FLAG_03 EQU 3 -FLAG_02 EQU 2 -FLAG_01 EQU 1 -FLAG_00 EQU 0 - DB #00 +; KEYFLG EQU $-KEYFLAG +; FLAG_E0 EQU 7 +; FLAG_F0 EQU 6 +; FLAG_E1 EQU 5 +; FLAG_04 EQU 4 +; FLAG_03 EQU 3 +; FLAG_02 EQU 2 +; FLAG_01 EQU 1 +; FLAG_00 EQU 0 +; DB #00 -SOUND_K EQU $-KEYFLAG -FLAG_S7 EQU 7 -FLAG_S6 EQU 6 -FLAG_S5 EQU 5 -FLAG_S4 EQU 4 -FLAG_S3 EQU 3 -FLAG_S2 EQU 2 -SF_ALT EQU 1 -SF_BUFF EQU 0 - DB #03 -; -; D15 - LShift -; D14 - RShift -; D13 - CTRL -; D12 - ALT -; D11 - LCTRL -; D10 - LALT -; D9 - RCTRL -; D8 - RALT -; D7 - Language Lock -; D6 - Reserved -; D5 - Reserved -; D4 - Reserved -; D3 - Num Lock -; D2 - Scroll Lock -; D1 - Insert Lock -; D0 - Caps Lock -; -; D15 - Keystroke -; D14 -; D13 \ -; D12 \ -; D11 -- Position code (0...5Ah) -; D10 / -; D9 / -; D8 -; D7..D0 - ASCII code -; - ENDM +; SOUND_K EQU $-KEYFLAG +; FLAG_S7 EQU 7 +; FLAG_S6 EQU 6 +; FLAG_S5 EQU 5 +; FLAG_S4 EQU 4 +; FLAG_S3 EQU 3 +; FLAG_S2 EQU 2 +; SF_ALT EQU 1 +; SF_BUFF EQU 0 +; DB #03 +; ; +; ; D15 - LShift +; ; D14 - RShift +; ; D13 - CTRL +; ; D12 - ALT +; ; D11 - LCTRL +; ; D10 - LALT +; ; D9 - RCTRL +; ; D8 - RALT +; ; D7 - Language Lock +; ; D6 - Reserved +; ; D5 - Reserved +; ; D4 - Reserved +; ; D3 - Num Lock +; ; D2 - Scroll Lock +; ; D1 - Insert Lock +; ; D0 - Caps Lock +; ; +; ; D15 - Keystroke +; ; D14 +; ; D13 \ +; ; D12 \ +; ; D11 -- Position code (0...5Ah) +; ; D10 / +; ; D9 / +; ; D8 +; ; D7..D0 - ASCII code +; ; +; ENDM ; ; - MACRO TABLE_XLAT_T - _mInfoALIGN 256,0 -; 0 1 2 3 4 5 6 7 8 9 A B C D E F -XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 - DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 - DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 - DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 - DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 - DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 - DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 - DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 - DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 - ENDM +; MACRO TABLE_XLAT_T +; _mInfoALIGN 256,0 +; ; 0 1 2 3 4 5 6 7 8 9 A B C D E F +; XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 +; DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 +; DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 +; DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 +; DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 +; DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 +; DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 +; DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 +; DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 +; ENDM ; ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 97ae971..138799a 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -432,6 +432,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ;----------------------------------------------------------------------; ; Сбросить кеш каталога на диск. ; вход: iy=структура дескриптора +; [ ] fat32 SAVEDIR: XOR A LD HL,0 @@ -529,12 +530,17 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 ;!FIXIT - LD DE,0 + XOR A + LD D,A + LD E,A LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 + LD (FatBuffer.SectorsPerFAT_H),A ; ; LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) + LD (FatBuffer.SectorsPerFAT_L),DE + ; LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs CP 1 JR Z,.loop1 @@ -751,6 +757,8 @@ FatBuffer: .FAT1_SEC_H: DW #0000 ; [ ] fat32 .FAT2_SEC_L: DW #0000 .FAT2_SEC_H: DW #0000 ; [ ] fat32 +.SectorsPerFAT_L DW #0000 +.SectorsPerFAT_H DB #00 .RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR .FilesPerSector: DB #00 ; число файловых записей в секторе diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 81d28ea..b4f8a44 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -349,22 +349,39 @@ WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ; in: HL - Cache block ; out: C:HL - logical number +; B = 0 +; [x] fat32 ;!TEST GET_SECTOR_OF_FAT: - XOR A - LD B,A - LD C,A - DUP FAT_CACHE.Degree ; 4 - ADD HL,HL ;x2 - ADC A,C - EDUP - LD C,A LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 - RET NZ - ADD HL,HL ;x2 - RET NC - INC C + LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную + XOR FAT_TYPE.x32 + JR Z,.next + LD B,FAT_CACHE.Degree ;!FIXIT сделать через переменную + XOR A +.next: LD C,A + ; +.loop: ADD HL,HL ;x2 + ADC A,C + DJNZ .loop + ; + LD C,A RET +; GET_SECTOR_OF_FAT: +; XOR A +; LD B,A +; LD C,A +; DUP FAT_CACHE.Degree ; 4 +; ADD HL,HL ;x2 +; ADC A,C +; EDUP +; LD C,A +; LD A,(FatBuffer.FAT_TYPE) +; CP FAT_TYPE.x32 +; RET NZ +; ADD HL,HL ;x2 +; RET NC +; INC C +; RET ;;;;;;;;; @@ -385,23 +402,23 @@ READ_FAT_TABLE: PUSH HL ; CALL GET_SECTOR_OF_FAT ; + ; BC:HL - номер лог.сектора LD DE,(FatBuffer.FAT1_SEC_L) - ; BC:HL - номер лог. сектора ADD HL,DE EX DE,HL LD XH,D LD XL,E LD HL,(FatBuffer.FAT1_SEC_H) - JR NC,.no_inc - INC HL -.no_inc: ADD HL,BC + ; JR NC,.no_inc + ; INC HL +.no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING LD A,(FatBuffer.FAT_TYPE) - CP FAT_TYPE.x32 + XOR FAT_TYPE.x32 LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE - JR NZ,.nxt + JR NZ,.next LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE -.nxt: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS +.next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска RST ToDSS.DRV POP HL @@ -409,83 +426,121 @@ READ_FAT_TABLE: PUSH HL ; Подключить банку кеша FAT и записать его на диск -; [ ] fat32 +; [x] fat32 ;!TEST WRITE_FAT_TABLE: - SET_PAGE_X FATPAGE - PUSH AF - CALL .Start ;!TODO нет контроля ошибок - POP AF - OUT (SLOT3),A - RET - ; Запись кеша FAT-а на диск -.Start: LD HL,(FatBuffer.CacheBlock) - ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT - CALL GET_SECTOR_OF_FAT - ; BC:HL - номер лог. сектора - ; [ ] fat32 ;!FIXIT - LD B,H - LD C,L - ; [ ] fat32 - LD DE,FAT_CACHE.Sectors_16 - ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш - LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT - AND A - SBC HL,DE - JR C,.WALLFAT - ; - EX DE,HL - LD HL,FAT_CACHE.Sectors_16 - ; CF = 0 - SBC HL,DE - JR C,.ERR ;!TODO проверить - LD A,L -.WALLFAT: - LD H,B - LD L,C - PUSH HL - LD DE,(FatBuffer.FAT1_SEC_L) - LD B,A ; число секторов - LD C,Dss.DRV.Write ; запись секторов - PUSH BC - ; сохраняем первую копию FAT - CALL .SAVE_FAT_XX - ; [ ] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 - LD DE,(FatBuffer.FAT2_SEC_L) - LD HL,(FatBuffer.FAT1_SEC_L) - AND A - SBC HL,DE - POP BC ; b=число секторов - POP HL - JR Z,.only_one_FAT - ; - ; сохраняем вторую копию FAT - CALL .SAVE_FAT_XX - AND A ;!TODO нет контроля ошибок -.only_one_FAT: -.ERR: LD A,0 - LD (FatBuffer.CacheUpdated),A - RET - ; -.SAVE_FAT_XX: - ADD HL,DE - EX DE,HL - ; номер лог. сектора - ;LD IX,0 - ;ADD IX,DE - LD XH,D - LD XL,E - ; - LD HL,0 ; ст. разряд - ; CF = ADD HL,DE - ; [ ] fat32 - вторая таблица фат может же уехать дальше 16-бит логического сектора? - IF _FAT32_ENABLE - RL L - ENDIF - ;HL:IX - SECTOR OF FAT FOR SAVE - LD DE,FATPAGE.cache ; откуда - LD A,(FatBuffer.DRIVE) ; номер диска - JP ToDSS.DRV + SET_PAGE_X FATPAGE + PUSH AF + CALL .Start ;!TODO нет контроля ошибок + POP AF + OUT (SLOT3),A + RET + ; Запись кеша FAT-а на диск +.Start: LD HL,(FatBuffer.CacheBlock) + ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT + CALL GET_SECTOR_OF_FAT + ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока + ; [x] fat32 ;!FIXIT + LD (.save_hl),HL + ;LD B,H + ;LD C,L + ; + LD DE,FAT_CACHE.Sectors_32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR Z,.next + LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде + ; +.next: ADD HL,DE ;+ SIZE CASH (16 SECTORS) + JR NC,.no_inc + INC C + ; + ; C:HL смещение в секторах внутри таблицы FAT на конец блока + ; +.no_inc: ; конец блока выходит за пределы таблицы? + LD B,E ; MAX число секторов для чтения в кэш + LD A,(FatBuffer.SectorsPerFAT_H) + LD (.sub_A),A + ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT + LD DE,(FatBuffer.SectorsPerFAT_L) + AND A + LD A,C + SBC HL,DE +.sub_A+1: SBC A,0 + JR C,.WALLFAT ; СF=1: не выходит + OR A + JR NZ,.ERR + ; + EX DE,HL + ; DE - на сколько секторов конец блока выходит за пределы таблицы. + LD HL,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде + ; CF = 0 + SBC HL,DE + ;SBC A,0 + JR C,.ERR ;!TODO проверить + LD B,L ; число секторов для чтения в кэш +.WALLFAT: ; +.save_hl+1: LD HL,0 + ;LD H,B + ;LD L,C + ;PUSH HL + ; + ; B = число секторов + LD IX,(FatBuffer.FAT1_SEC_H) + LD DE,(FatBuffer.FAT1_SEC_L) + ;LD B,A + ;LD C,Dss.DRV.Write ; запись секторов + PUSH BC + ; + ; сохраняем первую копию FAT. Вход IX:DE - начало таблицы FAT + ; C:HL - смещение внутри таблицы + ; B - количество секторов + CALL .SAVE_FAT_XX + ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 + POP BC ; B = число секторов, C = старший байт смещения в секторах + LD HL,(FatBuffer.FAT1_SEC_H) + LD DE,(FatBuffer.FAT2_SEC_H) + AND A + SBC HL,DE + JR NZ,.not_one_FAT + LD HL,(FatBuffer.FAT2_SEC_L) + LD DE,(FatBuffer.FAT1_SEC_L) + ; CF = 0 + SBC HL,DE + JR Z,.only_one_FAT + ; + ; сохраняем вторую копию FAT +.not_one_FAT: LD IX,(FatBuffer.FAT2_SEC_H) + LD DE,(FatBuffer.FAT2_SEC_L) + LD HL,(.save_hl) + CALL .SAVE_FAT_XX + AND A ;!TODO нет контроля ошибок +.only_one_FAT: ; +.ERR: LD A,0 + LD (FatBuffer.CacheUpdated),A + RET + ; Вход: IX:DE - начало таблицы FAT в секторах + ; C:HL - смещение в таблице в секторах + ; B - количество секторов +.SAVE_FAT_XX: ADD HL,DE + ;EX DE,HL + JR NC,.no_inc_C + INC C + ; номер лог. сектора +.no_inc_C: LD D,0 + LD E,C + ADD IX,DE + LD D,XH + LD E,XL + EX DE,HL + ; LD H,0 + ; LD L,C + LD XH,D + LD XL,E + ; HL:IX - смещение внутри раздела на начало нужного блока FAT + LD DE,FATPAGE.cache ; откуда + LD A,(FatBuffer.DRIVE) ; номер диска + LD C,Dss.DRV.Write + JP ToDSS.DRV ;----------------------------------------------------------------------- ;вход: HL':HL - номер кластера @@ -590,7 +645,7 @@ GET_FAT12_CELL: AND #07 ;AND FAT_CACHE.Part_Mask_16 ; - ; [ ] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался + ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH @@ -611,7 +666,7 @@ GET_FAT12_CELL: ;NSECTOR: ; in: HL':HL - CLUSTER ; out: HL:IX - SECTOR -;[ ] fat32 +;[x] fat32 ;!TEST CLUSTER_TO_SECTOR: EXX PUSH HL @@ -747,6 +802,7 @@ BLOCK_READ: PUSH BC LD C,Dss.DRV.Read RST ToDSS.DRV JR C,.Error + ; [ ] fat32 ??? POP BC LD HL,(READ.PointerOnBuffer) LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) @@ -952,6 +1008,7 @@ BLOK_WR: PUSH BC LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV + LD A,DSS_Error.sys.WRITE_ERROR JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) @@ -999,6 +1056,7 @@ BLOK_WR: PUSH BC LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV + LD A,DSS_Error.sys.WRITE_ERROR JR C,.ErrorWrite POP BC LD HL,(READ.PointerOnBuffer) @@ -1013,11 +1071,11 @@ BLOK_WR: PUSH BC ; .Error_6: POP BC POP BC -.Error_4: POP BC + POP BC POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE .ErrorWrite: POP BC POP DE - LD A,DSS_Error.sys.WRITE_ERROR + ;LD A,DSS_Error.sys.WRITE_ERROR ;SCF RET ; @@ -1084,6 +1142,7 @@ BLOK_WR: PUSH BC ; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1) ; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1) ; не портит HL, HL' и DE:BC если оптимизация не сработала +;[ ] fat32 GetSavedCluster: XOR A CP (IY+_sFM.OptimizedClusters) diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM index b9e4b70..290ad13 100644 --- a/DSS/KEYINTER.ASM +++ b/DSS/KEYINTER.ASM @@ -1,64 +1,84 @@ ;[BEGIN] -;//MODULE: KEYINTER +;//MODULE: KEYINTER Keyboard Scan Codes: Set 2 ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;------------------------------------------------ ;R02 13-04-2023 BAO FIX BUG IN K_CLEAR WITH STACK OVERFLOW ;R01 10-02-2003 DNS Add cursor visualisation ; - _mInfoALIGN 256,0 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;KEYBOARD BUFFER -SBUF: BLOCK 64,0 + _mInfoALIGN 256,0 +SBUF: BLOCK 64,0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -HEAD DB #00 -HOST DB #00 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; _mInfoALIGN 256,0 ;; +; 0 1 2 3 4 5 6 7 8 9 A B C D E F ;; +XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ;; + DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 ;; + DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 ;; + DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 ;; + DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 ;; + DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 ;; + DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 ;; + DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 ;; + DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 ;; +.Size EQU $-XLAT_T ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -K_LOCK EQU $-KEYFLAG -LANG_L EQU 7 -PAUSE_L EQU 6 -LANG_R EQU 5 ; сочетание клавиш для переключения языка отжато -LANG_S EQU 4 ; сочетание клавиш для переключения языка нажато -NUM_L EQU 3 -SCRL_L EQU 2 -INS_L EQU 1 -CAPS_L EQU 0 -KEYFLAG DB #02 ;D0-Key Pressed - -K_SHIFT EQU $-KEYFLAG -L_SHIFT EQU 7 -R_SHIFT EQU 6 -X_CTRL EQU 5 -X_ALT EQU 4 -L_CTRL EQU 3 -L_ALT EQU 2 -R_CTRL EQU 1 -R_ALT EQU 0 -KEYCTRL DB #00 - -KEYFLG EQU $-KEYFLAG -FLAG_E0 EQU 7 -FLAG_F0 EQU 6 -FLAG_E1 EQU 5 -FLAG_04 EQU 4 -FLAG_03 EQU 3 -FLAG_02 EQU 2 -FLAG_01 EQU 1 -FLAG_00 EQU 0 - DB #00 - -SOUND_K EQU $-KEYFLAG -FLAG_S7 EQU 7 -FLAG_S6 EQU 6 -FLAG_S5 EQU 5 -FLAG_S4 EQU 4 -FLAG_S3 EQU 3 -FLAG_S2 EQU 2 -SF_ALT EQU 1 -SF_BUFF EQU 0 - DB #03 -UNCODE DW 0 ; последняя отжатая клавиша +HEAD DB #00 +HOST DB #00 +; +K_LOCK EQU $-KEYFLAG +LANG_L EQU 7 +PAUSE_L EQU 6 +RES5_L EQU 5 ; not used ;X_SHIFT +RES4_L EQU 4 ; not used +NUM_L EQU 3 +SCRL_L EQU 2 +INS_L EQU 1 +CAPS_L EQU 0 +KEYFLAG DB #02 ;D0-Key Pressed +; +K_SHIFT EQU $-KEYFLAG +L_SHIFT EQU 7 +R_SHIFT EQU 6 +X_CTRL EQU 5 +X_ALT EQU 4 +L_CTRL EQU 3 +L_ALT EQU 2 +R_CTRL EQU 1 +R_ALT EQU 0 +KEYCTRL DB #00 +; +KEYFLG EQU $-KEYFLAG +FLAG_E0 EQU 7 +FLAG_F0 EQU 6 +FLAG_E1 EQU 5 +FLAG_04 EQU 4 +FLAG_03 EQU 3 +FLAG_02 EQU 2 +FLAG_01 EQU 1 +CTRL_SHIFT EQU 0 ; ctrl+shift = change language +KEY_FLG DB #00 +; +SOUND_K EQU $-KEYFLAG +FLAG_S7 EQU 7 +FLAG_S6 EQU 6 +FLAG_S5 EQU 5 +FLAG_S4 EQU 4 +FLAG_S3 EQU 3 +FLAG_S2 EQU 2 +SF_ALT EQU 1 +SF_BUFF EQU 0 + DB #03 +; +UnCODE EQU $-KEYFLAG +UNCODE DW 0 ; последняя отжатая клавиша ; D15 - LShift ; D14 - RShift @@ -69,7 +89,7 @@ UNCODE DW 0 ; ; D9 - RCTRL ; D8 - RALT ; D7 - Language Lock -; D6 - Reserved +; D6 - Pause Lock ; D5 - Reserved ; D4 - Reserved ; D3 - Num Lock @@ -188,36 +208,35 @@ ECHOKEY: CALL Cursor_On ; RET Cursor: -.Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть - CPL - LD (.Flag),A +.Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть + CPL + LD (.Flag),A ; Включить курсор -Cursor_On: LD C,BIOS.LP_GET_PLACE ; узнать полож. курсора - RST ToBIOS - LD (Cursor_Off.pos),DE - XOR A - LD C,BIOS.WIN_GET_SYM ; получить символ - RST ToBIOS - LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран - LD A,(Cursor.Flag) - OR A - JR Z,.put - LD B,CURSOR_ZG ; черта - LD A,(KEYFLAG) ; флаги клавы - ;BIT 1,A ; бит Ins - AND %0000'0010 ; бит Ins - JR NZ,.put - LD B,INS_CUR_ZG ; блок -.put: XOR A ; номер окна - RST ToBIOS - +Cursor_On: LD C,BIOS.LP_GET_PLACE ; узнать полож. курсора + RST ToBIOS + LD (Cursor_Off.pos),DE + XOR A + LD C,BIOS.WIN_GET_SYM ; получить символ + RST ToBIOS + LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран + LD A,(Cursor.Flag) + OR A + JR Z,.put_ + LD B,INS_CUR_ZG ; блок + LD A,(KEYFLAG) ; флаги клавы + AND 1<