Estex-DSS/DSS/EXECUTE.ASM
Anatoliy Belyanskiy 91774c8b23 Initial commit
Estex DSS
2023-06-14 19:09:19 +10:00

1229 lines
17 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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]