Estex-DSS/DSS/API/Execute.ASM
2026-05-12 02:07:25 +10:00

837 lines
18 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
;-------------------------------------------------------------------------------------------------------------------------
;R12 20-07-2023 BAO <20>ਠ§ ¢¥à襭¨¨ ¯à¨«®¦¥­¨ï " ¢ à¨©­®" ¢ ¢®§¢à é ¥¬®¥ ¯à¨«®¦¥­¨¥ ¯¥à¥¤ ñâáï ª®¤ ®è¨¡ª¨ ¨ ä« £ CF=1
;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
;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
; 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE
;-------------------------------------------------------------------------------------------------------------------------
RELATIVE_DIR EQU 0
ABSOLUTE_DIR EQU 1
MACRO _mINCTASK
LD HL,TASK ;R08
INC (HL) ;R08
ENDM
;
MACRO _mDECTASK
LD HL,TASK ;R08
DEC (HL) ;R08
ENDM
;-------------------------------------------------------------------------------------------------------------------------
;;;
;TMP_CURDIR_AUTO EQU #FB00
; ­¥ ­ã¦­® ¥á«¨ SAVE_PATH_MACRO = 1
; TMP_CURDIR EQU #FD00
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #40. ‚믮«­¨âì ä ©«.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ä ©« 
; B=0 - § £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã á ª®à®âª¨¬ ¨¬¥­¥¬ (¡¥§ ¯®«­®£® ¯ã⨠¤® ¯à®£à ¬¬ë)
; B=1 - § £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã á ¯®«­ë¬ ¯ãâñ¬ ¤® ¯à®£à ¬¬ë
; ¢ë室: A - ª®¤ § ¢¥à襭¨ï, ¥á«¨ CF=0
; ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;---------------------------------------------------------------------
; ‡ £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã.
; äã­ª. #40, B=0.
;
; 1) Žâªà뢠¥â exe-ä ©« ­  ç⥭¨¥;
; 2) ‘ç¨â뢠¥â ¢ à ¡®çãî ®¡« áâì ¯à¥ä¨ªá exe-ä ©« ;
; 3) ‚뤥«ï¥â ¡«®ª ¯ ¬ïâ¨, âà¥¡ã¥¬ë© ¤«ï § £à㧪¨ ¢á¥£® ä ©«  ¨«¨ ¯¥à¢¨ç­®£®
; § £àã§ç¨ª , ¥á«¨ ¥£® à §¬¥à ­¥ à ¢¥­ ­ã«î;
; 4) ‘®åà ­ï¥â á⥪;
; 5) <20>®¤ª«îç ¥â áâà ­¨æë ¨§ ¢ë¤¥«¥­­®£® ¡«®ª ;
; 6) ‘âந⠯à¥ä¨ªá § ¯ã᪠ ¯à®£à ¬¬ë ¨ ãáâ ­ ¢«¨¢ ¥â ­  ­¥£® ॣ¨áâà IX;
; 7) ‘ç¨â뢠¥â ä ©« ¯®  ¤à¥áã 㪠§ ­­®¬ã ¢ ᬥ饭¨¨ 16 (€¤à¥á à á¯®«®¦¥­¨ï
; ª®¤  ¢ ¯ ¬ïâ¨);
; 8) ‡ ªà뢠¥â exe-ä ©«, ¥á«¨ íâ® ­¥ ¯¥à¢¨ç­ë© § £àã§ç¨ª;
; 9) “áâ ­ ¢«¨¢ ¥â á⥪ à ¢­ë¬ §­ ç¥­¨î ¨§ ᬥ饭¨ï 20 (€¤à¥á à á¯. á⥪ );
; 10) <20>¥à¥¤ ¥â ã¯à ¢«¥­¨¥ ¯®  ¤à¥áã 㪠§ ­­®¬ã ¢ ᬥ饭¨¨ 18 (€¤à¥á § ¯ã᪠);
;
; <20>à¥ä¨ªá § ¯ã᪠ ä ©« :
;
; -03 1 db ? ; „¥áªà¨¯â®à ä ©« , ¥á«¨ exe-ä ©« á ¯¥à¢¨ç­ë¬ § £àã§ç¨ª®¬
; -02 1 db ? ; ˆ¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
; -01 1 db ? ; “஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
; +00 1 db ? ; „«¨­  ª®¬-áâப¨
; +01 127 ds ? ; <20> à ¬¥âàë ª®¬-áâப¨, § ª ­ç¨¢ ¥âáï ­ã«¥¬
;///////////////////////////////////////////////////////////////////////
EXEC: LD (CMDLINE),HL
INC B ;R03
DEC B ;R03
JR Z,.VAR_1 ;R03
DEC B ;R03
JR Z,.VAR_2 ;R03
LD A,DSS_Error.sys.INVALID_FUNCTION ;R03
SCF ;R03
RET ;R03
;
.VAR_1: ;LD (CMDLINE),HL
CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME
;LD HL,(CMDLINE)
JR C,EXEC0_SHORT
.VAR_2: CALL EXEC_1
LD A,DSS_Error.sys.FILE_NOT_FOUND
SCF
RET ; File not found - exit
; ¯à¨ ¢ë室¥ á ®è¨¡ª®©, ¢ ॣ¨áâॠ€ - ª®¤ ®è¨¡ª¨
EXEC_1: ;LD (CMDLINE),HL
LD HL,(CMDLINE)
LD A,FAT_ATTR.READ_ONLY
LD (OPEN_FN.TMP),A
CALL SetPath_GetName
RET C
; LD HL,TMPNAME
; LD DE,MASKARE
CALL MASK
RET C
CALL TST_EXT
RET C
_mINCTASK ;R08
CALL OPEN_FN.FILE
JR C,.Error
POP HL ; 㡨ࠥ¬ «¨è­¨©  ¤à¥á_¢®§¢à â _¢_¢ë§¢ ¢èãî_¯à®æ¥¤ãàã
JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
.Error: _mDECTASK ;R08
AND A
RET
;JR NC,.noError
;_mDECTASK ;R08
;AND A
;RET
;
;.noError:
;POP HL ; 㡨ࠥ¬ «¨è­¨©  ¤à¥á_¢®§¢à â _¢_¢ë§¢ ¢èãî_¯à®æ¥¤ãàã
;JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
;
;SHORT NAME
;TRY TO FIND IN CURRENT DIRECTORY
EXEC0_SHORT: ; ¥á«¨ ã¡à âì, â® ¡ã¤¥â ª ª ¢ linux - ª®à®âª®¥ ¨¬ï § ¯ã᪠¥â EXE ⮫쪮 ¨§ ¯à®¯¨á ­­ëå ¤¨à¥ªâ®à¨©,
;   ¥á«¨ ­ã¦­® § ¯ãáâ¨âì ä ©« ¨§ ⥪ã饩 ¤¨à¥ªâ®à¨¨, â® â ª: ".\run.exe"
CALL EXEC_1
RET C
;
;FILE NOT FOUND, SEARCHING IN PATH
; GET PATH AND ETC.
LD HL,ENVPATH
LD DE,ENVPAGE.ENVTEMP
LD B,high Dss.Environ.Get
CALL ENVIRON
LD HL,(CMDLINE)
LD DE,CORE_BUFFERS.EXEBUFF
.COPYEXN: LD A,(HL)
LDI
OR A
JR NZ,.COPYEXN
CALL FINDPATH
;[x] 1/10/2023
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET C
;
LD HL,(CMDLINE)
JR EXEC.VAR_2
;
EXEC02: LD (EXE_FM),A
LD HL,CORE_BUFFERS.EXEBUFF
LD DE,_sEXE_HEADER.UnUsedPoint ; #0080 ;!#0200(512) ;R02
LD A,(EXE_FM)
CALL READ
JP C,ERREXE
LD IX,CORE_BUFFERS.EXEBUFF
LD HL,(CORE_BUFFERS.EXEBUFF.EXE_EXT)
LD DE,'E'+'X'*256
;AND A - ­¥ ­ã¦­®, ¥á«¨ ¡ë ¡ë« CF=1, â® çãâì ¢ëè¥ ¬ë ¡ë ã諨 ­  JP C,ERREXE
SBC HL,DE
LD A,DSS_Error.sys.INVALID_EXE
SCF
JP NZ,ERREXE
;
LD A,MINIMUM_EXE_VERSION
CP (IX + _sEXE_HEADER.VERSION)
LD A,DSS_Error.sys.UNKNOWN_EXE
JP C,ERREXE
;
LD DE,(CORE_BUFFERS.EXEBUFF.LOADER)
LD A,E
OR D
JP NZ,PRELOAD
; A=0
LD H,A
LD L,A
LD XL,A
LD XH,A
;
LD B,high Dss.Move_FP.FrEnd
LD A,(EXE_FM)
CALL MOVE_FP
LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD A,D
AND #3F
LD D,A
ADD IX,DE
;!TEST
JR NC,.no_inc_hl
INC HL
;LD DE,#0000
;ADC HL,DE
;
.no_inc_hl: 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
LD HL,.RET_1
LD (_ret),HL
JP _TST_PROC
;
; ‡ ¯ã᪠¡¥§ § £àã§ç¨ª 
.RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
XOR A
LD H,A
LD L,A
SBC HL,DE
EX DE,HL ; de=ç¨á«® ç¨â. ¡ ©â
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; ¡ãä¥à
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL CLOSE_FN ; § ªàëâì ä ©«
;
JP _TST_PROC_2
;
RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN
JP LEAVE ; § ¢¥àè¨âì ¯à®£à ¬¬ã (¯à®æ¥áá)
;-------------------------------------------------
; …᫨ à áè. ä ©«  ­¥ § ¤ ­®, § ¤ âì "exe".
; …᫨ à áè. ä ©«  § ¤ ­®, áà ¢­¨âì ¥£® á "exe".
;-------------------------------------------------
TST_EXT: LD HL,EXE_EXT ; "EXE"
LD DE,MASKARE+8
LD B,3
LD A,(DE)
CP ' '
JR NZ,.loop ; § ¤ ­® à áè.
LDI
LDI
LDI
XOR A
RET
; áà ¢­¨âì à áè. á "EXE"
.loop: LD A,(DE)
CP (HL)
SCF
RET NZ ; ­¥ ᮢ¯ ¤ ¥â
INC HL
INC DE
DJNZ .loop
XOR A ; Ok
RET
;
ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
ERREXE: PUSH AF
LD A,(EXE_FM)
CALL CLOSE_FN
_mDECTASK
POP AF
RET
;!TODO áà ¢­¨âì á EXEC02
PRELOAD: EX DE,HL
LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD A,D
AND #3F
LD D,A
ADD HL,DE
XOR A
SLA H
RLA
SLA H
RLA
LD B,A
LD A,H
OR L
JR Z,.NOINK
INC B
.NOINK: LD HL,_RET_2
LD (_ret),HL
JR _TST_PROC
;
; ‡ ¯ãáª á § £àã§ç¨ª®¬
_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; ¡ãä¥à
LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; ç¨á«® ç¨â. ¡ ©â
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
JP _TST_PROC_2
;-------------------------------------------------------------------;[ ]
_TST_PROC: CALL GETMEM
JP C,ERREXE0
;
DI
LD (EXE_MEM),A
EXX
POP DE ;á­¨¬ ¥¬ á® á⥪   ¤à¥á ¢®§¢à â 
LD HL,#0000
ADD HL,SP
LD SP,(EXSTACK)
; ! „ «¥¥ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥! BIOS ¨ ­¥ DSS-MAIN ­¥ ¢ë§ë¢ âì
PUSH HL ; +2 EXSTACK size for 1 task
PUSH DE ; +2
;
IN A,(SLOT3)
LD D,A
IN A,(SLOT2)
LD E,A
IN A,(SLOT1)
PUSH DE ; +2
PUSH AF ; +2
LD (EXSTACK),SP
LD SP,HL
;
EXX
;
;!TEST 27/03/2024
LD DE,RAMMAP+3
LD A,(EXE_MEM)
LD BC,4*256 + BIOS.GetMemPage
.mem_loop: PUSH AF
PUSH BC
DEC B
RST ToBIOS
LD (DE),A
DEC DE
POP BC
POP AF
DJNZ .mem_loop
;
; LD DE,RAMMAP
; ;
; LD A,(EXE_MEM)
; LD BC,0*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
; INC DE
; ;
; LD A,(EXE_MEM)
; LD BC,1*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
; INC DE
; ;
; LD A,(EXE_MEM)
; LD BC,2*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
; INC DE
; ;
; LD A,(EXE_MEM)
; LD BC,3*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
;
;
LD HL,(CMDLINE)
;LD DE,CORE_BUFFERS.BUFFER+1
LD DE,CORE_BUFFERS.BUFFER_CLP + 1
CALL SCOPYS
;LD A,#80 ;!HARDCODE cmd line size
LD A,low CLP_Buffer
SUB B
LD (CORE_BUFFERS.BUFFER_CLP),A
;
LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02
; ! „ «¥¥ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥! BIOS ¨ ­¥ DSS-MAIN ­¥ ¢ë§ë¢ âì
LD A,SHARED_PAGE
OUT (SLOT1),A
OUT (SLOT2),A
OUT (SLOT3),A
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD DE,RAMMAP
LD A,H
AND #C0
;!TEST
CP #80
JR Z,FR8000
JR NC,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,(CORE_BUFFERS.EXEBUFF.OFFCOD2)
LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1)
LD B,high Dss.Move_FP.FrStart
LD A,(EXE_FM)
CALL MOVE_FP
;
;LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. “áâ ­ ¢«¨¢ ¥âáï ª®£¤  ¢®âª­ãâë SHARED_PAGE
;LD A,R
;DI
LD SP,#4100 ;R02 ;!HARDCODE STACK before start EXE. “áâ ­ ¢«¨¢ ¥âáï ª®£¤  ¢®âª­ãâë SHARED_PAGE
;PUSH AF
_ret+1: JP 0 ;EXEC02.RET_1 ¨«¨ _RET_2
;
; á ¢®§¢à â ¨§ EXEC02.RET_1 ¨«¨ _RET_2
_TST_PROC_2:
; ! „ «¥¥ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥! BIOS ¨ ­¥ DSS-MAIN ­¥ ¢ë§ë¢ âì
LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER
CALL M_PSP
LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG)
LD DE,RETFAR ;  ¤à¥á ¯/¯ "­¥®¦¨¤ ­­®¥ § ¢¥à襭¨¥ ¯à®æ¥áá "
PUSH DE
; Current Dir ;[x] 15/10/23
PUSH IX
LD HL,CORE_BUFFERS.CurrentPath
LD A,(CORE_BUFFERS.EXEBUFF.VERSION)
;
OR A
JR NZ,.set_path
;
CALL DIR_PATH_CHANGE.FullCurrent
LD HL,CORE_BUFFERS.CurrentPath
.set_path: CALL CHDIR_FN
POP IX
; ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ ¡ãä¥à  CLP
LD A,(CORE_BUFFERS.BUFFER_CLP)
LD B,DSS_Error.sys.ENV_ITEM_OVERFLOW
INC A
JP Z,LEAVE
;
LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG)
EI
JP (HL)
;-----------------------------------------------------------------------
; ! ¢ë§ë¢ ¥âáï ª®£¤  á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
DEC H ;!FIXIT ®âáâ㯠­  256 (CLP buffer + data) ­ § ¤ ®â LD_ADDR
LD D,H
LD E,L
INC DE
LD BC,#00FF ;!FIXIT à §¬¥à ¯®¤ ¡ãä¥à CLP
LD (HL),B
LDIR
EX DE,HL
DEC H
;LD DE,#0080 ;!FIXIT
LD DE,#0003 ;!FIXIT
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
;LD HL,CORE_BUFFERS.BUFFER
LD HL,CORE_BUFFERS.BUFFER_CLP
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
; â ª ¨áâ®à¨ç¥áª¨ á«®¦¨«®áì, çâ® ¤¢  0 ¯®á«¥ ¯ à ¬¥â஢ áâப¨
INC HL
;LD (HL),B
INC HL
;!FIXIT âãâ ¢®ááâ ­ ¢«¨¢ âì ¯à ¢¨«ì­ë© ª â «®£
CALL CURDISK
ADD A,'A'
LD (HL),A
INC HL
LD A,':'
LD (HL),A
INC HL
PUSH HL
;!FIXIT âãâ ç¨â âì CURRDIR ¢ ®â¤¥«ì­ë© ¡ãä¥à ¨ ¨§ ­¥£® ª®¯¨à®¢ âì ¢ HL ¡¥§ ¢ë室  §  £à ­¨æë ¡ãä¥à 
LD HL,CORE_BUFFERS.BUFFER_CLP
CALL CURRDIR
;
POP DE
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
SBC HL,DE
;!FIXIT ®âà ¡®â âì Z ¨ CF
LD B,H
LD C,L
;EX DE,HL
JR Z,.error_CLP
JR C,.error_CLP
; hl -  ¤à¥á ¢ CLP ¤«ï § ¯¨á¨ ¯®«­®£® ¨¬¥­¨ ¯à¨«®¦¥­¨ï á ¯ãâñ¬
; bc - ª®«¨ç¥á⢮ ®á⠢襣®áï ¬¥áâ  ¢ ¡ãä¥à¥
;
LD HL,CORE_BUFFERS.BUFFER_CLP
.copy_loop: CALL .copyAndCheck
JP PO,.error_CLP
;
EX DE,HL
DEC HL
LD A,'\' ;
LD (HL),A
INC HL
.YP_ESLA: PUSH HL
PUSH BC
LD HL,MASKARE
LD DE,TMPNAME
CALL GetName
POP BC
POP DE
LD HL,TMPNAME
;
CALL .copyAndCheck
LD (APPINFO.LAST_PSP_PTR),IX ; !FIXIT ᤥ« âì ç¥à¥§ á⥪ ¯¥à¥¬¥­­ëå?
RET
;
.copyAndCheck: LD A,(HL)
AND A
LDI
RET Z
JP PE,.copyAndCheck
; ¥á«¨ ¬ë âãâ, â® ¡ãä¥à  ­¥ 墠⨫® ¨ ­ã¦­® ¢ë¤ ¢ âì ®è¨¡ªã
POP HL ; á­¨¬ ¥¬  ¤à¥á ¢®§¢à â 
;
.error_CLP: LD A,#FF
LD (CORE_BUFFERS.BUFFER_CLP),A
RET
SCOPYS: LD BC,256*(low CLP_Buffer) + ' '+1
.loop: LD A,(HL)
CP C
JR C,.copy
;
INC HL
DJNZ .loop
XOR A
LD (DE),A
LD B,low CLP_Buffer
RET
;
.copy: LD BC,256*(low CLP_Buffer) + ' '
AND A
LD (DE),A
RET Z
;
.loop2: LD A,(HL)
LD (DE),A
INC HL
INC DE
CP C
RET C
DJNZ .loop2
; âã⠮訡ª  - ᫨誮¬ ¤«¨­­ ï áâப  ¯ à ¬¥â஢
INC B
RET
;---------------------------------------------------------------------
ENVPATH: DB "PATH=",0
EXE_EXT: DB "EXE"
TASK: DB #01 ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
;
RAMMAP: DB #00,#00,#00,#00
ErrorLevel: DB #00 ; ª®¤ § ¢¥à襭¨ï ¯à®£à ¬¬ë (¯à®æ¥áá )
EXE_FM: DB #00 ; ¤¥áªà. ä ©« 
EXE_MEM: DB #00 ; ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
CMDLINE: DW #0000
EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ;  ¤à¥á á⥪ 
;/////////////////////////////////////////////////////////////////////
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #41. ‡ ¢¥àè¨âì ¯à®£à ¬¬ã (¯à®æ¥áá).
;
; ¢å®¤: B - ª®¤ § ¢¥à襭¨ï
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; ‚ë室 ¨§ EXE-ä ©« :
;
; 1) Žá¢®¡®¦¤ îâáï ¢á¥ ¡«®ª¨ ¯ ¬ï⨠ª®â®àë¥ ¢ë¤¥«ï«¨áì ¤ ­­®¬ã ¯à¨«®¦¥­¨î.
; 2) ‡ ªà뢠îâáï ¢á¥ ä ©«ë ®âªàëâë¥ ¯à¨«®¦¥­¨¥¬
; 3) ‚®ááâ ­ ¢«¨¢ îâáï áâà ­¨æë ª®â®àë¥ ¡ë«¨ ¯®¤ª«îç¥­ë ¤® § ¯ã᪠ EXE-ä ©« .
; 4) ‚ᯮ¬¨­ ¥âáï á⥪.
; 5) ॣ¨áâà A ¯®¬¥é ¥âáï ª®¤ ¢®§¢à â  ¨ ¢ë¯®«­ï¥âáï RET.
;
;/////////////////////////////////////////////////////////////////////
LEAVE: ;LD A,R
;PUSH AF ; INT ON/OFF
DI
;
LD A,B
LD (ErrorLevel),A
CALL FREE_PROCESS_MEMORY
;[x] 10/12/23 close EXE FMs
CALL FREE_PROCESS_FMs
;
_mDECTASK
;
;POP DE ; INT ON/OFF
LD SP,(EXSTACK)
; âãâ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
POP AF ; -2 EXSTACK size for 1 task
POP HL ; -2
OUT (SLOT1),A
LD A,L
OUT (SLOT2),A
LD A,H
OUT (SLOT3),A
;
;LD A,E ; INT ON/OFF
POP DE ; -2
POP HL ; -2
LD (EXSTACK),SP
LD SP,HL
;
;!TEST
;AND %0000'0100 ; PO/PE flag
;JR Z,.no_ei
EI
.no_ei: ;
EX DE,HL
LD A,(ErrorLevel)
;R12
CP DSS_Error.sys.UNEXPECTED_APP_TRMN ; #27 0010 0111 6
JR Z,.error_exit
CP DSS_Error.sys.USER_ABORT ; #25 0010 0101 4
JR Z,.error_exit
CP DSS_Error.sys.ENV_ITEM_OVERFLOW ; #21 0010 0001 0
JR NZ,.norm_exit
.error_exit: SCF
JP (HL)
;
.norm_exit: AND A
JP (HL)
;/////////////////////////////////////////////////////////////////////
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #42. <20>®«ãç¨âì ª®¤ § ¢¥à襭¨ï ¯à®£à ¬¬ë.
;
; ¢å®¤: ­¥â
; ¢ë室: A - ª®¤ § ¢¥à襭¨ï
;/////////////////////////////////////////////////////////////////////
GET_ERR: LD A,(ErrorLevel)
AND A
RET
;/////////////////////////////////////////////////////////////////////
;-----------------------------------------------------------------------
FREE_PROCESS_MEMORY:
;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
LD BC,256 ;!HARDCODE à §¬¥à ¡«®ª  áâà ­¨æ އ“
.loop: LD A,(TASK)
CPIR
RET NZ
PUSH HL
PUSH BC
DEC HL
AND A
;LD DE,MEMTAB
LD DE,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
SBC HL,DE
LD A,L
CALL RETMEM ; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨
POP BC
POP HL
JP .loop
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
FREE_PROCESS_FMs:
LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
LD DE,CORE_BUFFERS.FM_BUF.Size
LD B,FMCOUNT+1
LD A,(TASK)
.loop: ADD IY,DE
CP (IY+_sFM.TASK_NUM)
JR NZ,.next
; close fm
PUSH AF
XOR A
OR (IY+_sFM.TASK_NUM)
JR Z,.skip
PUSH IY
PUSH DE
LD A,FMCOUNT+1
SUB B
PUSH BC
CALL CLOSE_FN
POP BC
POP DE
POP IY
.skip: POP AF
;
.next: DJNZ .loop
RET
;
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
CHECKPATH: ; !TODO ᤥ« âì ¯à®¢¥àªã ­  ª®«¨ç¥á⢮ 横«®¢
LD A,(HL)
INC HL
CP '\'
RET Z
; CP '/' ;ALT SLASH
; RET Z
CP " "+1
JR NC,CHECKPATH
RET
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
FINDPATH:
SET_PAGE_X ENVPAGE
PUSH AF
;!TEST
;CALL CURRDSK_FN
;ADD A,"A"
;LD HL,TMP_CURDIR
;LD (HL),A
;INC HL
;LD A,":"
;LD (HL),A
;INC HL
;CALL CURRDIR_FN
;
CALL .MAKE_PATH_ARRAY
LD HL,ENVPAGE.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
CALL NZ,CHDIR
JR C,.BADPATH
LD HL,CORE_BUFFERS.EXEBUFF
CALL MASK.name
JR C,.BADPATH
CALL TST_EXT
JR C,.BADPATH
CALL SEARCH.File
.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 AF
PUSH HL
LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
POP HL
POP AF
RET
.MAKE_PATH_ARRAY:
LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1
LD DE,ENVPAGE.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 '\'
JR NZ,.NEXTCH
.NEXTDR:
SET ABSOLUTE_DIR,C
.NEXTRL:
;SET RELATIVE_DIR,C ;!TODO ????
.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
;-----------------------------------------------------------------------
;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 ////////////////////////////
;