;[BEGIN] ;//MODULE: EXECUTE ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE ;R02 24-05-1999 DNS FIX CREATE PSP AND ; MOVE EXEC STACK ;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC ;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH ;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX ;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING ;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH ;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR ;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR ;--------------------------------------------------------------- ; ; APPLICATION INFO ;==================== ; ; B = 0 - GET APP_PARAM ; B = 1 - GET APP_PATH ; B = 2 - GET APP_FULLNAME LAST_PSP_PTR DW 0 APPINFO INC B APPINF0 DJNZ APPINF1 EX DE,HL XOR A LD (DE),A LD HL,(LAST_PSP_PTR) LD C,(HL) INC C RET Z INC HL LDIR AND A RET APPINF1 DJNZ APPINF2 EX DE,HL LD HL,(LAST_PSP_PTR) LD C,(HL) INC HL ADD HL,BC INC HL INC HL PUSH HL LD BC,#0100 XOR A CPIR LD A,#5C ;"\" CPDR INC HL INC HL POP BC AND A SBC HL,BC LD A,B ;EX HL,A,BC LD B,H LD H,A LD A,C LD C,L LD L,A LDIR XOR A LD (DE),A RET APPINF2 DJNZ APPINF3 EX DE,HL LD HL,(LAST_PSP_PTR) LD C,(HL) INC HL ADD HL,BC INC HL INC HL APINF2 LD A,(HL) LDI OR A JR NZ,APINF2 RET APPINF3 LD A,ERR_INVALID_FUNCTION SCF RET ;=================== function 45H =================== ; HL - Input command line GLOB_PR EQU 7 ;%10000000 DRIV_PR EQU 3 ;%00001000 PATH_PR EQU 2 ;%00000100 EXTN_PR EQU 1 ;%00000010 NAM_PR EQU 0 ;%00000001 EX_PATH EXX LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH LD (NM_PATH),HL LD HL,NM_NAME_A LD (NM_NAME),HL LD HL,NM_EXTN_A LD (NM_EXTN),HL LD HL,NM_DRIVE_A LD (NM_DRIVE),HL EXX INC B DEC B JR Z,EX_GET_ALL ;0 DEC B JR Z,EX_GET_DRIVE ;1 DEC B JR Z,EX_GET_PATH ;2 DEC B JR Z,EX_GET_NAME ;3 DEC B JR Z,EX_GET_TYPE ;4 DEC B JR Z,EX_GET_ALL_EX ;5 DEC B JR Z,EX_RESR ;6 DEC B JP Z,GSWITCH ;7 DEC B JP Z,GETNAME ;8 DEC B JP Z,MASK ;9 EX_RESR LD A,1 SCF RET EX_GET_DRIVE LD (NM_DRIVE),DE CALL EX_FULL RET C LD DE,(NM_DRIVE) LD A,(DE) DEC A CP #FF RET Z CP "A"-1 JR C,ERGD001 CP "Z" JR NC,ERGD001 SUB "A"-1 RET ERGD001 LD A,2 SCF RET EX_GET_PATH LD (NM_PATH),DE JR EX_FULL EX_GET_NAME LD (NM_NAME),DE JR EX_FULL EX_GET_TYPE LD (NM_EXTN),DE JR EX_FULL EX_GET_ALL JR EX_FULL EX_GET_ALL_EX EX DE,HL LD C,(HL) INC HL LD B,(HL) INC HL LD (NM_DRIVE),BC LD C,(HL) INC HL LD B,(HL) INC HL LD (NM_PATH),BC LD C,(HL) INC HL LD B,(HL) INC HL LD (NM_NAME),BC LD C,(HL) INC HL LD B,(HL) LD (NM_EXTN),BC EX DE,HL JR EX_FULL EX_FULL EX AF,AF' EXX XOR A LD HL,(NM_PATH) LD (HL),A LD HL,(NM_NAME) LD (HL),A LD HL,(NM_EXTN) LD (HL),A LD HL,(NM_DRIVE) LD (HL),A EXX EX AF,AF' EX_PAT0 LD DE,TMPBUF LD BC,#0D01 EX_PAT1 LD A,(HL) CALL UPPER LD (DE),A INC HL INC DE INC C CP #5C ; \ JR Z,PATH_YEP CP ":" JR Z,DRIVE_YEP CP #21 JR C,NAME_YEP CP "?" JR Z,GLOBP1 CP "*" JR Z,GLOBP1 EX_PAT2 DJNZ EX_PAT1 LD A,16 SCF RET GLOBP1 EX AF,AF' SET GLOB_PR,A EX AF,AF' JR EX_PAT2 NAME_YEP LD A,2 CP C JR Z,NOFNAME PUSH HL LD HL,TMPBUF LD DE,(NM_NAME) LD B,0 DEC C DEC C LD A,C LDIR LD C,A XOR A LD (DE),A LD HL,(NM_NAME) LD A,"." CPIR JR NZ,NOEXTN LD C,3 LD DE,(NM_EXTN) EXTSK0 LD A,(HL) OR A JR NZ,EXTSK1 LD A,#20 DEC HL EXTSK1 LD (DE),A INC HL INC DE DEC C JR NZ,EXTSK0 XOR A LD (DE),A EX AF,AF' SET EXTN_PR,A EX AF,AF' NOEXTN EX AF,AF' SET NAM_PR,A EX AF,AF' POP HL NOFNAME EX AF,AF' AND A RET DRIVE_YEP XOR A LD (DE),A PUSH HL LD HL,TMPBUF LD DE,(NM_DRIVE) LD B,0 LDIR POP HL EX AF,AF' SET DRIV_PR,A EX AF,AF' JP EX_PAT0 PATH_YEP XOR A LD (DE),A PUSH HL PUSH BC LD HL,(NM_PATH) LD BC,#00FF CPIR DEC HL EX DE,HL LD HL,TMPBUF POP BC LD B,0 LDIR POP HL EX AF,AF' SET PATH_PR,A EX AF,AF' JP EX_PAT0 TMPBUF DB " ",#00 NM_DRIVE DW NM_DRIVE_A NM_NAME DW NM_NAME_A NM_EXTN DW NM_EXTN_A NM_PATH DW NM_PATH_A NM_DRIVE_A DB 0,0,0,0,0,0,0,0,0 NM_NAME_A DB " ",#00 NM_EXTN_A DB " ",0 NM_PATH_A EQU BUFFER ;DS 256 ;===================== function 45h end ================ ;ENTRY: HL - COMMAND LINE ; DE - SWITCH BUFFER ;EXIT: BUFFER GSWITCH XOR A LD (DE),A GSWIT1 LD A,(HL) INC HL CP " " RET C JR Z,GSWIT1 GSWIT2 LD (DE),A LD A,(HL) INC HL INC DE CP "!" JR NC,GSWIT2 CP " " LD A,0 LD (DE),A RET ;RET: HL - ALL MEMORY ; BC - FREE MEMORY FREEMEM LD C,#C0 RST #08 RET ; B - SIZE BLOCK ; RET: A - ID MEMORY BLOCK GETMEM LD C,#C2 RST #08 LD E,A LD A,30 RET C LD D,#00 LD HL,MEMTAB ADD HL,DE LD A,(TASK) LD (HL),A LD A,E AND A RET ; A - ID BLOCK RETMEM LD E,A LD D,#00 LD HL,MEMTAB ADD HL,DE LD A,(TASK) CP (HL) LD A,31 SCF RET NZ PUSH DE LD A,E LD C,#C3 RST #08 POP DE LD A,31 RET C LD HL,MEMTAB ADD HL,DE XOR A LD (HL),A RET ; A - ID BLOCK ; B - NEW SIZE SETMEM LD E,A LD D,#00 LD HL,MEMTAB ADD HL,DE LD A,(TASK) CP (HL) LD A,31 SCF RET NZ LD D,B PUSH DE LD A,E CALL SIZEBLK POP DE LD A,31 RET C LD A,B CP D RET Z JR C,INCMEM DECMEM LD B,D LD A,E LD C,#9D RST #08 LD A,B LD C,#C3 RST #08 XOR A RET INCMEM LD A,D SUB B LD B,A LD C,E PUSH BC LD C,#C2 RST #08 POP BC LD B,A LD A,30 RET C LD A,C LD C,#9E RST #08 XOR A RET SIZEBLK LD B,#FF LD C,A BLK001 INC B PUSH BC LD A,C LD C,#C4 RST #08 POP BC JR NC,BLK001 OR A SCF RET Z XOR A RET LEAVMEM LD HL,MEMTAB LD BC,256 LEVMEM LD A,(TASK) CPIR RET NZ PUSH HL PUSH BC DEC HL AND A LD DE,MEMTAB SBC HL,DE LD A,L CALL RETMEM POP BC POP HL JR LEVMEM ; B - LOGICAL PAGE ; A - ID BLOCK ; HL - BIT 15&14 WINDOW ; RET: A - PAGE (WIN) ; if B = 0FFh, then logical page number got from DE SETWIN BIT 7,H ;if 08000h or high? JR Z,SETWIN1 ;no, go to open in PAGE1 BIT 6,H ;if 0C000h or high? JR Z,SETWIN2 ;no, go to open in PAGE2 JR SETWIN3 ;yes, go to open in PAGE3 ; B - LOGICAL PAGE ; A - ID BLOCK ; RET: A - PAGE (WIN) SETWIN1 LD C,#C4 EX DE,HL RST #08 EX DE,HL RET C LD C,PAGE1 IN B,(C) OUT (C),A LD A,B RET SETWIN2 LD C,#C4 EX DE,HL RST #08 EX DE,HL RET C LD C,PAGE2 IN B,(C) OUT (C),A LD A,B RET SETWIN3 LD C,#C4 EX DE,HL RST #08 EX DE,HL RET C LD C,PAGE3 IN B,(C) OUT (C),A LD A,B RET EXEC INC B ;R03 DEC B ;R03 JP Z,EXEC0 ;R03 DEC B ;R03 JP Z,EXEC1 ;R03 LD A,ERR_INVALID_FUNCTION ;R03 SCF ;R03 RET ;R03 CHECKPATH LD A,(HL) INC HL CP #5C ;"\" RET Z CP "/" ;ALT SLASH RET Z CP "!" JR NC,CHECKPATH RET RELATIVE_DIR EQU 0 ABSOLUTE_DIR EQU 1 FINDPATH LD A,ENVPAGE CALL BANK PUSH AF CALL CURRDSK ADD A,"A" LD HL,TMP_CURDIR LD (HL),A INC HL LD A,":" LD (HL),A INC HL CALL CURRDIR CALL MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY NEXTPATHI LD E,(HL) INC HL LD D,(HL) INC HL BIT ABSOLUTE_DIR,(HL) INC HL PUSH HL PUSH BC EX DE,HL CALL Z,GOTO_CURDIR ; ;DBUG CALL DPRINT ; CALL CHDIR JR C,BADPATH LD HL,EXEBUFF LD DE,MASKARE CALL MASK JR C,BADPATH CALL TST_EXT JR C,BADPATH CALL SEARCH BADPATH POP BC POP HL JR NC,PATHFOUND DJNZ NEXTPATHI SCF PATHFOUND POP BC LD A,B OUT (PAGE3),A RET GOTO_CURDIR PUSH HL LD HL,TMP_CURDIR ; ;DBUG CALL DPRINT ; CALL CHDIR POP HL RET MAKE_PATH_ARRAY LD HL,PATH_PNT_ARRAY-1 ;R04 -1 LD DE,ENVTEMP-1 LD B,#00 NEXTAR LD (HL),C ;R04 INC HL ;R04 XOR A LD (DE),A LD C,A INC DE LD (HL),E INC HL LD (HL),D INC HL ;R04 LD (HL),C ;R04 INC HL INC B NEXTRT LD A,(DE) CP #5C ;\ JR NZ,NEXTCH NEXTDR SET ABSOLUTE_DIR,C NEXTRL ;SET RELATIVE_DIR,C NEXTCH LD A,(DE) CP ";" JR Z,NEXTAR INC DE ; CP "." ; JR Z,NEXTRL CP ":" JR Z,NEXTRT OR A JR NZ,NEXTCH LD (HL),C ;R04 INC HL ;R04 LD (HL),A INC HL LD (HL),A RET ENVPATH DB "PATH=",0 ;;; DEBUG ;;; ;DPRINT ; PUSH HL ; CALL PCHARS ; LD HL,C1310 ; CALL PCHARS ; POP HL ; RET ; ;C1310 DB 13,10,0 ;;; ENVTEMP EQU #FE00 TMP_CURDIR EQU #FD00 PATH_PNT_ARRAY EQU #FC80 INCTASK LD HL,TASK ;R08 INC (HL) ;R08 RET ;R08 DECTASK LD HL,TASK ;R08 DEC (HL) ;R08 RET ;R08 EXEC0 LD (CMDLINE),HL CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME LD HL,(CMDLINE) JR C,EXEC0_SHORT EXEC1 LD (CMDLINE),HL LD A,#01 LD (ACCESS),A CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE CALL MASK RET C CALL TST_EXT LD A,3 RET C CALL INCTASK ;R08 CALL OPENEXE JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM JR DECTASK ;R08 EXEC0_SHORT ;SHORT NAME ; TRY TO FIND IN CURRENT DIRECTORY LD A,#01 LD (ACCESS),A CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE CALL MASK RET C CALL TST_EXT LD A,3 RET C CALL INCTASK ;R08 LD HL,TASK ;R08 INC (HL) CALL OPENEXE JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM CALL DECTASK ;R08 ;R07 ;FILE NO FOUND, SEACHING IN PATH ; GET PATH AND ETC. LD HL,ENVPATH LD DE,ENVTEMP LD B,1 CALL ENVIRON LD HL,(CMDLINE) LD DE,EXEBUFF COPYEXN LD A,(HL) LDI OR A JR NZ,COPYEXN CALL FINDPATH LD HL,(CMDLINE) JR EXEC1 ;EXEC00 EXEC02 LD (EXE_FM),A LD HL,EXEBUFF LD DE,#0080 ;!#0200(512) ;R02 LD A,(EXE_FM) CALL READ JP C,ERREXE LD IX,EXEBUFF LD HL,(EXEBUFF) LD DE,#5845 SBC HL,DE LD A,17 SCF JP NZ,ERREXE LD A,(IX+3) OR A LD A,18 SCF JP NZ,ERREXE LD DE,(LOADER) LD A,E OR D JP NZ,PRELOAD LD L,A LD H,A PUSH HL POP IX LD B,#02 LD A,(EXE_FM) CALL MOVE_FP LD DE,(LD_ADDR) LD A,D AND #3F LD D,A ADD IX,DE LD DE,#0000 ADC HL,DE LD A,XH SLA A RL L RL H SLA A RL L RL H OR XL JR Z,NOINK INC HL NOINK LD A,H OR A JP NZ,ERREXE0 LD B,L CALL GETMEM JP C,ERREXE0 LD (EXE_MEM),A EXX POP DE LD HL,#0000 ADD HL,SP LD SP,(EXSTACK) PUSH HL PUSH DE IN A,(PAGE3) LD D,A IN A,(PAGE2) LD E,A IN A,(PAGE1) PUSH DE PUSH AF LD (EXSTACK),SP LD SP,HL EXX LD DE,RAMMAP LD BC,#00C4 LD A,(EXE_MEM) RST #08 LD (DE),A INC DE LD BC,#01C4 LD A,(EXE_MEM) RST #08 LD (DE),A INC DE LD BC,#02C4 LD A,(EXE_MEM) RST #08 LD (DE),A INC DE LD BC,#03C4 LD A,(EXE_MEM) RST #08 LD (DE),A LD HL,(CMDLINE) LD DE,SECBUF+1 CALL SCOPYS LD A,#80 SUB B LD (SECBUF),A LD SP,EXEBUFF+510 ;R02 LD A,#FF OUT (PAGE1),A OUT (PAGE2),A OUT (PAGE3),A LD HL,(LD_ADDR) LD DE,RAMMAP LD A,H AND #C0 CP #40 JR Z,FR4000 CP #80 JR Z,FR8000 CP #C0 JR Z,FRC000 FR4000 LD A,(DE) OUT (PAGE1),A INC DE FR8000 LD A,(DE) OUT (PAGE2),A INC DE FRC000 LD A,(DE) OUT (PAGE3),A CALL M_PSP LD HL,(OFFCOD2) LD IX,(OFFCOD1) LD B,#00 LD A,(EXE_FM) CALL MOVE_FP LD SP,#403F LD DE,(LD_ADDR) XOR A LD L,A LD H,A SBC HL,DE EX DE,HL LD HL,(LD_ADDR) LD A,(EXE_FM) CALL READ LD A,(EXE_FM) CALL CLOSE LD SP,(SP_REG) LD HL,(LD_ADDR) LD DE,#0080 AND A SBC HL,DE EX DE,HL LD XH,D LD XL,E LD HL,(PC_REG) LD DE,RETFAR PUSH DE PUSH HL RET RETFAR JP LEAVE TST_EXT LD HL,EXE_EXT LD DE,MASKARE+8 LD B,3 LD A,(DE) CP #20 JR NZ,TSTE1 LDI LDI LDI XOR A RET TSTE1 LD A,(DE) CP (HL) SCF RET NZ INC HL INC DE DJNZ TSTE1 XOR A RET ERREXE0 LD A,30 ERREXE PUSH AF LD A,(EXE_FM) CALL CLOSE LD HL,TASK DEC (HL) POP AF RET PRELOAD EX DE,HL LD DE,(LD_ADDR) LD A,D AND #3F LD D,A ADC HL,DE XOR A SLA H RLA SLA H RLA LD B,A LD A,H OR L JR Z,NOINK2 INC B NOINK2 CALL GETMEM JR C,ERREXE0 LD (EXE_MEM),A EXX POP DE LD HL,#0000 ADD HL,SP LD SP,(EXSTACK) PUSH HL PUSH DE IN A,(PAGE3) LD D,A IN A,(PAGE2) LD E,A IN A,(PAGE1) PUSH DE PUSH AF LD (EXSTACK),SP LD SP,HL EXX LD DE,RAMMAP LD BC,#00C4 LD A,(EXE_MEM) RST #08 LD (DE),A INC DE LD BC,#01C4 LD A,(EXE_MEM) RST #08 LD (DE),A INC DE LD BC,#02C4 LD A,(EXE_MEM) RST #08 LD (DE),A INC DE LD BC,#03C4 LD A,(EXE_MEM) RST #08 LD (DE),A LD HL,(CMDLINE) LD DE,SECBUF+1 CALL SCOPYS LD A,#80 SUB B LD (SECBUF),A LD SP,EXEBUFF+510 LD A,#FF OUT (PAGE1),A OUT (PAGE2),A OUT (PAGE3),A LD HL,(LD_ADDR) LD DE,RAMMAP LD A,H AND #C0 CP #40 JR Z,FR4000H CP #80 JR Z,FR8000H CP #C0 JR Z,FRC000H FR4000H LD A,(DE) OUT (PAGE1),A INC DE FR8000H LD A,(DE) OUT (PAGE2),A INC DE FRC000H LD A,(DE) OUT (PAGE3),A CALL M_PSP LD HL,(OFFCOD2) LD IX,(OFFCOD1) LD B,#00 LD A,(EXE_FM) CALL MOVE_FP LD SP,#403F LD HL,(LD_ADDR) LD DE,(LOADER) LD A,(EXE_FM) CALL READ LD SP,(SP_REG) LD HL,(LD_ADDR) LD DE,#0080 AND A SBC HL,DE EX DE,HL LD XH,D LD XL,E LD HL,(PC_REG) LD DE,RETFAR PUSH DE PUSH HL RET LEAVE LD A,B LD (ERLEVEL),A CALL LEAVMEM LD HL,TASK DEC (HL) LD SP,(EXSTACK) POP AF POP HL OUT (PAGE1),A LD A,L OUT (PAGE2),A LD A,H OUT (PAGE3),A POP DE POP HL LD (EXSTACK),SP LD SP,HL EX DE,HL LD A,(ERLEVEL) AND A JP (HL) WAIT LD A,(ERLEVEL) AND A RET M_PSP LD HL,(LD_ADDR) DEC H LD D,H LD E,L INC DE LD BC,#00FF LD (HL),B LDIR EX DE,HL DEC H LD DE,#0080 ADD HL,DE EX DE,HL LD XH,D LD XL,E LD HL,SECBUF LD C,(HL) INC C LDIR EX DE,HL ;R06 LD (HL),B LD A,(TASK) LD (IX-1),A LD A,(EXE_MEM) LD (IX-2),A LD A,(EXE_FM) LD (IX-3),A ;R05 INC HL LD (HL),B INC HL CALL CURRDSK ADD A,"A" LD (HL),A INC HL LD A,":" LD (HL),A INC HL PUSH HL CALL CURRDIR POP HL XOR A LD BC,#0100 CPIR DEC HL DEC HL LD A,#5C ;"\" CP (HL) INC HL JR Z,YP_ESLA LD (HL),A INC HL YP_ESLA EX DE,HL LD HL,TMPNAME ENMLP1 LD A,(HL) LDI CP "!" JR NC,ENMLP1 DEC DE XOR A LD (DE),A LD (LAST_PSP_PTR),IX ;R05 RET SCOPYS LD BC,#8021 SCOP0 LD A,(HL) CP C JR C,SCOP1 INC HL DJNZ SCOP0 XOR A LD (DE),A LD B,#80 RET SCOP1 LD BC,#8020 SCOP2 LD A,(HL) LD (DE),A INC HL INC DE CP C RET C DJNZ SCOP2 RET EXE_EXT DB "E","X","E" TASK DB #01 RAMMAP DB #00,#00,#00,#00 ERLEVEL DB #00 EXE_FM DB #00 EXE_MEM DB #00 CMDLINE DW #0000 EXSTACK DW XSTACK EXEBUFF DB "EXE" DB #00 OFFCOD1 DW #0000 OFFCOD2 DW #0000 LOADER DW #0000 DW #0000 DW #0000 DW #0000 LD_ADDR DW #0000 PC_REG DW #0000 SP_REG DW #0000 DS 512-($-EXEBUFF) ;(!!!HERE STACK FOR EXEC!!!) DS 255 XSTACK DB #00 ;//MODULE: EXECUTE ;[END]