;[BEGIN] ; ; SYSTEM.EXE /S /P ; ; /P Primary command processor ; /S Secondary command processor ; /C Execute batch file ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;R09 ??-??-???? DNS ;????? ???? ;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS ; WHEN LINE BEGAN AT #xx00 OFFSET ;R07 14-12-2002 DNS PARSING BATCH LINE ;R06 12-12-2002 DNS ADD %0, %1, %2 ... ;R05 11-12-2002 DNS IMPLEMENTED %VAR% ;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE ;R03 11-12-2002 DNS NEW VERSION ;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES ;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO ;=====================================================================[] include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' ; ; Standart EQU section ;---------------------------------------------------------------------[] org_addr EQU #8000 + CLP_Buffer code_addr EQU START stack_point EQU #BFFF stack_buffer EQU 64 program_start EQU START Loader_length EQU 0 ;---------------------------------------------------------------------[] ; ; ; Program EQU section ;---------------------------------------------------------------------[] CR EQU 13 LF EQU 10 ;---------------------------------------------------------------------[] ; OUTPUT './Build/system.exe' include 'Shared_includes/constants/EXE_Header.z80' ORG org_addr START: LD HL,WORK_BUFFERS LD DE,WORK_BUFFERS+1 LD BC,BUFFERS_STRUCT-1 LD (HL),0 LDIR ;INIT LD A,(IX-1) LD (TASKX),A PUSH IX CALL CRLF CALL GETPATH POP IX ; CALL GET_CMD EI LD A,(RUNMODE) AND #80 ;TEST PRIMARY JP NZ,FPRIMAR LD A,(RUNMODE) AND #20 ;TEST SECONDARY JP NZ,FSECOND LD A,(RUNMODE) AND #10 ;TEST BATCH FILE JP NZ,FBATCHS LD A,(RUNMODE) AND #40 ;TEST PROCESS JP NZ,FBATCH JP QUIT FSECOND CALL VERS JP CONSOLE FBATCHS LD HL,CMDLINE CALL BATCH JP QUIT FBATCH CALL CMDMODE JP QUIT FPRIMAR LD C,Dss.CTRLKey RST ToDSS LD A,B AND #C0 JP NZ,CONSOLE LD HL,BATNAME CALL BATCH JP CONSOLE ;R07 MAKE_BATCH_PRM_ARRAY DEC HL B_SKIP_SPACE INC HL LD A,(HL) OR A RET Z CP " " JR Z,B_SKIP_SPACE CP 9 JR Z,B_SKIP_SPACE EX DE,HL LD (HL),E INC HL LD (HL),D INC HL EX DE,HL B_FIND_SPACE INC HL LD A,(HL) CP "!" JR NC,B_FIND_SPACE LD (HL),0 OR A RET Z DJNZ B_SKIP_SPACE RET BATCH: PUSH HL LD DE,PRMLINE BCHL1 LD A,(HL) LDI OR A JR NZ,BCHL1 LD HL,PRMLINE LD DE,BAT_PRM_ARRAY LD B,10 CALL MAKE_BATCH_PRM_ARRAY JR NZ,B_ALL_P LD HL,NULL EX DE,HL B_CLR_P LD (HL),E INC HL LD (HL),D INC HL DJNZ B_CLR_P EX DE,HL B_ALL_P POP HL ;R07 XOR A LD C,Dss.Open RST ToDSS ;R10 CALL Restore_Screen ;R10 RET C LD (BAT_FM),A CALL NEWLINE XOR A RET Restore_Screen: PUSH AF LD C,Dss.GetVMod RST ToDSS AND #80 JR Z,.exit LD BC,1 * 256 + Dss.SetVMod LD A,Dss.SetVMod.txt80x32 RST ToDSS .exit: POP AF RET NEWLINE LD DE,CMDLINE ADDBAT PUSH DE CALL READBAT POP DE OR A JR NZ,BATLINE EX DE,HL LD DE,CMDLINE AND A SBC HL,DE RET Z LD A,L LD (CMDLINE-1),A CALL CMDMODE LD A,(BAT_FM) LD C,Dss.Close RST ToDSS RET BATLINE LD HL,BATBUFF NBLINE CALL MOVWORD JP C,ADDBAT LD A,B LD (BAT_LEN),A PUSH HL EX DE,HL LD DE,CMDLINE AND A SBC HL,DE LD A,L LD (CMDLINE-1),A CALL CMDMODE LD DE,CMDLINE POP HL JP NBLINE MOVWORD LD A,(BAT_LEN) LD B,A M00WORD LD A,(HL) LD (DE),A CP #20 JR C,M01WORD INC HL INC DE DJNZ M00WORD SCF RET M01WORD LD A,(HL) CP #20 RET NC INC HL DJNZ M01WORD ;R08 PUSH DE CALL READBAT POP DE LD HL,BATBUFF LD A,(BAT_LEN) LD B,A OR A JR NZ,M01WORD SCF ;R08 RET READBAT LD HL,BATBUFF LD DE,128 LD C,Dss.Read LD A,(BAT_FM) RST ToDSS LD A,E LD (BAT_LEN),A RET CMDMODE: XOR A LD (POSIT),A CALL EVALCMD ;R05 LD IX,CMDLINE-2 LD HL,CMDLINE LD A,(HL) CP "@" JR NZ,NOALPHA DEC HL DEC (HL) JR Z,NOEC LD C,(HL) INC HL LD B,0 LD D,H LD E,L INC HL LDIR JR NOEC NOALPHA LD A,(ECHOFLG) OR A JR NZ,NOEC LD DE,CMDLINE CALL PRINT_S CALL CRLF LD A,(CMDLINE-1) OR A RET Z CALL CRLF CALL COMPBAT RET NOEC LD A,(CMDLINE-1) OR A RET Z CALL COMPBAT RET COMPBAT LD HL,CMDLINE DEC HL LD C,(HL) LD B,0 INC HL COMP00B LD A,(HL) CP " " JR NZ,COMP01B INC HL DEC C JR NZ,COMP00B RET COMP01B LD D,H LD E,L ADD HL,BC LD (HL),0 SBC HL,BC LD A,C EX AF,AF' LD A,#20 CPIR JR NZ,COMPB05 INC C COMPB05 EX AF,AF' SUB C LD C,A LD HL,BATLIST JP COMP004 CONSOLE: CALL CRLF RE_: CALL GETXY CALL GETPATH ; CALL VERS LD HL,CMDLINE LD DE,CMDLINE+1 LD (HL),0 LD BC,#7F LDIR CALL INPUT CALL CRLF LD A,(CMDLINE-1) OR A JP Z,RE_ CALL CRLF CALL COMP JP RE_ GETXY LD C,Dss.Cursor RST ToDSS JP LOCAT INPUT XOR A LD (POSIT),A LD (SHIFT),A LD (LEN_NEW),A LD IX,CMDLINE-2 CALL CEDIT CALL RES_CUR RET COMP: CALL EVALCMD ;R05 LD HL,CMDLINE DEC HL LD C,(HL) LD B,0 INC HL COMP00 LD A,(HL) CP " " JR NZ,COMP01 INC HL DEC C JR NZ,COMP00 RET COMP01 LD D,H LD E,L ADD HL,BC LD (HL),0 SBC HL,BC LD A,C EX AF,AF' LD A,#20 CPIR JR NZ,COMP005 INC C COMP005 EX AF,AF' SUB C LD C,A LD HL,CMDLIST COMP004 PUSH BC PUSH DE COMP000 LD A,(DE) CP 'a' JP C,COMP001 CP '{' JP NC,COMP001 SUB #20 COMP001 CP (HL) JP NZ,COMP002 INC HL INC DE DEC C JP NZ,COMP000 XOR A CP (HL) JP NZ,COMP002 POP BC POP BC LD A,(DE) CP " " JR NZ,NOSPC INC DE NOSPC INC HL LD A,(HL) INC HL LD H,(HL) LD L,A JP (HL) COMP002 XOR A ;!TEST ;LD C,#FF LD C,A CPIR .loop: ;CPI ;JP NZ,.loop ; INC HL INC HL POP DE POP BC LD A,(HL) OR A JP NZ,COMP004 LD H,D ;CMDLINE LD L,E LD B,(HL) INC HL LD C,(HL) INC HL LD A,(HL) OR A JR NZ,RUN_EXT LD A,":" CP C JR NZ,RUN_EXT LD A,B CP "a" JR C,NOUP CP "{" JR NC,NOUP AND #5F NOUP SUB "A" LD C,Dss.ChDisk RST ToDSS JP C,ERROR JP GETPATH SAVEHL DW 0 RUN_EXT EX DE,HL LD (SAVEHL),HL LD BC,Dss.EX_Path.GET_TYPE*256 + Dss.EX_Path LD DE,EXTBF RST ToDSS LD HL,(SAVEHL) JR C,RUN_EXE BIT 1,A JR Z,NON_EXT LD DE,EXTBF LD HL,BATBF LD B,3 CALL COMPARE LD HL,(SAVEHL) JR Z,RUN_BAT JP RUN_EXE NON_EXT LD BC,0*256+Dss.Exec RST ToDSS ;R10 CALL Restore_Screen ;R10 RET NC LD HL,(SAVEHL) CP 3 JP NZ,EXEERR PUSH HL LD A,(CMDLINE-1) LD B,A EXF000 LD A,(HL) CP "!" JR C,EXF001 INC HL DJNZ EXF000 EXF001 LD E,B LD D,0 ADD HL,DE PUSH HL LD E,4 ADD HL,DE POP DE EX DE,HL LD C,B LD B,0 INC C LDDR INC HL LD (HL),"." INC HL LD (HL),"B" INC HL LD (HL),"A" INC HL LD (HL),"T" ; LD HL,(SAVEHL) POP HL JP RUN_BAT RUN_EXE: LD BC,0*256 + Dss.Exec RST ToDSS ;R10 CALL Restore_Screen ;R10 RET NC EXEERR CP 5 JP NC,ERROR LD DE,0 ;BAD COMMAND OR FILENAME JP ERR_MSG RUN_BAT CALL BATCH JP C,EXEERR RET ; !! Не делать одну команду > 256 символов)) !! BATLIST DZ 'PAUSE' : DW CPAUSE DZ 'REM' : DW CREM CMDLIST DZ 'CD' : DW CCHDIR DZ 'CHDIR' : DW CCHDIR DZ 'CLS' : DW CLS DZ 'DATE' : DW CDATE DZ 'DEL' : DW CDELET DZ 'DIR' : DW DIR DZ 'ECHO' : DW CECHO DZ 'ERASE' : DW CDELET DZ 'EXIT' : DW CEXIT DZ 'HELP' : DW HELP DZ 'MD' : DW CMKDIR DZ 'MKDIR' : DW CMKDIR DZ 'PATH' : DW CPATH DZ 'REN' : DW CRENAM DZ 'RENAME' : DW CRENAM DZ 'RD' : DW CRMDIR DZ 'RMDIR' : DW CRMDIR DZ 'SET' : DW CSET DZ 'TIME' : DW CTIME DZ 'VERSION' : DW VERS DZ 'VER' : DW VERS DB #00 CLS LD DE,#0000 LD HL,#2050 LD BC,7*256+Dss.Clear LD A," " RST ToDSS LD DE,#0000 JP LOCAT CRLF LD A,#0D CALL PRINTX LD A,#0A JP PRINTX CDATE EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS LD DE,DTA LD A,(DE) OR A JR Z,NOSETD CALL STR2DEC JR C,ILLEG XOR A CP H JR NZ,ILLEG LD A,31 CP L JR C,ILLEG LD B,L PUSH BC CALL STR2DEC POP BC JR C,ILLEG XOR A CP H JR NZ,ILLEG LD A,12 CP L JR C,ILLEG LD C,L PUSH BC CALL STR2DEC PUSH HL LD C,Dss.SysTime RST ToDSS POP IX POP DE LD C,Dss.SetTime RST ToDSS NOSETD LD C,Dss.SysTime RST ToDSS PUSH IX PUSH DE LD A,D LD HL,PRM1 CALL PUTB LD A,"-" LD (HL),A INC HL POP DE LD A,E CALL PUTB LD A,"-" LD (HL),A INC HL PUSH HL POP IX POP HL CALL PDIGIT LD DE,DATEMSG JP MESSAGE ILLEG LD DE,ILLGMSG CALL MESSAGE RET CTIME EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS LD DE,DTA LD A,(DE) OR A JR Z,NOSETT CALL STR2DEC JR C,ILLEG XOR A CP H JR NZ,ILLEG LD A,23 CP L JR C,ILLEG LD B,L PUSH BC CALL STR2DEC POP BC JR C,ILLEG XOR A CP H JR NZ,ILLEG LD A,59 CP L JR C,ILLEG LD C,L PUSH BC CALL STR2DEC POP BC JR C,ILLEG XOR A CP H JR NZ,ILLEG LD A,59 CP L JR C,ILLEG PUSH BC LD A,L PUSH AF LD C,Dss.SysTime RST ToDSS POP BC POP HL LD C,Dss.SetTime RST ToDSS NOSETT LD C,Dss.SysTime RST ToDSS PUSH BC PUSH HL LD A,H LD HL,PRM1 CALL PUTB LD A,":" LD (HL),A INC HL POP DE LD A,E CALL PUTB LD A,":" LD (HL),A INC HL POP AF CALL PUTB XOR A LD (HL),A LD DE,TIMEMSG JP MESSAGE CPAUSE LD DE,PAUSMSG CALL MESSAGE LD C,Dss.WaitKey RST ToDSS RET ;R09 PATHSTR DB "PATH=",0 CPATH LD A,(DE) OR A JP Z,PRNEPATH INC DE CP 9 JR Z,CPATH CP "!" JR C,CPATH DEC DE EX DE,HL DEC HL LD (HL),"=" DEC HL LD (HL),"H" DEC HL LD (HL),"T" DEC HL LD (HL),"A" DEC HL LD (HL),"P" LD BC,2*256+Dss.Environ RST ToDSS CALL C,ERROR RET PRNEPATH LD DE,DTA LD HL,PATHSTR LD BC,1*256+Dss.Environ RST ToDSS JP C,ERROR LD HL,PATHSTR LD C,Dss.PChars RST ToDSS LD HL,DTA LD C,Dss.PChars RST ToDSS CALL CRLF RET ;R09 CSET LD A,(DE) OR A JP Z,PRNENVIR INC DE ;R08 CP 9 ;R08 JR Z,CSET ;R08 CP "!" ;R08 JR C,CSET ;R08 DEC DE ;R08 EX DE,HL LD BC,2*256+Dss.Environ RST ToDSS CALL C,ERROR RET PRNENVIR LD HL,DTA LD BC,0*256+Dss.Environ RST ToDSS LD HL,DTA PRNENVX LD C,Dss.PChars RST ToDSS LD A,CR LD C,Dss.PutChar RST ToDSS LD A,LF LD C,Dss.PutChar RST ToDSS LD A,(HL) OR A JR NZ,PRNENVX RET CECHO EX DE,HL LD A,(HL) OR A JR Z,ECHO_F EX DE,HL PUSH DE LD B,3 LD HL,ECHOON CALL COMPARE POP DE JR Z,ECHO_FS PUSH DE LD B,4 LD HL,ECHOOFF CALL COMPARE POP HL JR Z,ECHO_FR ;R03 REMOVE R01 LD C,Dss.PChars RST ToDSS JP CRLF ECHO_F LD A,(ECHOFLG) OR A LD DE,ON__MSG JR Z,ECHON LD DE,OFF_MSG ECHON CALL FMESAGE LD DE,PRM1 CALL PUTPRM LD DE,ECHOMSG CALL MESSAGE RET ECHO_FS XOR A LD (ECHOFLG),A RET ECHO_FR LD A,#FF LD (ECHOFLG),A RET ;R04 EVALCMD XOR A LD HL,CMDLINE-1 LD C,(HL) LD B,A INC HL ADD HL,BC LD (HL),A SBC HL,BC LD DE,TMPLINE CALL EVALSTR LD HL,TMPLINE LD DE,CMDLINE LD BC,#00FF MOVLBAK LD A,(HL) LDI INC B OR A JR NZ,MOVLBAK DEC B LD A,B LD (CMDLINE-1),A AND A RET ; HL - STRING WITH %VAR% EVALSTR ;R04 LD DE,DTA VARLOOP LD A,(HL) CP "%" JR Z,TVARIABLE VARL1 LDI OR A JR NZ,VARLOOP LD BC,0 LD (TVAR_PNT),BC ;R04 LD HL,DTA ;R04 RET IZERO DB "ZERO",0 IONE DB "ONE",0 ITWO DB "TWO",0 ITHREE DB "THREE",0 IFOUR DB "FOUR",0 IFIVE DB "FIVE",0 ISIX DB "SIX",0 ISEVEN DB "SEVEN",0 IEIGHT DB "EIGHT",0 ININE DB "NINE",0 ;R06 BAT_PRM_ARRAY DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;R06 NULL DB 0 ;R07 ;R01 TVAR_PNT DW 0 TVARIABLE LD BC,(TVAR_PNT) LD A,B OR C LD A,"%" LD (TVAR_PNT),DE JR NZ,TVAR1 ;R06 INC HL ;R06 LD A,(HL) ;R06 CP "9"+1 ;R06 JR C,TVAR0 ;R06 TVAR2 LD A,"%" ;R06 > "9" DEC HL ;R06 JP VARL1 ;R06 TVAR0 CP "0" ;R06 JR C,TVAR2 ;R06 < "0" ; BATCH PARAM %0, %1, %2 ... INC HL ;R06 PUSH HL LD (TVAR_PNT),BC SUB "0" ADD A,A LD C,A LD HL,BAT_PRM_ARRAY ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A OR H JR Z,NOBTP ;NO BATCH PARM MVBTP LD A,(HL) LDI OR A JR NZ,MVBTP DEC DE NOBTP POP HL JP VARLOOP ;R06 ;R06 TVAR1 PUSH HL LD H,D LD L,E DEC HL AND A SBC HL,BC JR Z,TNOVAR LD A,"=" LD (DE),A INC DE XOR A LD (DE),A LD D,B LD E,C LD H,B LD L,C INC HL LD BC,1*256+Dss.Environ RST ToDSS TNOVAR POP HL INC HL LD BC,0 LD (TVAR_PNT),BC JP VARLOOP ;R01 COMPARE LD A,(DE) CP #61 JP C,COM001 CP #7B JP NC,COM001 SUB #20 COM001 CP (HL) RET NZ INC HL INC DE DJNZ COMPARE RET CREM RET CCHDIR: EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS XOR A LD HL,DTA CP (HL) JR NZ,YP LD (HL),"." INC HL LD (HL),"." INC HL LD (HL),0 DEC HL DEC HL YP: LD C,Dss.ChDir RST ToDSS CALL C,ERROR CALL GETPATH RET CMKDIR EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS LD HL,DTA LD C,Dss.MkDir RST ToDSS CALL C,ERROR RET CRMDIR: EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS LD HL,DTA LD C,Dss.RmDir RST ToDSS CALL C,ERROR RET CDELET: EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS LD HL,DTA LD C,Dss.Delete RST ToDSS CALL C,ERROR RET CRENAM: EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST ToDSS ;LD DE,DTA+128 LD DE,DTA_2 LD C,Dss.GSwitch RST ToDSS LD HL,DTA ;LD DE,DTA+128 LD DE,DTA_2 LD C,Dss.Rename RST ToDSS CALL C,ERROR RET ERROR: LD E,A LD D,0 JP ERR_MSG DIR: LD HL,0 LD (DIRNEX.files),HL LD (S_LOW),HL LD (S_HIGH),HL EX DE,HL LD A,(HL) OR A JR NZ,YPS LD HL,ALLFS YPS: LD DE,DTA LD C,Dss.GSwitch RST ToDSS LD HL,DTA LD DE,DTA LD A,#37 LD BC,0*256+Dss.F_First RST ToDSS JP C,ERROR LD A,(PATHF) LD HL,PRM1 LD (HL),A INC HL LD (HL),":" INC HL LD (HL),0 LD HL,SER_NUM LD DE,PRM2 CALL PUTPRM CALL GETPATH LD HL,PATHF LD DE,PRM3 CALL PUTPRM //call copy_string ; скопир. строку (с нулем) LD DE,DIR1MSG CALL MESSAGE ; CALL CRLF ; CALL CRLF DIRNEX: LD HL,DTA LD DE,33 ADD HL,DE CALL PNAME LD IX,DTA LD A,(IX+32) AND #10 JP NZ,NODADD ;LD HL,(FILES) .files+1: LD HL,0 ;!TODO протестить какая процедура использующая эту переменную чаще вызывается и воткнуть переменную туда INC HL LD (DIRNEX.files),HL LD E,(IX+30) LD D,(IX+31) LD HL,(S_HIGH) EXX LD E,(IX+28) LD D,(IX+29) LD HL,(S_LOW) CALL ADDXXX LD (S_LOW),HL EXX LD (S_HIGH),HL NODADD: LD DE,DTA LD C,Dss.F_Next RST ToDSS JR NC,DIRNEX ;CALL ORDERS ;RET ORDERS: LD HL,(DIRNEX.files) LD IX,PRM1 CALL PDIGIT LD HL,(S_LOW) EXX LD HL,(S_HIGH) EXX CALL MAKE_LN LD HL,L32BIT_+9 LD A,(HL) CP #20 JR NZ,ALR2 LD A,#30 LD (HL),A ALR2: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LD A,(HL) LDI CP " " JR Z,NOPO1 LD A,"." NOPO1: LD (DE),A INC DE LDI LDI LD A,(HL) LDI CP " " JR Z,NOPO2 LD A,"." NOPO2: LD (DE),A INC DE LDI LDI LD A,(HL) LDI CP " " JR Z,NOPO3 LD A,"." NOPO3: LD (DE),A INC DE LDI LDI LDI LD HL,SIZEBFF LD DE,PRM2 CALL PUTPRM LD DE,DIR2MSG JP MESSAGE ;HL':HL + DE':DE ADDXXX: ADD HL,DE EXX ADC HL,DE EXX RET ;FILES: DW 0 S_LOW: DW 0 ;!FIXIT в команду S_HIGH: DW 0 ;!FIXIT в команду ;12345678 123 1 234 567 890 " ; SIZE PNAME: LD BC,8 LD DE,PRM1 LDIR XOR A LD (DE),A LD DE,PRM2 LDI LDI LDI LD (DE),A LD IX,DTA CALL PRNSIZE CALL PRNDATE CALL PRNTIME LD DE,DIR3MSG JP MESSAGE ;!TODO PRINTB: ; LD A,(HL) ; PUSH BC ; CALL PRINTX ; POP BC ; INC HL ; DJNZ PRINTB ; RET ;------------------ PUTB LD C,#2F .PUTB1 INC C SUB 10 JP NC,.PUTB1 ADD A,10 ADD A,#30 PUSH AF LD A,C LD (HL),A INC HL POP AF LD (HL),A INC HL RET ;!TODO PRNB: ; LD C,#2F ; .PRNB1 INC C ; SUB 10 ; JP NC,.PRNB1 ; ADD A,10 ; ADD A,#30 ; PUSH AF ; LD A,C ; CALL PRINTX ; POP AF ; JP PRINTX STR2DEC: LD HL,0 .LOOP: LD A,(DE) INC DE OR A RET Z CP "-" RET Z CP ":" RET Z LD B,H LD C,L ADD HL,HL ADD HL,HL ADD HL,BC ADD HL,HL CALL ATODEC RET C ADD A,L LD L,A JR NC,.LOOP INC H JR .LOOP ATODEC CP "0" RET C CP ":" CCF RET C SUB "0" RET PDIGIT LD DE,10000 LD A,#C8 LD (RET_Z),A CALL DIG LD DE,1000 CALL DIG LD DE,100 CALL DIG LD DE,10 CALL DIG LD A,L ADD A,#30 ;!TEST ;LD (IX+0),A ;INC IX ;LD (IX+0),0 LD (IX+0),A LD (IX+1),0 ; RET DIG: XOR A .DIG1: INC A SBC HL,DE JR NC,.DIG1 ADD HL,DE DEC A RET_Z: RET Z ADD A,#30 LD (IX+0),A INC IX XOR A LD (RET_Z),A RET PRNSIZE: LD A,(IX+32) LD HL,DIRIDD AND #10 JP NZ,.PRZ LD L,(IX+28) LD H,(IX+29) EXX LD L,(IX+30) LD H,(IX+31) EXX PUSH IX CALL MAKE_LN LD HL,L32BIT_+9 LD A,(HL) CP ' ' JR NZ,.ALR LD A,'0' LD (HL),A .ALR: LD DE,SIZEBFF LD HL,L32BIT_;; +1 LDI LD A," " LD (DE),A INC DE LDI LDI LDI LD (DE),A INC DE LDI LDI LDI LD (DE),A INC DE LDI LDI LDI LD HL,SIZEBFF POP IX .PRZ: LD DE,PRM3 JP PUTPRM ; Скопировать в буфер дату файла/папки PRNDATE: LD B,(IX+25) LD C,(IX+24) LD HL,SIZEBFF CALL DATE LD (HL),0 LD HL,SIZEBFF LD DE,PRM4 LD A,(HL) CP "0" JP NZ,PUTPRM LD (HL),#20 JP PUTPRM ; Скопировать в буфер время файла/папки PRNTIME: LD B,(IX+22) LD C,(IX+23) LD HL,SIZEBFF CALL TIME LD (HL),0 LD HL,SIZEBFF LD DE,PRM5 LD A,(HL) CP "0" JP NZ,PUTPRM LD (HL),' ' JP PUTPRM ; в буфер время файла/папки TIME: SRL C RR B SRL C RR B SRL C RR B SRL B SRL B LD A,C CALL NUMB LD (HL),":" INC HL LD A,B JP NUMB ; в буфер дату файла/папки DATE: LD A,C AND #1F PUSH BC CALL NUMB LD (HL),"." INC HL POP BC LD A,C SRL B RLA RLA RLA RLA AND #0F CALL NUMB LD (HL),"." INC HL LD A,B ADD A,#50 CP 100 JP C,NUMB SUB100 SUB 100 CP 100 JP C,NUMB JR SUB100 NUMB LD C,#2F NUMB1 INC C SUB 10 JP NC,NUMB1 ADD A,10 ADD A,'0' LD (HL),C INC HL LD (HL),A INC HL RET ; Десятичный 32-х разрядный вывод MAKE_LN LD IX,L32BIT_ EXX LD DE,#3B9A ; 1000000000 EXX LD DE,#CA00 CALL GET_DIG EXX LD DE,#05F5 ; 100000000 EXX LD DE,#E100 CALL GET_DIG EXX LD DE,#0098 ; 10000000 EXX LD DE,#9680 CALL GET_DIG EXX LD DE,#000F ; 1000000 EXX LD DE,#4240 CALL GET_DIG EXX LD DE,#0001 ; 100000 EXX LD DE,#86A0 CALL GET_DIG EXX LD DE,#0000 ; 10000 EXX LD DE,#2710 CALL GET_DIG EXX LD DE,#0000 ; 1000 EXX LD DE,#03E8 CALL GET_DIG EXX LD DE,#0000 ; 100 EXX LD DE,#0064 CALL GET_DIG EXX LD DE,#0000 ; 10 EXX LD DE,#000A CALL GET_DIG LD A,L ; 1 ADD A,#30 LD (IX+0),A INC IX LD HL,L32BIT_ LD DE,#2030 KILLZ LD A,(HL) CP E JR NZ,KILLZ2 LD (HL),D INC HL JP KILLZ KILLZ2 LD HL,L32BIT_+9 LD A,(HL) CP D RET NZ LD (HL),E RET ; HL:HL - DE:DE GET_DIG XOR A INC_DG INC A SBC HL,DE EXX SBC HL,DE EXX JP NC,INC_DG ADD HL,DE EXX ADC HL,DE EXX DEC A ADD A,#30 LD (IX+0),A INC IX RET L32BIT_ DB "0000000000" DIRIDD DB "