From 43b8683575879d245e0045529954210221a6e814 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 26 Jan 2024 00:44:27 +1000 Subject: [PATCH] Core: fixed error in EXEC, SYSTIME. Shell: CMD_DATE - printing day of week --- DSS/API/Time.asm | 67 +++++--- DSS/DOS_Proc.asm | 4 +- DSS/EXECUTE.ASM | 4 +- DSS/FS/FAT/FAT.asm | 7 +- DSS/Procedures.asm | 310 +++++++++++++++++++++++++----------- DSS/build.txt | 2 +- SHELL/BATCH.ASM | 2 +- SHELL/Commands/DATE.ASM | 59 ++++--- SHELL/Commands/DIR.ASM | 4 +- SHELL/Commands/ECHO.ASM | 4 +- SHELL/EXEC.ASM | 45 +++--- SHELL/Messages/main_txt.asm | 2 +- SHELL/Procedures/math.asm | 2 +- SHELL/SHELL.ASM | 63 ++++---- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 16 files changed, 373 insertions(+), 206 deletions(-) diff --git a/DSS/API/Time.asm b/DSS/API/Time.asm index 0d0813a..d5ca9b6 100644 --- a/DSS/API/Time.asm +++ b/DSS/API/Time.asm @@ -14,35 +14,35 @@ SYSTIME: LD C,BIOS.CMOS_TEST RST ToBIOS JP C,.NOCMOS - LD D,7 ;DAY + LD D,CMOS.Register.date CALL RCMOS PUSH AF - LD D,8 ;MONTH + LD D,CMOS.Register.month CALL RCMOS POP DE LD E,A PUSH DE - LD D,4 ;HOUR + LD D,CMOS.Register.hours CALL RCMOS PUSH AF - LD D,2 ;MINUTE + LD D,CMOS.Register.minutes CALL RCMOS POP DE LD E,A PUSH DE - LD D,0 ;SECOND + LD D,CMOS.Register.seconds CALL RCMOS PUSH AF - LD D,6 ;WEEK DAY + LD D,CMOS.Register.dayOfWeek LD C,BIOS.CMOS_RD RST ToBIOS POP DE LD E,A PUSH DE - LD D,9 ;YEAR + LD D,CMOS.Register.year CALL RCMOS ;READ AND CONVERT TO DECIMAL PUSH AF - LD D,#32 ;CENTURY + LD D,CMOS.Register.century LD C,BIOS.CMOS_RD RST ToBIOS LD XH,A @@ -61,7 +61,7 @@ SYSTIME: JR Z,.GOODAGE .BADAGE: PUSH AF - LD D,#32 ;CENTURY + LD D,CMOS.Register.century LD C,BIOS.CMOS_WR RST ToBIOS POP AF @@ -122,34 +122,47 @@ SETTIME: PUSH BC PUSH HL PUSH DE + ; + ; [ ] 25/01/2024 + CALL CalcDayOfWeek + PUSH HL + ; LD C,BIOS.CMOS_TEST RST ToBIOS - JP C,.NOCMOS2 + JR C,.NOCMOS2 + ; + ; [ ] 25/01/2024 + POP AF + LD D,CMOS.Register.dayOfWeek + LD C,BIOS.CMOS_WR + RST ToBIOS + ; POP AF PUSH AF - LD D,7 ;DAY + LD D,CMOS.Register.date CALL WCMOS POP BC LD A,C - LD D,8 ;MONTH + LD D,CMOS.Register.month CALL WCMOS POP AF PUSH AF - LD D,4 ;HOUR + LD D,CMOS.Register.hours CALL WCMOS POP BC LD A,C - LD D,2 ;MINUTE + LD D,CMOS.Register.minutes CALL WCMOS POP AF - PUSH AF - LD D,0 ;SECOND + ;PUSH AF ; [ ] баг с установкой дня недели из регистра C. Нашел Hard + LD D,CMOS.Register.seconds CALL WCMOS - POP BC - LD A,C - LD D,6 ;WEEK DAY - LD C,BIOS.CMOS_WR - RST ToBIOS + ; [ ] баг с установкой дня недели из регистра C. Нашел Hard + ;POP BC + ;LD A,C + ;LD D,CMOS.Register.dayOfWeek + ;LD C,BIOS.CMOS_WR + ;RST ToBIOS ; POP HL XOR A @@ -160,17 +173,23 @@ SETTIME: ADD HL,DE DEC A PUSH HL - LD D,#32 ;CENTURY + LD D,CMOS.Register.century CALL WCMOS POP BC LD A,C - LD D,9 ;YEAR + LD D,CMOS.Register.year CALL WCMOS AND A RET ; !FIXIT новый биос выставляет время, если с ним что-то не так. .NOCMOS2: - LD C,0 + POP AF + POP DE + POP HL + POP BC + POP IX + LD C,A + ; LD (SYSTIME.NC_DAY),DE ;DAY/MONTH LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 07c1f41..a3185ca 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -303,10 +303,10 @@ OPENDIR:;!TEST ;[x] some optimize LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL EX DE,HL ; - CALL LOADDIR + JP LOADDIR ; CF=0 ;AND A - RET + ;RET ;----------------------------------------------------------------------; diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index f566f87..618662b 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -858,6 +858,7 @@ EXEC: LD (CMDLINE),HL ;LD HL,(CMDLINE) JR C,EXEC0_SHORT .VAR_2: CALL EXEC_1 + ;LD A,DSS_Error.sys.FILE_NOT_FOUND SCF RET ; File not found - exit @@ -873,7 +874,7 @@ EXEC_1: ;LD (CMDLINE),HL CALL MASK RET C CALL TST_EXT - LD A,DSS_Error.sys.FILE_NOT_FOUND + ;LD A,DSS_Error.sys.FILE_NOT_FOUND RET C _mINCTASK ;R08 CALL OPEN_FN.FILE @@ -914,6 +915,7 @@ COPYEXN: LD A,(HL) CALL FINDPATH ;[x] 1/10/2023 + LD A,DSS_Error.sys.FILE_NOT_FOUND RET C ; LD HL,(CMDLINE) diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 3778428..fe65b7c 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -327,7 +327,7 @@ LOADDIR: CALL MOVE_FP SET_PAGE_X DIRPAGE - + AND A PUSH AF ;!TEST no ldir ; очистить кеш каталога @@ -349,11 +349,9 @@ LOADDIR: LD DE,#4000 ; сколько XOR A ; дескриптор CALL READ ; чтение из файла - ;!FIXIT проверка на ошибку LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A - AND A RET .LROTDIR: LD HL,(FatBuffer.DIR_FRH) ; ст. разряд @@ -376,7 +374,6 @@ LOADDIR: RST ToDSS.DRV POP AF OUT (SLOT3),A - AND A RET ;----------------------------------------------------------------------; @@ -650,7 +647,7 @@ RD_BPB: LD C,SLOT3 LD (FatBuffer.CLU_LEN),HL EX DE,HL - LD HL,#3FFF ;!TODO FATcacheSize + LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize XOR A ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится .loop4: INC A diff --git a/DSS/Procedures.asm b/DSS/Procedures.asm index 92310fd..e12fa42 100644 --- a/DSS/Procedures.asm +++ b/DSS/Procedures.asm @@ -101,6 +101,110 @@ RMKTIME: ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; [ ] 25/01/2024 +; вход: D - день +; E - месяц +; IX - год +; выход: H - день недели (1 - воскресенье) +CalcDayOfWeek: ;!FIXIT вычислять день недели + ; x = (14 ? месяц) / 12 + ; y = год ? x + ; m = месяц + 12 * x ? 2 + ; ДеньНедели = (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 + ; Все деления целочисленные (остаток отбрасывается). + ; + LD A,D + LD (.day),A + ; x = (14 ? месяц) / 12 + ; y = год ? x + LD A,E + CP 3 + LD A,0 + JR NC,1F + DEC IX + LD A,12 +1: ; y = IX + ; m = месяц + 12 * x ? 2 + ADD E + SUB 2 + ; m = A + ; HL = (31 * m) + LD D,0 + LD E,A + RLA + RLA + RLA + LD H,D + LD L,A + ADD HL,HL + ADD HL,HL + SBC HL,DE + ; (31 * m) = HL + ; BC = (31 * m) / 12 + LD B,H + LD C,L + ; D=0 + LD E,12 + CALL BC_Div_DE + ; (31 * m) / 12 = BC + LD (.m31_12),BC + ; y / 4 + PUSH IX + POP BC + ; D=0 + LD E,4 + CALL BC_Div_DE + ; y / 4 = BC + PUSH BC + ; y / 100 + PUSH IX + POP BC + ; D=0 + LD E,100 + CALL BC_Div_DE + ; y / 100 = BC + PUSH BC + ; y / 400 + PUSH IX + POP BC + LD DE,400 + CALL BC_Div_DE + ; y / 400 = BC + ; y/400 - y/100 + AND A + LD H,B + LD L,C + POP DE + SBC HL,DE + ; y/400 - y/100 = HL + ; y/4 ? y/100 + y/400 + POP DE + ADD HL,DE + ; y/4 ? y/100 + y/400 + (31 * m)/12 +.m31_12+1: LD DE,0 + ADD HL,DE + ; y + y/4 ? y/100 + y/400 + (31 * m)/12 + EX DE,HL + ADD IX,DE + ; день + y + y/4 ? y/100 + y/400 + (31 * m)/12 + LD D,0 +.day+1: LD E,0 + ADD IX,DE + ; 7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12) + LD DE,7000 + ADD IX,DE + ; (7000 + (день + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7 + LD B,XH + LD C,XL + LD DE,7 + CALL BC_Div_DE + ; ДеньНедели = L + LD H,L + INC H + RET +;----------------------------------------------------------------------; + ;----------------------------------------------------------------------; ; a..z -> A..Z @@ -190,6 +294,33 @@ HEX2BCD: ;----------------------------------------------------------------------; ; + +; +;----------------------------------------------------------------------; +;BC/DE ==> BC, remainder in HL +; не портит DE +BC_Div_DE: + ld hl,0 + ld a,b + ld b,16 + ;shift the bits from BC into HL +.div_loop: + sla c + rla + adc hl,hl + sbc hl,de + jr nc,.div_inc_acc + add hl,de + db $FE ;this begins the instruction `cp *`, so it eats the next byte. +.div_inc_acc: + inc c + djnz .div_loop + ld b,a + ret +;----------------------------------------------------------------------; +; + + ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A ;----------------------------------------------------------------------; DIV_for_SPC: @@ -231,107 +362,106 @@ DIV_for_SPC: ; LD H,0 ; LD L,A ; RET -/* - DEFINE NEW_DIV 1 -DIV32: LD XH,D - LD XL,E +; DEFINE NEW_DIV 1 - IFN NEW_DIV - EX DE,HL - LD HL,0 - LD A,#20 -DIV001: ADD IX,IX - EX DE,HL - ADC HL,HL - EX DE,HL - ADC HL,HL - SBC HL,BC - JR NC,DIV002 - ADD HL,BC - DEC A - JR NZ,DIV001 - RET -DIV002: INC IX - DEC A - JR NZ,DIV001 - RET - ELSE +; DIV32: LD XH,D +; LD XL,E + +; IFN NEW_DIV +; EX DE,HL +; LD HL,0 +; LD A,#20 +; DIV001: ADD IX,IX +; EX DE,HL +; ADC HL,HL +; EX DE,HL +; ADC HL,HL +; SBC HL,BC +; JR NC,DIV002 +; ADD HL,BC +; DEC A +; JR NZ,DIV001 +; RET +; DIV002: INC IX +; DEC A +; JR NZ,DIV001 +; RET +; ELSE -div32_16: -;HLIX/BC -> HLIX remainder DE -;174+4*div32_16_sub8 -;min: 2186cc -;max: 2794cc -;avg: 2466cc -;61 bytes - ex de,hl ; 4 +; div32_16: +; ;HLIX/BC -> HLIX remainder DE +; ;174+4*div32_16_sub8 +; ;min: 2186cc +; ;max: 2794cc +; ;avg: 2466cc +; ;61 bytes +; ex de,hl ; 4 -; Negate BC to allow add instead of sbc - xor a ; 4 -; Need to set HL to 0 anyways, so save 2cc and a byte - ld h,a ; 4 - ld l,a ; 4 - sub c ; 4 - ld c,a ; 4 - sbc a,a ; 4 - sub b ; 4 - ld b,a ; 4 +; ; Negate BC to allow add instead of sbc +; xor a ; 4 +; ; Need to set HL to 0 anyways, so save 2cc and a byte +; ld h,a ; 4 +; ld l,a ; 4 +; sub c ; 4 +; ld c,a ; 4 +; sbc a,a ; 4 +; sub b ; 4 +; ld b,a ; 4 - ld a,d ; 4 - call div32_16_sub8 ; 17 - rla ; 4 - ld d,a ; 4 +; ld a,d ; 4 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld d,a ; 4 - ld a,e ; 4 - call div32_16_sub8 ; 17 - rla ; 4 - ld e,a ; 4 +; ld a,e ; 4 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld e,a ; 4 - ld a,ixh ; 8 - call div32_16_sub8 ; 17 - rla ; 4 - ld ixh,a ; 8 +; ld a,ixh ; 8 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld ixh,a ; 8 - ld a,ixl ; 8 - call div32_16_sub8 ; 17 - rla ; 4 - ld ixl,a ; 8 +; ld a,ixl ; 8 +; call div32_16_sub8 ; 17 +; rla ; 4 +; ld ixl,a ; 8 - ;ex de,hl ; 4 - ret ; 10 +; ;ex de,hl ; 4 +; ret ; 10 -div32_16_sub8: -;119+8*div32_16_sub -;min: 503cc -;max: 655cc -;avg: 573cc - call 1F -1: -;17+2(17+2(div32_16_sub))) - call 1F -1: -;17+2(div32_16_sub) - call div32_16_sub -div32_16_sub: -;48+{8,0+{0,19}} -;min: 48cc -;max: 67cc -;avg: 56.75cc - rla ; 4 - adc hl,hl ; 15 - jr c,1F ;12/7 - add hl,bc ; 11 - ret c ;11/5 - sbc hl,bc ; 15 - ret ; 10 -1: - add hl,bc ; 11 - scf ; 4 - ret ; 10 +; div32_16_sub8: +; ;119+8*div32_16_sub +; ;min: 503cc +; ;max: 655cc +; ;avg: 573cc +; call 1F +; 1: +; ;17+2(17+2(div32_16_sub))) +; call 1F +; 1: +; ;17+2(div32_16_sub) +; call div32_16_sub +; div32_16_sub: +; ;48+{8,0+{0,19}} +; ;min: 48cc +; ;max: 67cc +; ;avg: 56.75cc +; rla ; 4 +; adc hl,hl ; 15 +; jr c,1F ;12/7 +; add hl,bc ; 11 +; ret c ;11/5 +; sbc hl,bc ; 15 +; ret ; 10 +; 1: +; add hl,bc ; 11 +; scf ; 4 +; ret ; 10 - ENDIF -*/ +; ENDIF ; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 8f5f232..6a34de5 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -831 \ No newline at end of file +843 \ No newline at end of file diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 919a011..9140f36 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -29,7 +29,7 @@ echo_mode: ;------------------------------------------------- RUN_BAT: call BATCH - jp c,A83DD ; ошибка откр. файла (cpp.asm) + jp c,EXEERR ; ошибка откр. файла (cpp.asm) ret ;------------------------------------------------- diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index b6f4b53..ffc4680 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -9,16 +9,14 @@ ;/////////////////////////////////////////////////// cmd_date: ex de,hl ; hl=ком-строка - ;ld de,T9186 ; буфер ld de,work_buffer1; ld c,Dss.GSwitch ; выделить параметр ком-строки RST ToDSS - ;ld de,T9186 ld de,work_buffer1; ld a,(de) or a - jr z,cmd_dt1 - call A893C + jr z,.cmd_dt1 + call STR2DEC jp c,invalid_param ; "Invalid parametr" xor a cp h @@ -28,7 +26,7 @@ cmd_date: jp c,invalid_param ; "Invalid parametr" ld b,l push bc - call A893C + call STR2DEC pop bc jp c,invalid_param ; "Invalid parametr" xor a @@ -39,7 +37,7 @@ cmd_date: jp c,invalid_param ; "Invalid parametr" ld c,l push bc - call A893C + call STR2DEC push hl ld c,Dss.SysTime RST ToDSS @@ -47,30 +45,55 @@ cmd_date: pop de ld c,Dss.SetTime RST ToDSS -cmd_dt1:ld c,Dss.SysTime +.cmd_dt1: + ld c,Dss.SysTime RST ToDSS + PUSH BC ; [ ] вывод дня недели 26/01/2023 push ix push de ld a,d ; число ld hl,PRM1 ; куда - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,"." ld (hl),a inc hl pop de ld a,e ; число - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,"." ld (hl),a inc hl push hl pop ix pop hl - call A8964 + call PDIGIT + ; [ ] вывод дня недели 26/01/2023 + POP DE + LD D,0 + LD A,E + CP 8 + JR C,.skip + LD E,8 +.skip: LD HL,.days + LD BC,.days.size + CALL LCPIR + ; + LD DE,PRM2 + CALL ncopy_string + ; ld de,MAIN_MSG.DATE ; индекс "Current date: %1" jp MESSAGE ; вывести строку - - + ; +.days: DB 0 + DZ "Sunday" + DZ "Monday" + DZ "Tuesday" + DZ "Wednesday" + DZ "Thursday" + DZ "Friday" + DZ "Saturday" + DZ "check CMOS!" +.days.size EQU $ - .days ;/////////////////////////////////////////////////// @@ -89,7 +112,7 @@ cmd_time: ld a,(de) or a jr z,cmd_tm1 - call A893C + call STR2DEC jp c,invalid_param ; "Invalid parametr" xor a cp h @@ -99,7 +122,7 @@ cmd_time: jp c,invalid_param ; "Invalid parametr" ld b,l push bc - call A893C + call STR2DEC pop bc jp c,invalid_param ; "Invalid parametr" xor a @@ -110,7 +133,7 @@ cmd_time: jp c,invalid_param ; "Invalid parametr" ld c,l push bc - call A893C + call STR2DEC pop bc jp c,invalid_param ; "Invalid parametr" xor a @@ -134,18 +157,18 @@ cmd_tm1:ld c,Dss.SysTime push hl ld a,h ; число ld hl,PRM1 ; куда - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,":" ld (hl),a inc hl pop de ld a,e ; число - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер ld a,":" ld (hl),a inc hl pop af ; число - call A8913 ; десят. вывод в буфер + call PUTB ; десят. вывод в буфер xor a ld (hl),a ; в конец строки ld de,MAIN_MSG.TIME ; индекс "Current time: %1" diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index 3cdaabc..40c908f 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -146,7 +146,7 @@ cmd_dir: ; Десятичный вывод .print: ld hl,(D88DC) ld ix,PRM1 ; буфер - call A8964 + call PDIGIT ; ld hl,(D88DE) ; мл. разряд exx @@ -209,7 +209,7 @@ cmd_dir: ; Десятичный вывод ld hl,(dir_number) ld ix,PRM3 ; буфер - call A8964 + call PDIGIT ;xor a ;ld (de),a ; diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 9e030b2..5828524 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -13,14 +13,14 @@ cmd_echo: push de ld b,3 ; длина сравнения ld hl,T8C21 ; "ON",0 - call A874E ; сравнить строки + call COMPARE ; сравнить строки pop de ld a,true ; режим "on" jr z,A864B push de ld b,4 ; длина сравнения ld hl,T8C24 ; "OFF",0 - call A874E ; сравнить строки + call COMPARE ; сравнить строки pop hl ld a,false ; режим "off" jr z,A864B diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index a51ebaa..513fef9 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -1,5 +1,5 @@ ; раб. ячейка -D8374: dw 0 +SAVEHL: dw 0 @@ -92,26 +92,25 @@ COMP: call EVALCMD ; (batch.asm) ; задан не диск RUN_EXT: ex de,hl ; восст. адрес начала строки - ld (D8374),hl ; struct_input_line+5 - ld de,T8C1A ; буфер + ld (SAVEHL),hl ; struct_input_line+5 + ld de,EXTBF ; буфер ld bc,4*256 + Dss.EX_Path ; выделить расш. файла RST ToDSS - ld hl,(D8374) ; имя файла - jr c,A83D7 ; выполнить exe-файл + ld hl,(SAVEHL) ; имя файла + jr c,RUN_EXE ; выполнить exe-файл bit 1,a ; есть расш. ? - jr z,A839D ; нет + jr z,.NON_EXT ; нет ; есть расш. файла - ld de,T8C1A ; буфер расш. файла - ld hl,T8C1E ; "BAT" + ld de,EXTBF ; буфер расш. файла + ld hl,BATBF ; "BAT" ld b,3 ; длина сравнения ;!HARDCODE - call A874E ; сравнить строки - ld hl,(D8374) + call COMPARE ; сравнить строки + ld hl,(SAVEHL) jp z,RUN_BAT ; выполнить bat-файл (batch.asm) - jr A83D7 ; выполнить exe-файл - -A839D: ld bc,0*256 + Dss.Exec ; загр. и выполнить программу + jr RUN_EXE ; выполнить exe-файл +.NON_EXT: + ld bc,0*256 + Dss.Exec ; загр. и выполнить программу RST ToDSS - ;[x] 01/11/23 ;!TEST PUSH AF CALL RESTORE_ALL @@ -120,20 +119,19 @@ A839D: ld bc,0*256 + Dss.Exec ; ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; - - ld hl,(D8374) + ld hl,(SAVEHL) cp DSS_Error.sys.FILE_NOT_FOUND - jr nz,A83DD + jr nz,EXEERR push hl ;ld a,(D96AD) ; длина строки (inline.asm) ld a,(struct_input_line+4) ; длина строки ld b,a -A83AF: ld a,(hl) +.loop: ld a,(hl) cp " "+1 - jr c,A83B7 + jr c,.next inc hl - djnz A83AF -A83B7: ld e,b + djnz .loop +.next: ld e,b ld d,0 add hl,de push hl @@ -159,7 +157,8 @@ A83B7: ld e,b ; Выполнить exe-файл ; hl=имя файла -A83D7: ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл +RUN_EXE: + ld bc,0*256 + Dss.Exec ; загрузить программу, выполнить файл RST ToDSS ;[x] 01/11/23 ;!TEST @@ -171,7 +170,7 @@ A83D7: ld bc,0*256 + Dss.Exec ; ;[x] 25/10/23 JP NC,Ret_New_Line ; Ok ; -A83DD: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" +EXEERR: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора" jp nc,print_err_message ; вывод сообщения xor a ; индекс "Bad command or file name" jp print_err_message diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm index cea673c..ce7440c 100644 --- a/SHELL/Messages/main_txt.asm +++ b/SHELL/Messages/main_txt.asm @@ -32,7 +32,7 @@ MAIN_MSG: db "Volume Serial Number is %2",CR,LF db CR,LF,"Directory of %3",CR,LF,LF,0 stN .VERS_ : db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 - stN .DATE_ : db "Current date: %1",CR,LF,0 + stN .DATE_ : db "Current date: %1, %2",CR,LF,0 ; [ ] вывод дня недели 26/01/2023 stN .TIME_ : db "Current time: %1",CR,LF,0 stN .PAUSE_ : db "Press any key to continue . . .",CR,0 stN .INV_ : db "Invalid parametr",CR,LF,0 diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm index 9e3ac42..1809cf1 100644 --- a/SHELL/Procedures/math.asm +++ b/SHELL/Procedures/math.asm @@ -26,7 +26,7 @@ hex8: push af ;----------------------------------------------------------------------; -;!FIXIT есть дубль hex2dec_ascii_16bit +;!FIXIT есть дубль PDIGIT ; вход: hl=число, de=буфер hex2dec_ascii_16bit: .n10: ld ix,.tmp1 diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM index ca68d38..4a5593e 100644 --- a/SHELL/SHELL.ASM +++ b/SHELL/SHELL.ASM @@ -359,17 +359,18 @@ newline: push hl ; in: de=string1 ; hl=string2 ; b=длина строки -A874E: ld a,(de) +COMPARE: + ld a,(de) cp "a" - jr c,$+8 + jr c,.next cp "z"+1 - jr nc,$+4 + jr nc,.next and 5Fh ; a..z -> A..Z - cp (hl) +.next: cp (hl) ret nz inc hl inc de - djnz A874E + djnz COMPARE ret @@ -401,10 +402,10 @@ copy_string: ; Десятичный вывод в буфер ; вход: a=число ; hl=буфер -A8913: ld c,2Fh - inc c +PUTB: ld c,2Fh +.loop: inc c sub 10 - jr nc,$-3 + jr nc,.loop add a,10 add a,"0" push af @@ -418,8 +419,9 @@ A8913: ld c,2Fh -A893C: ld hl,0 -A893F: ld a,(de) +STR2DEC: + ld hl,0 +.loop: ld a,(de) inc de or a ret z @@ -435,17 +437,15 @@ A893F: ld a,(de) add hl,hl add hl,bc add hl,hl - call A895A + call .ATODEC ret c add a,l ld l,a - jr nc,A893F + jr nc,.loop inc h - jr A893F - - -; char -> int -A895A: cp "0" + jr .loop +.ATODEC:; char -> int + cp "0" ret c cp "9"+1 ccf @@ -453,17 +453,17 @@ A895A: cp "0" sub "0" ret -;!FIXIT есть дубл -A8964: ld de,10000 +;!FIXIT есть дубл hex2dec_ascii_16bit +PDIGIT: ld de,10000 ld a,#C8 ; ret z - ld (D8996),a - call A898E + ld (.patch),a + call .DIG ld de,1000 - call A898E + call .DIG ld de,100 - call A898E + call .DIG ld de,10 - call A898E + call .DIG ld a,l add a,"0" ;!TEST @@ -474,20 +474,18 @@ A8964: ld de,10000 LD (IX+1),0 ; ret - - -A898E: xor a +.DIG: xor a inc a sbc hl,de jr nc,$-3 add hl,de dec a -D8996: ret z +.patch: ret z add a,"0" ld (ix+0),a inc ix xor a ; nop - ld (D8996),a + ld (.patch),a ret @@ -522,11 +520,10 @@ RUNMODE: db 0 -; буфер расш. файла -T8C1A: ds 3 - db 0 +; буфер расш. файла с ограничителем 0 +EXTBF: BLOCK 4,0 -T8C1E: db "BAT" ; расш. bat-файла +BATBF: db "BAT" ; расш. bat-файла T8C21: db "ON",0 T8C24: db "OFF",0 diff --git a/SHELL/build.txt b/SHELL/build.txt index da4c6e9..58dc5af 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -297 \ No newline at end of file +303 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index a6dee8e..e7e58e7 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a6dee8e17ae12b251f306290793a56a6b0dd5ae3 +Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e