;[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 ; OUTPUT './Build/system.exe' ORG #8100-512 include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' CR EQU 13 LF EQU 10 DB "EXE" ;EXE ID DB #00 ;EXE VERSION DW #0200 ;CODE OFFSET LOW DW #0000 ;CODE OFFSET HIGH DW #0000 ;END-BEG ;PRIMARY LOADER DW #0000 ; DW #0000 ;RESERVED DW #0000 ; DW #8100 ;LOAD ADDRESS DW #8100 ;START ADDRESS DW #BFFF ;STACK ADDRESS DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0 ; DEFS 490,0 ; LD SP,#BFFF START CALL INIT 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 #10 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 #10 ;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 C,Dss.Close LD A,(BAT_FM) RST #10 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 #10 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 INIT LD A,(IX-1) LD (TASKX),A PUSH IX CALL CRLF CALL GETPATH POP IX RET 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 #10 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 #10 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 #10 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 #10 ;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 #10 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 #10 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 #10 POP IX POP DE LD C,Dss.SetTime RST #10 NOSETD LD C,Dss.SysTime RST #10 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 #10 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 #10 POP BC POP HL LD C,Dss.SetTime RST #10 NOSETT LD C,Dss.SysTime RST #10 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 #10 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 #10 CALL C,ERROR RET PRNEPATH LD DE,DTA LD HL,PATHSTR LD BC,1*256+Dss.Environ RST #10 JP C,ERROR LD HL,PATHSTR LD C,Dss.PChars RST #10 LD HL,DTA LD C,Dss.PChars RST #10 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 #10 CALL C,ERROR RET PRNENVIR LD HL,DTA LD BC,0*256+Dss.Environ RST #10 LD HL,DTA PRNENVX LD C,Dss.PChars RST #10 LD A,CR LD C,Dss.PutChar RST #10 LD A,LF LD C,Dss.PutChar RST #10 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 #10 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 #10 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 #10 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 #10 CALL C,ERROR CALL GETPATH RET CMKDIR EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST #10 LD HL,DTA LD C,Dss.MkDir RST #10 CALL C,ERROR RET CRMDIR EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST #10 LD HL,DTA LD C,Dss.RmDir RST #10 CALL C,ERROR RET CDELET EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST #10 LD HL,DTA LD C,Dss.Delete RST #10 CALL C,ERROR RET CRENAM EX DE,HL LD DE,DTA LD C,Dss.GSwitch RST #10 LD DE,DTA+128 LD C,Dss.GSwitch RST #10 LD HL,DTA LD DE,DTA+128 LD C,Dss.Rename RST #10 CALL C,ERROR RET ERROR LD E,A LD D,0 JP ERR_MSG DIR LD HL,0 LD (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 #10 LD HL,DTA LD DE,DTA LD A,#37 LD BC,0*256+Dss.F_First RST #10 JP C,ERROR LD A,(PATHF) LD (PRM1+0),A LD A,":" LD (PRM1+1),A LD A,0 LD (PRM1+2),A LD HL,SER_NUM LD DE,PRM2 CALL PUTPRM CALL GETPATH LD HL,PATHF LD DE,PRM3 CALL PUTPRM 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) INC HL LD (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 #10 JR NC,DIRNEX CALL ORDERS RET ORDERS LD HL,(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 S_HIGH DW 0 ;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 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 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 STRLOOP 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,STRLOOP INC H JR STRLOOP 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 ; LD A,0 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 #20 JR NZ,ALR LD A,#30 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),#20 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,#30 LD (HL),C INC HL LD (HL),A INC HL RET 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 " ",0 SIZEBFF DB "0 000 000 000",0,0 ;------------------- VERS LD C,Dss.Version RST #10 PUSH BC LD A,D LD HL,PRM1 CALL GETnoZERO LD A,"." LD (HL),A INC HL LD A,E CALL GETnoZERO LD A,"." LD (HL),A INC HL POP BC LD A,C CALL GETnoZERO XOR A LD (HL),A LD DE,VERSMSG JP MESSAGE GETnoZERO: LD B,#2F .loop: INC B SUB 10 JR NC,.loop ADD A,10+"0" LD C,A LD A,"0" CP B LD A,C JR Z,.mdec LD (HL),B INC HL .mdec: LD (HL),A INC HL SCF RET GETyesZERO: LD B,#2F .loop: INC B SUB 10 JR NC,.loop ADD A,10 LD (HL),B INC HL RET Z ADD A,"0" LD (HL),A INC HL RET HELP LD DE,HELPMSG CALL MESSAGE RET CEXIT LD A,(TASKX) DEC A DEC A RET Z POP HL QUIT LD B,0 LD C,Dss.Exit RST #10 RET ERR_MSG INC DE LD HL,ERR0 LD BC,ERR1-ERR0 CALL LCPIR CALL PRINTZ CALL CRLF JP CRLF MESSAGE CALL FMESAGE CALL PRINTZ CALL GETXY RET FMESAGE INC DE LD HL,MSG0 LD BC,MSG1-MSG0 LCPIR XOR A CPIR RET PO RET NZ DEC DE LD A,D OR E JP NZ,LCPIR RET PUTPRM LD BC,15 PUTPRMA LD A,(HL) LDI RET PO OR A JR NZ,PUTPRMA RET PRINTZ LD A,(HL) INC HL OR A RET Z CP "%" JR NZ,PRINTZ2 LD A,(HL) INC HL SUB "1" PUSH HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD BC,PRM1 ADD HL,BC LD C,Dss.PChars RST #10 POP HL JR PRINTZ PRINTZ2 LD C,Dss.PutChar RST #10 JP PRINTZ ROOT DB "C:",#5C,0 ALLFS DB "*.*",0 SER_NUM DB "C37F-73AB",0 EXTBF DS 4 BATBF DB "BAT" ECHOON DB "ON",0 ECHOOFF DB "OFF",0 DIR1MSG EQU 0 VERSMSG EQU 1 DATEMSG EQU 2 TIMEMSG EQU 3 PAUSMSG EQU 4 ILLGMSG EQU 5 ECHOMSG EQU 6 ON__MSG EQU 7 OFF_MSG EQU 8 DIR2MSG EQU 9 DIR3MSG EQU 10 HELPMSG EQU 11 MSG0 DB 0 DB "Volume in drive %1 has no label",CR,LF ; !FIXIT DB "Volume Serial number is %2",CR,LF DB "Directory of %3",CR,LF,CR,LF,0 DB "Estex DSS: Version %1",CR,LF,0 ;R02 DB "Current date: %1",CR,LF,0 DB "Current time: %1",CR,LF,0 DB "Press any key to continue . . .",CR,LF,0 DB "Invalid parametr",CR,LF,0 DB "Echo is %1",CR,LF,0 DB "on",0 DB "off",0 DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 ; FILENAME EXT SIZE DATE TIME DB "%1 %2 %3 %4 %5",CR,LF,0 DB "COMMANDS:",CR,LF,CR,LF DB "CD DEL HELP RD SET " DB " ",CR,LF DB "CHDIR DIR MD REN TIME " DB " ",CR,LF DB "CLS ERASE MKDIR RENAME VER " DB " ",CR,LF DB "DATE EXIT PATH RMDIR VERSION " DB " ",CR,LF DB 0 MSG1 ERR0 DB #00 DB "Bad command or file name",0 DB "Invalid function",0 DB "Invalid drive number",0 DB "File not found",0 DB "Path not found",0 DB "Invalid handle",0 DB "Extended error 6",0 DB "File exist",0 DB "File read only",0 DB "Root overflow",0 DB "No free space",0 DB "Directory not empty",0 DB "Can't delete current directory",0 DB "Invalid media",0 DB "Unknown operation",0 ;R02 DB "Directory exist",0 DB "Invalid filename",0 DB "Invalid EXE-file",0 DB "Not supported EXE-file",0 DB "Access denied",0 DB "Not ready",0 DB "Seek error",0 DB "Sector not found",0 DB "CRC error",0 DB "Write protect",0 DB "Read error",0 DB "Write error",0 DB "Drive failure",0 DB "Extended error 28",0 DB "Extended error 29",0 DB "No free memory",0 DB "Invalid memory block",0 DB "Extended error 32",0 DB "Extended error 33",0 DB "Extended error 34",0 DB "35",0 DB "36",0 DB "37",0 DB "38",0 DB "39",0 DB "40",0 DB "41",0 DB "42",0 DB "43",0 DB "44",0 DB "45",0 DB "46",0 DB "47",0 DB "48",0 DB "49",0 DB "50" DB 0 ERR1 PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DTA ;DEFS 256,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PATHF ;DEFS 256,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BAT_FM DB 0 BAT_LEN DB 0 ECHOFLG DB 0 PATHLEN DB 0 PATH ;DEFS 40,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0 GETPATH: LD C,2 RST #10 LD HL,PATHF ADD A,"A" LD (HL),A INC HL LD (HL),":" INC HL LD C,30 RST #10 LD HL,PATHF LD DE,PATH LDI LDI LDI PUSH HL XOR A LD BC,34 CPIR JP NZ,LONGP LD A,34 SUB C LD C,A POP HL LDIR JR PHLEN LONGP CPIR LD A,"." LD (DE),A INC DE LD (DE),A INC DE LD (DE),A INC DE LD BC,31 AND A SBC HL,BC LDIR POP HL PHLEN LD HL,PATH LD BC,40 XOR A CPIR LD A,39 SUB C LD (PATHLEN),A LD C,A INC C INC C LD A,80 SUB C LD (WINDOW),A RET PRINT_B LD C,A PRINTBB PUSH BC CALL PRINTX POP BC LD A,C DJNZ PRINTBB RET TEMPXY DW 0 CR_ LD C,Dss.Cursor RST #10 LD E,0 JP LOCAT LF_ LD C,Dss.Cursor RST #10 LD A,D CP #1F JP Z,LFF INC D JP LOCAT LFF PUSH HL PUSH DE LD BC,#018A LD DE,#0020 EI HALT DI RST ToBIOS LD DE,#1F00 CALL LOCAT LD A,#20 LD BC,#5082 RST ToBIOS EI POP DE CALL LOCAT POP HL RET PRINTX CP #20 JP NC,CHAR CP #0D JP Z,CR_ CP #0A JP Z,LF_ CHAR PUSH BC LD BC,#0182 RST ToBIOS POP BC RET LOCAT LD (TEMPXY),DE LD C,Dss.Locate RST #10 RET ;PRINTX LD C,Dss.PutChar ; RST #10 ; RET CEDIT PUSH IX POP HL INC HL INC HL LD (ETXS),HL XOR A LD (POSIT),A LD (SHIFT),A EDIT1 LD DE,(ETXS) CALL PRINT_S CALL KEY CP 13 RET Z LD HL,EDIT1 PUSH HL AND A LD HL,#5400 SBC HL,DE JP Z,BACK AND A LD HL,#5600 SBC HL,DE JP Z,FORW CP #08 JP Z,DELET CP #20 RET C EX AF,AF' LD A,(IX+1) CP (IX+0) CCF RET C LD A,(IX+1) LD E,A LD D,0 LD HL,(ETXS) ADD HL,DE LD A,(POSIT) LD E,A LD A,(IX+1) SUB E JR Z,ADD_SM LD B,D LD C,A LD D,H LD E,L DEC HL LDDR EX DE,HL ADD_SM EX AF,AF' LD (HL),A LD A,(POSIT) INC A LD (POSIT),A LD (MAIN_X),A INC (IX+1) LD HL,(ETXE) INC HL LD (ETXE),HL LD HL,SHIFT SUB (HL) CP (IX-1) RET C LD A,(STEP) ADD A,(HL) LD (HL),A ; CALL PAGE RET BACK LD A,(POSIT) OR A RET Z ;JP Z,BCK DEC A LD (POSIT),A LD (MAIN_X),A INC A LD HL,SHIFT SUB (HL) RET NZ LD A,(STEP) LD E,A LD A,(HL) SUB E LD (HL),A ; CALL PAGE RET FORW LD A,(POSIT) CP (IX+1) RET Z ; JP Z,FRD INC A LD (POSIT),A LD (MAIN_X),A LD HL,SHIFT SUB (HL) CP (IX-1) RET C LD A,(STEP) ADD A,(HL) LD (HL),A ; CALL PAGE RET DELET LD A,(POSIT) OR A RET Z ; JP Z,LINKSTR LD HL,(ETXS) LD E,A LD D,0 ADD HL,DE LD A,(IX+1) SUB E JR Z,SUB_SM LD B,D LD C,A LD D,H LD E,L DEC DE LDIR SUB_SM XOR A DEC HL LD (HL),A LD A,(POSIT) DEC A LD (POSIT),A LD (MAIN_X),A DEC (IX+1) LD HL,(ETXE) DEC HL LD (ETXE),HL LD HL,SHIFT INC A SUB (HL) RET NZ LD A,(STEP) LD E,A LD A,(HL) SUB E LD (HL),A ; CALL PAGE RET KEY ;RES 5,(IY+1) LD A,(SHIFT) LD E,A LD A,(POSIT) SUB E INC A LD HL,PATHLEN ADD A,(HL) LD (_X+1),A LD A,(POSIT) CP (IX+1) JP C,KEY0 LD A,#20 LD (_A+1),A JP KEY1 KEY0 LD E,A LD D,0 LD HL,(ETXS) ADD HL,DE LD A,(HL) LD (_A+1),A KEY1 CALL CURSORF EI HALT LD C,Dss.ScanKey RST #10 JP Z,KEY1 RET CURSORX DB #00 CURSORF LD A,05 DEC A LD (CURSORF+1),A RET NZ LD A,05 LD (CURSORF+1),A LD DE,(TEMPXY) _X LD E,#00 CALL LOCAT LD A,(CURSORX) XOR #FF LD (CURSORX),A LD A,"_" JR NZ,YEPCUR _A LD A,#20 YEPCUR CALL PRINTX EI RET RES_CUR LD A,(CURSORX) OR A RET Z XOR #FF LD (CURSORX),A LD DE,(TEMPXY) LD A,(_X+1) LD E,A CALL LOCAT LD A,(_A+1) JP PRINTX PRINT_S PUSH DE CALL GETXY ;;; LD DE,(TEMPXY) LD E,0 CALL LOCAT LD HL,PATH CALL PRINTZ LD A,">" CALL PRINTX POP DE EX DE,HL SH LD BC,#0000 ADD HL,BC LD A,(SHIFT) LD C,A LD A,(IX+1) SUB C JP Z,EMT_STR LD B,A LD A,(IX-1) SUB B JR NC,PR_S LD B,(IX-1) PR_S PUSH BC LD C,#86 RST ToBIOS POP BC EMT_STR LD A,(IX-1) SUB B EI RET Z LD B,A LD C,#82 LD A,#20 RST ToBIOS EI RET SHIFT EQU SH+1 GET_CMD LD D,XH LD E,XL EX DE,HL LD E,(HL) INC HL LD D,0 EX DE,HL ADD HL,DE LD (HL),0 NEXTPRM EX DE,HL SKIPSP LD A,(HL) INC HL CP " " RET C JR Z,SKIPSP DEC HL CP "/" JR NZ,PROCESS LD DE,BUFFER LD C,Dss.GSwitch RST #10 PUSH AF EX DE,HL ;SAVE HL IN DE LD HL,BUFFER INC HL CALL ISWITCH POP AF JP NC,NEXTPRM XOR A RET PROCESS LD DE,CMDLINE LD BC,#00FF NLDI LD A,(HL) LDI INC B CP " " JR NC,NLDI DEC B LD A,B LD (CMDLINE-1),A LD A,(RUNMODE) OR #40 ;PROCESS LD (RUNMODE),A XOR A RET ISWITCH LD A,(HL) CP "a" JR C,NUP CP "{" JR NC,NUP SUB #20 NUP PR000 CP "P" JR NZ,PR001 LD A,(RUNMODE) OR #80 ;PRIMARY CONSOLE LD (RUNMODE),A RET PR001 CP "S" JR NZ,PR002 LD A,(RUNMODE) OR #20 ;SECONDARY CONSOLE LD (RUNMODE),A PR002 CP "C" JR NZ,PR003 LD A,(RUNMODE) OR #10 ;RUN BATCH FILE LD (RUNMODE),A PR003 RET TASKX DB 0 RUNMODE DB 0 STEP DB 8 MAIN_X DB 0 LEN_OLD DB #00 POSIT DB #00 ETXS DW 0 ETXE DW 0 ; +0 - Size buffer ; +1 - Amount simbols ; -1 - Scroll Window WINDOW DB #50 BUFFERC DB #FF LEN_NEW DB #00 CMDLINE ;DEFS #100,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 TMPLINE DS 256 BATNAME DB "system.bat",0 PRMLINE DS 256 BUFFER: BAT_BUFFER.size EQU 128 BATBUFF: BLOCK BAT_BUFFER.size+1,0 ; OUTEND ; ;[End]