;[BEGIN] ; ; SYSTEM.EXE /S /P ; ; /P Primary command processor ; /S Secondary command processor ; /C Execute batch file ;=====================================================================[] ;Rev. Date Name Description ;---------------------------------------------------------------------[] ;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION ;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти ;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений ;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP ;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 ;=====================================================================[] includelua 'Shared_includes/lua/Functions.lua' include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/dss_equ.inc' include 'console/version.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 " "+1 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 JR Z,.exit LD A,L LD (CMDLINE-1),A CALL CMDMODE .exit: 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 .loop: LD A,(HL) LD (DE),A CP ' ' INC HL JR C,.loop2 INC DE DJNZ .loop SCF RET .loop2: LD A,(HL) CP ' ' RET NC INC HL DJNZ .loop2 ;R08 PUSH DE CALL READBAT POP DE LD HL,BATBUFF LD A,(BAT_LEN) LD B,A OR A JR NZ,.loop2 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 ;!TEST LD HL,CMDLINE-1 LD DE,CMDLINE LD (HL),0 LD BC,#7F ;!HARDCODE длина CMDLINE 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 (PRINT_S.SHIFT),A LD (LEN_NEW),A LD IX,CMDLINE-2 CALL CEDIT CALL RES_CUR ;!FIXIT scroll починить, тут тоже влияет вроде 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 'DIR' : DW DIR DZ 'ECHO' : DW CECHO DZ 'PATH' : DW CPATH DZ 'MD' : DW CMKDIR DZ 'REN' : DW CRENAM DZ 'DEL' : DW CDELET DZ 'RD' : DW CRMDIR DZ 'SET' : DW CSET DZ 'TIME' : DW CTIME DZ 'DATE' : DW CDATE DZ 'VER' : DW VERS DZ 'CLS' : DW CLS DZ 'CHDIR' : DW CCHDIR DZ 'MKDIR' : DW CMKDIR DZ 'RENAME' : DW CRENAM DZ 'ERASE' : DW CDELET DZ 'RMDIR' : DW CRMDIR DZ 'EXIT' : DW CEXIT DZ 'HELP' : DW HELP DZ 'VERSION' : DW VERS DZ 'REBOOT' : DW REBOOT 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 PATHSTR DB "PATH=",0 CPATH LD A,(DE) OR A JP Z,PRNEPATH INC DE CP 9 ; Tab 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 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,EVALSTR 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 EVALSTR ;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 EVALSTR ;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,"0" ;#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 " ",0 SIZEBFF DB "0 000 000 000",0,0 ;------------------- ;!FIXIT лучше такую функцию в DSS пихнуть ; прочитать BPB диска /* read_disk_info: .disk+1: ld a,0 ; сохр. номер диска ld c,Dss.DRV.Open ; open device rst ToDSS.DRV jr c,get_inf_data_err ld a,(read_disk_info.disk) ld de,BPB ; буфер ld c,Dss.DRV.GetBPB ; get BPB rst ToDSS.DRV ;push af ld a,(read_disk_info.disk) ; номер диска ld c,Dss.DRV.Close ; close device rst ToDSS.DRV ;pop af ;jr c,get_inf_data_err get_inf_data_err: ; Серийный номер лог. диска ld hl,(BPB+41) ; ст.часть ld de,SER_NUM ; xxxx-xxxx call hex16 ld a,"-" ld (de),a inc de ld hl,(BPB+39) ; мл.часть call hex16 ; ; Метка диска ld a,(read_disk_info.disk) ; номер диска cp 2 ; меньше "C:" ? jr nc,get_inf_data1 ; метка в BPB ; floppy, метка - как запись файла ld c,Dss.ChDisk ; уст. диск rst ToDSS ; уст. корень диска ld hl,ROOT ; "\",0 ld c,Dss.ChDir rst ToDSS ; поиск метки ld hl,ALLFS ; "*.*" имя метки ld de,DTA ; куда ld a,8 ; атрибут метки тома ld bc,0*256 + Dss.F_First ; f_first, формат 11 rst ToDSS push af call restore_path ; восст. тек. путь pop af jr c,no_volume_label ; метки нет ld hl,DTA+33 ; начало метки в буфере f_first jr volume_label ; get_inf_data1: ld hl,BPB+53 ; конец метки в BPB ld a,(hl) cp " " ; есть метка ? ld hl,BPB+43 ; начало метки в BPB jr nz,volume_label ; да ; нет метки no_volume_label: ld hl,volume_string1 ; "has no label " ld de,volume_string ; куда ld bc,14 ldir ret ; есть метка volume_label: ex de,hl ld hl,volume_string ; куда ld (hl),"i" inc hl ld (hl),"s" inc hl ld (hl)," " inc hl ex de,hl ; скопир. имя метки ld bc,11 ; макс. длина метки ld a,(hl) cp " "+1 jr nc,$+6 inc hl dec c jr $-7 ld a,11 sub c ldir ld b,a or a ; длина метки 11 симв. ? ret z ; да ; дополнить хвост. пробелами ld (de),a inc de djnz $-2 ret */ ; Вывод HL в hex-формате ; de=буфер ; hl=число hex16: ld a,h call hex8 ld a,l ; вывод "a" hex8: push af rrca rrca rrca rrca call $+4 pop af and 0Fh add a,90h daa adc a,40h daa ld (de),a inc de ret ;------------------- VERS: LD C,Dss.Version RST ToDSS LD L,D LD H,E LD DE,PRM1 CALL .Set_Ver_to_PRM ; set DSS version ;R13 LD HL,256*CONSOLE_MODF + CONSOLE_VERS LD BC,CONSOLE_BUILD LD DE,PRM2 CALL .Set_Ver_to_PRM ; set Shell version ;R13 LD DE,VERSMSG JP MESSAGE ; вход: hl=число, de=буфер .num_ver: .num_mod: ld ix,.tmp1__ res 7,(ix+0) jr .decim ; вход: hl=число, de=буфер .num_build: ld ix,.tmp1__ res 7,(ix+0) ld bc,100 ; 100 call .num16 .decim: ld bc,10 ; 10 call .num16 ld a,l add a,"0" jr .num16_exit .tmp1__: BYTE 0 .num16: ld a,'0'-1 and a inc a sbc hl,bc jr nc,$-3 add hl,bc cp "0" jr z,$+6 set 7,(ix+0) bit 7,(ix+0) ret z .num16_exit: ld (de),a ; сохр. в буфере inc de ret ; ; Вход: ; L - номер версии (0..9) ; H - номер модификации (0..99) ; BC - номер билда (0..999) ; DE - номер параметра .Set_Ver_to_PRM: PUSH BC PUSH HL LD H,0 CALL .num_ver ;decim2 номер версии (0..9) LD A,'.' LD (DE),A INC DE POP HL LD L,H LD H,0 CALL .num_mod ;decim2 номер модификации (0..99) POP HL LD A,'.' LD (DE),A INC DE CALL .num_build ;decim3 номер билда (0..999) XOR A LD (DE),A RET /* VERS: LD C,Dss.Version RST ToDSS 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 BC,Dss.Exit RST ToDSS RET ;----------------------------------------------------------------------- ;R12 REBOOT: DI LD C,BIOS.FullInit RST ToBIOS LD BC,2*256 + BIOS.REINIT RST ToBIOS DI HALT ;R12 ;----------------------------------------------------------------------- ERR_MSG: INC DE LD HL,ERR0 LD BC,ERR0.Size CALL LCPIR CALL PRINTZ CALL CRLF JP CRLF MESSAGE: CALL FMESAGE CALL PRINTZ ;CALL GETXY RET FMESAGE: INC DE LD HL,MSG0 LD BC,MSG0.Size LCPIR: XOR A CPIR RET PO RET NZ ;R11 XOR A CP (HL) JR Z,.no_mess ; DEC DE LD A,D OR E JP NZ,LCPIR RET .no_mess: INC HL RET PUTPRM: LD BC,15 PUTPRMA: LD A,(HL) LDI RET PO OR A JR NZ,PUTPRMA RET ;!FIXIT заменить на PUTPRMA с выставлением перед вызовом BC = 255 например ; Скопир. строку (с нулем) ; (hl) -> (de) //copy_string: // ld a,(hl) // ldi // or a // jr nz,copy_string // ret PRINTZ: LD A,(HL) INC HL OR A RET Z CP "%" JR NZ,.char 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 ToDSS POP HL JP PRINTZ .char: LD C,Dss.PutChar RST ToDSS JP PRINTZ ROOT: DB '\',0 ALLFS: DB "*.*",0 SER_NUM: DB "C37F-73AB",0 //SER_NUM DB "XXXX-XXXX",0 EXTBF: BLOCK 4,0 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 ; 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 ; 1 DB "Estex DSS: Version %1",CR,LF DB "Console: Version %2",CR,LF,0 ;R13 ; 2 DB "Current date: %1",CR,LF,0 ; 3 DB "Current time: %1",CR,LF,0 ; 4 DB "Press any key to continue . . .",CR,LF,0 ; 5 DB "Invalid parametr",CR,LF,0 ; 6 DB "Echo is %1",CR,LF,0 ; 7 DB "on",0 ; 8 DB "off",0 ; 9 DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 ; 10 FILENAME EXT SIZE DATE TIME DB "%1 %2 %3 %4 %5",CR,LF,0 ; 11 DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF DB "MD | MKDIR TIME ECHO EXIT ",CR,LF DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 ;R11 BYTE 0 DZ "Unknown command" ; .Size EQU $-MSG0 ;----------------------------------------------------------------------- ;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются ERR0: DB #00 DZ "Bad command or file name" DZ "Invalid function" ; 01 - неверный номер функции DZ "Invalid drive number" ; 02 - неправильный номер устройства DZ "File not found" ; 03 - файл не обнаружен DZ "Path not found" ; 04 - неверный путь DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор DZ "Too many open files" ; 06 - нет свободного файлового манипулятора DZ "File already exist" ; 07 - файл существует DZ "File read only" ; 08 - файл только для чтения DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) DZ "No free space" ; 10 - нет свободного места на диске DZ "Directory not empty" ; 11 - каталог не пуст DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог DZ "Invalid media" ; 13 - неизвестный формат DZ "Unknown operation" ;R02 ; 14 - невозможная операция DZ "Directory exist" ; 15 - каталог уже есть DZ "Invalid filename" ; 16 - неверное имя DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла DZ "Access denied" ; 19 - ресурс не доступен DZ "Not ready" ; 20 - нет готовности DZ "Seek error" ; 21 - ошибка позиционирования DZ "Sector not found" ; 22 - сектор не найден DZ "CRC error" ; 23 - ошибка CRC DZ "Write protect" ; 24 - защита записи DZ "Read error" ; 25 - ошибка чтения DZ "Write error" ; 26 - ошибка записи DZ "Drive failure" ; 27 - сбой диска DZ "Extended error 28" DZ "Extended error 29" DZ "Not enough memory" ; 30 - недостаточно памяти DZ "Invalid memory block" ; 31 - несуществующий блок памяти DZ "Extended error 32" DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной DZ "Extended error 34" DZ "Too many files in directory" ; 35 - слишком много файлов в директории DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 DZ "Operation aborted by user" ; 37 - операция прервана пользователем DZ "Common error" ; 38 - общая ошибка DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения DZ "40" DZ "41" DZ "42" DZ "43" DZ "44" DZ "45" DZ "46" DZ "Wrong video mode" ; 48 - неправильный видеорежим DZ "48" DZ "49" DZ "50" ;R11 DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: DZ "Unknown error" ; .Size EQU $-ERR0 ;----------------------------------------------------------------------- GETPATH: LD C,Dss.CurDisk RST ToDSS LD HL,PATHF ADD A,"A" LD (HL),A INC HL LD (HL),":" INC HL LD C,Dss.CurDir RST ToDSS LD HL,PATHF LD DE,PATH LDI LDI LDI PUSH HL XOR A LD BC,34 ;!HARDCODE CPIR JP NZ,LONGP LD A,34 ;!HARDCODE 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 ;!HARDCODE path XOR A CPIR LD A,39 ;!HARDCODE 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 ToDSS LD E,0 JP LOCAT LF_ LD C,Dss.Cursor RST ToDSS 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 ' ' JP NC,CHAR CP #0D JP Z,CR_ CP #0A JP Z,LF_ CHAR: PUSH BC LD BC,1*256 + BIOS.LP_PRINT_SYM RST ToBIOS POP BC RET LOCAT LD (TEMPXY),DE LD C,Dss.Locate RST ToDSS 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 (PRINT_S.SHIFT),A EDIT1 LD DE,(ETXS) CALL PRINT_S CALL KEY CP 13 ; enter code 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,PRINT_S.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,PRINT_S.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,PRINT_S.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,PRINT_S.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,(PRINT_S.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 ToDSS 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 .SHIFT+1: 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,BIOS.LP_PRINT_LINE2 RST ToBIOS POP BC .EMT_STR: LD A,(IX-1) SUB B EI RET Z LD B,A LD A,' ' LD C,BIOS.LP_PRINT_SYM RST ToBIOS EI RET 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 ToDSS 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 0 POSIT DB 0 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 BATNAME DB "system.bat",0 BAT_BUFFER.size EQU 128 ;!FIXIT BAT_BUFFER LENGTH /* ; Структура строки ввода ~input line~ struct_input_line: db max_len_comline ;+0 254 макс. число ввод. символов db 0 ;+1 флаг ReadyString db 0 ;+2 X тек. полож. курсора в пределах строки db 0 ;+3 X смещ. строки за левый край (в символах) db 0 ;+4 число введенных символов ds max_len_comline+1 ;+5 строка ввода */ STRUCT BUFFERS_STRUCT CMDLINE BLOCK 256,0 ;!HARDCODE cmdline size TMPLINE BLOCK 256,0 PRMLINE BLOCK 256,0 ;BUFFER ;BATBUFF SHARED_BUFFER BLOCK BAT_BUFFER.size+1,0 ; PRM1 BLOCK 16,0 PRM2 BLOCK 16,0 PRM3 BLOCK 16,0 PRM4 BLOCK 16,0 PRM5 BLOCK 16,0 PRM6 BLOCK 16,0 PRM7 BLOCK 16,0 PRM8 BLOCK 16,0 PRM9 BLOCK 16,0 DTA BLOCK 256,0 DTA_2 BLOCK 256,0 BPB BLOCK 512,0 PATHF BLOCK 256,0 BAT_FM DB 0 BAT_LEN DB 0 ECHOFLG DB 0 PATHLEN DB 0 PATH BLOCK 40,0 ;!HARDCODE PATH LENGTH ENDS WORK_BUFFERS BUFFERS_STRUCT = $ CMDLINE EQU WORK_BUFFERS.CMDLINE TMPLINE EQU WORK_BUFFERS.TMPLINE PRMLINE EQU WORK_BUFFERS.PRMLINE BUFFER EQU WORK_BUFFERS.SHARED_BUFFER BATBUFF EQU WORK_BUFFERS.SHARED_BUFFER PRM1 EQU WORK_BUFFERS.PRM1 PRM2 EQU WORK_BUFFERS.PRM2 PRM3 EQU WORK_BUFFERS.PRM3 PRM4 EQU WORK_BUFFERS.PRM4 PRM5 EQU WORK_BUFFERS.PRM5 PRM6 EQU WORK_BUFFERS.PRM6 PRM7 EQU WORK_BUFFERS.PRM7 PRM8 EQU WORK_BUFFERS.PRM8 PRM9 EQU WORK_BUFFERS.PRM9 DTA EQU WORK_BUFFERS.DTA DTA_2 EQU WORK_BUFFERS.DTA_2 BPB EQU WORK_BUFFERS.BPB ;!TEST PATHF EQU WORK_BUFFERS.PATHF BAT_FM EQU WORK_BUFFERS.BAT_FM BAT_LEN EQU WORK_BUFFERS.BAT_LEN ECHOFLG EQU WORK_BUFFERS.ECHOFLG PATHLEN EQU WORK_BUFFERS.PATHLEN PATH EQU WORK_BUFFERS.PATH DISPLAY "BUFFERS_STRUCT = ",/D,BUFFERS_STRUCT DISPLAY "WORK_BUFFERS start = ",/H,WORK_BUFFERS DISPLAY "WORK_BUFFERS end = ",/H,WORK_BUFFERS+BUFFERS_STRUCT /* CMDLINE BLOCK 256,0 TMPLINE BLOCK 256,0 PRMLINE BLOCK 256,0 BUFFER: BATBUFF: BLOCK BAT_BUFFER.size+1,0 ; PRM1 BLOCK 16,0 PRM2 BLOCK 16,0 PRM3 BLOCK 16,0 PRM4 BLOCK 16,0 PRM5 BLOCK 16,0 PRM6 BLOCK 16,0 PRM7 BLOCK 16,0 PRM8 BLOCK 16,0 PRM9 BLOCK 16,0 DTA: BLOCK 256,0 PATHF: BLOCK 256,0 BAT_FM: DB 0 BAT_LEN: DB 0 ECHOFLG: DB 0 PATHLEN: DB 0 PATH: BLOCK 40,0 ;!FIXIT PATH LENGTH */ OUTEND ; ;[End]