mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
1228 lines
17 KiB
NASM
1228 lines
17 KiB
NASM
|
||
;[BEGIN]
|
||
;//MODULE: EXECUTE
|
||
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
|
||
;//UPDATE: 24-10-1999 DNS Restore module
|
||
;---------------------------------------------------------------
|
||
;Rev Date Name Description
|
||
;---------------------------------------------------------------
|
||
;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
|
||
;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
|
||
;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR
|
||
;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR
|
||
;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH
|
||
;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING
|
||
;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX
|
||
;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH
|
||
;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC
|
||
;R02 24-05-1999 DNS FIX CREATE PSP AND
|
||
; MOVE EXEC STACK
|
||
;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE
|
||
;---------------------------------------------------------------
|
||
|
||
;
|
||
; 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,#100
|
||
XOR A
|
||
CPIR
|
||
DEC HL ;R10 ;[x] ¨á¯à ¢«¥ ¡ £ á ¯ àᨣ®¬ ¡ãä¥à ª â «®£
|
||
DEC HL ;R10,5 - ¥ â¥á⨫ ;!!!!!
|
||
LD BC,#100 ;R10 ;[x] ¥ ¡ë«® í⮩ ª®¬ ¤ë, CPDR ¬®£ ¥ ¯à®è¥àáâ¨âì ¢áñ
|
||
LD A,'\'
|
||
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,DSS_Error.sys.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,DSS_Error.sys.INVALID_FUNCTION
|
||
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,DSS_Error.sys.INVALID_DRIVE
|
||
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,DSS_Error.sys.INVALID_NAME
|
||
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 ; !FIXIT £«ã¡¨ ¡ãä¥à ¥ § ¢¨á¨â ®â DIRSPEC.DEPTH
|
||
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 ToBIOS
|
||
RET
|
||
|
||
; B - SIZE BLOCK
|
||
; RET: A - ID MEMORY BLOCK
|
||
|
||
GETMEM LD C,#C2
|
||
RST ToBIOS
|
||
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,DSS_Error.sys.INVALID_MEMORY_HND
|
||
SCF
|
||
RET NZ
|
||
PUSH DE
|
||
LD A,E
|
||
LD C,#C3
|
||
RST ToBIOS
|
||
POP DE
|
||
LD A,DSS_Error.sys.INVALID_MEMORY_HND
|
||
RET C
|
||
LD HL,MEMTAB
|
||
ADD HL,DE
|
||
LD (HL),#00
|
||
XOR 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,DSS_Error.sys.INVALID_MEMORY_HND
|
||
SCF
|
||
RET NZ
|
||
LD D,B
|
||
PUSH DE
|
||
LD A,E
|
||
CALL SIZEBLK
|
||
POP DE
|
||
LD A,DSS_Error.sys.INVALID_MEMORY_HND
|
||
RET C
|
||
LD A,B
|
||
CP D
|
||
RET Z
|
||
JR C,INCMEM
|
||
DECMEM LD B,D
|
||
LD A,E
|
||
LD C,#9D
|
||
RST ToBIOS
|
||
LD A,B
|
||
LD C,#C3
|
||
RST ToBIOS
|
||
XOR A
|
||
RET
|
||
|
||
INCMEM LD A,D
|
||
SUB B
|
||
LD B,A
|
||
LD C,E
|
||
PUSH BC
|
||
LD C,#C2
|
||
RST ToBIOS
|
||
POP BC
|
||
LD B,A
|
||
LD A,30
|
||
RET C
|
||
LD A,C
|
||
LD C,#9E
|
||
RST ToBIOS
|
||
XOR A
|
||
RET
|
||
|
||
SIZEBLK LD B,#FF
|
||
LD C,A
|
||
BLK001 INC B
|
||
PUSH BC
|
||
LD A,C
|
||
LD C,#C4
|
||
RST ToBIOS
|
||
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 SLOT1
|
||
BIT 6,H ;if 0C000h or high?
|
||
JR Z,SETWIN2 ;no, go to open in SLOT2
|
||
JR SETWIN3 ;yes, go to open in SLOT3
|
||
|
||
; B - LOGICAL PAGE
|
||
; A - ID BLOCK
|
||
; RET: A - PAGE (WIN)
|
||
SETWIN1 LD C,#C4
|
||
EX DE,HL
|
||
RST ToBIOS
|
||
EX DE,HL
|
||
RET C
|
||
LD C,SLOT1
|
||
IN B,(C)
|
||
OUT (C),A
|
||
LD A,B
|
||
RET
|
||
|
||
SETWIN2 LD C,#C4
|
||
EX DE,HL
|
||
RST ToBIOS
|
||
EX DE,HL
|
||
RET C
|
||
LD C,SLOT2
|
||
IN B,(C)
|
||
OUT (C),A
|
||
LD A,B
|
||
RET
|
||
|
||
SETWIN3 LD C,#C4
|
||
EX DE,HL
|
||
RST ToBIOS
|
||
EX DE,HL
|
||
RET C
|
||
LD C,SLOT3
|
||
IN B,(C)
|
||
OUT (C),A
|
||
LD A,B
|
||
RET
|
||
|
||
EXEC:
|
||
_mSavePath
|
||
INC B ;R03
|
||
DEC B ;R03
|
||
JP Z,EXEC0 ;R03
|
||
DEC B ;R03
|
||
JP Z,EXEC1 ;R03
|
||
LD A,DSS_Error.sys.INVALID_FUNCTION ;R03
|
||
SCF ;R03
|
||
RET ;R03
|
||
|
||
CHECKPATH: ; !TODO ᤥ« âì ¯à®¢¥àªã ª®«¨ç¥á⢮ 横«®¢
|
||
LD A,(HL)
|
||
INC HL
|
||
CP '\'
|
||
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 (SLOT3),A
|
||
; LD A,DSS_Error.sys.PATH_NOT_FOUND ;????? 㦥 «¨ âãâ ª®¤ ®è¨¡ª¨?
|
||
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
|
||
|
||
;;;
|
||
; !TODO ‘„…‹€’œ ‘’<E28098>“Š’“<E28099>މ
|
||
PATH_PNT_ARRAY EQU #FC80
|
||
TMP_CURDIR EQU #FD00
|
||
ENVTEMP EQU #FE00
|
||
|
||
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
|
||
;R08 LD HL,TASK
|
||
;R08 INC (HL)
|
||
CALL OPENEXE
|
||
JP NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
|
||
CALL DECTASK ;R08
|
||
RET ;RET C!
|
||
|
||
;R07
|
||
; !FIXIT EXEC0_SHORT - ª®¯¨ï EXEC1 ¤® CALL DECTASK
|
||
EXEC0_SHORT:
|
||
;SHORT NAME
|
||
; TRY TO FIND IN CURRENT DIRECTORY
|
||
;
|
||
; 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 LD HL,TASK
|
||
;R08 INC (HL)
|
||
CALL OPENEXE
|
||
JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
|
||
CALL DECTASK ;R08
|
||
;R07
|
||
|
||
;FILE NO FOUND, SEARCHING 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,'E'+'X'*256
|
||
AND A
|
||
SBC HL,DE
|
||
LD A,DSS_Error.sys.INVALID_EXE
|
||
SCF
|
||
JP NZ,ERREXE
|
||
LD A,(IX+3)
|
||
OR A
|
||
LD A,DSS_Error.sys.UNKNOWN_EXE
|
||
SCF
|
||
JP NZ,ERREXE
|
||
; LD HL,TASK
|
||
; INC (HL)
|
||
;
|
||
; HERE TO DO: BACK TO CURRDIR
|
||
;
|
||
;R09
|
||
_mRestorStackAfterRestorePath
|
||
;R09
|
||
;
|
||
LD DE,(EXEBUFF.LOADER)
|
||
LD A,E
|
||
OR D
|
||
JP NZ,PRELOAD
|
||
LD HL,#0000
|
||
LD IX,#0000
|
||
LD B,#02
|
||
LD A,(EXE_FM)
|
||
CALL MOVE_FP
|
||
LD DE,(EXEBUFF.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,(SLOT3)
|
||
LD D,A
|
||
IN A,(SLOT2)
|
||
LD E,A
|
||
IN A,(SLOT1)
|
||
PUSH DE
|
||
PUSH AF
|
||
LD (EXSTACK),SP
|
||
LD SP,HL
|
||
EXX
|
||
|
||
;!FIXIT.<2E>….‘Ž•<C5BD>€<EFBFBD>Ÿ…’.DE.¯¥à¥¤.¢ë§®¢®¬.BIOS..............................;
|
||
LD DE,RAMMAP
|
||
LD BC,#00C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
LD (DE),A
|
||
INC DE
|
||
LD BC,#01C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
LD (DE),A
|
||
INC DE
|
||
LD BC,#02C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
LD (DE),A
|
||
INC DE
|
||
LD BC,#03C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
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 (SLOT1),A
|
||
OUT (SLOT2),A
|
||
OUT (SLOT3),A
|
||
LD HL,(EXEBUFF.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 (SLOT1),A
|
||
INC DE
|
||
FR8000 LD A,(DE)
|
||
OUT (SLOT2),A
|
||
INC DE
|
||
FRC000 LD A,(DE)
|
||
OUT (SLOT3),A
|
||
CALL M_PSP
|
||
LD HL,(EXEBUFF.OFFCOD2)
|
||
LD IX,(EXEBUFF.OFFCOD1)
|
||
LD B,#00
|
||
LD A,(EXE_FM)
|
||
CALL MOVE_FP
|
||
;R02
|
||
LD SP,#403F ;R02
|
||
;R02
|
||
LD DE,(EXEBUFF.LD_ADDR)
|
||
LD HL,#0000
|
||
AND A
|
||
SBC HL,DE
|
||
EX DE,HL
|
||
LD HL,(EXEBUFF.LD_ADDR)
|
||
LD A,(EXE_FM)
|
||
CALL READ
|
||
LD A,(EXE_FM)
|
||
CALL CLOSE
|
||
;R09
|
||
_mRestorePath
|
||
;R09
|
||
LD SP,(EXEBUFF.SP_REG)
|
||
LD HL,(EXEBUFF.LD_ADDR)
|
||
LD DE,#0080
|
||
AND A
|
||
SBC HL,DE
|
||
EX DE,HL
|
||
LD XH,D
|
||
LD XL,E
|
||
LD HL,(EXEBUFF.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,(EXEBUFF.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
|
||
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,(SLOT3)
|
||
LD D,A
|
||
IN A,(SLOT2)
|
||
LD E,A
|
||
IN A,(SLOT1)
|
||
PUSH DE
|
||
PUSH AF
|
||
LD (EXSTACK),SP
|
||
LD SP,HL
|
||
EXX
|
||
LD DE,RAMMAP
|
||
LD BC,#00C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
LD (DE),A
|
||
INC DE
|
||
LD BC,#01C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
LD (DE),A
|
||
INC DE
|
||
LD BC,#02C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
LD (DE),A
|
||
INC DE
|
||
LD BC,#03C4
|
||
LD A,(EXE_MEM)
|
||
RST ToBIOS
|
||
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 (SLOT1),A
|
||
OUT (SLOT2),A
|
||
OUT (SLOT3),A
|
||
LD HL,(EXEBUFF.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 (SLOT1),A
|
||
INC DE
|
||
FR8000H LD A,(DE)
|
||
OUT (SLOT2),A
|
||
INC DE
|
||
FRC000H LD A,(DE)
|
||
OUT (SLOT3),A
|
||
CALL M_PSP
|
||
LD HL,(EXEBUFF.OFFCOD2)
|
||
LD IX,(EXEBUFF.OFFCOD1)
|
||
LD B,#00
|
||
LD A,(EXE_FM)
|
||
CALL MOVE_FP
|
||
;R02
|
||
LD SP,#403F ;R02
|
||
;R02
|
||
LD HL,(EXEBUFF.LD_ADDR)
|
||
LD DE,(EXEBUFF.LOADER)
|
||
LD A,(EXE_FM)
|
||
CALL READ
|
||
;R09
|
||
_mRestorePath
|
||
;R09
|
||
LD SP,(EXEBUFF.SP_REG)
|
||
LD HL,(EXEBUFF.LD_ADDR)
|
||
LD DE,#0080
|
||
AND A
|
||
SBC HL,DE
|
||
EX DE,HL
|
||
LD XH,D
|
||
LD XL,E
|
||
LD HL,(EXEBUFF.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 (SLOT1),A
|
||
LD A,L
|
||
OUT (SLOT2),A
|
||
LD A,H
|
||
OUT (SLOT3),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,(EXEBUFF.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 ;!FIXIT ¥â ¯à¨¢ï§ª¨ ª DIRSPEC.DEPTH
|
||
CPIR ;!FIXIT ¥â ¯à®¢¥àª¨ ¢ë室 ¯® BC=0
|
||
DEC HL
|
||
DEC HL
|
||
LD A,'\'
|
||
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,#80*256 + '!'
|
||
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
|
||
|
||
;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\
|
||
;;
|
||
; 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
|
||
; BLOCK 512-($-EXEBUFF),0
|
||
; ;(!!!HERE STACK FOR EXEC!!!)
|
||
; BLOCK 255,0
|
||
; XSTACK DB #00
|
||
;R11 ////////////////////////////
|
||
|
||
;//MODULE: EXECUTE
|
||
;[END]
|
||
|