Estex-DSS/DSS/API/Execute.ASM

788 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
;-------------------------------------------------------------------------------------------------------------------------
;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
;LD A,DSS_Error.sys.FILE_NOT_FOUND
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
;!TEST
;LD A,(CORE_BUFFERS.EXEBUFF.VERSION)
;OR A
;LD A,DSS_Error.sys.UNKNOWN_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,NOINK2
INC B
NOINK2: 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
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.SECTOR_BUFFER+1
CALL SCOPYS
LD A,#80 ;!HARDCODE cmd line size
SUB B
LD (CORE_BUFFERS.SECTOR_BUFFER),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
_ret+1: JP 0 ;EXEC02.RET1 ¨«¨ _RET_2
_TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG)
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD DE,#0080 ;!HARDCODE CLP_Buffer
XOR A
SBC HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG)
LD DE,RETFAR ;  ¤à¥á ¯/¯ "­¥®¦¨¤ ­­®¥ § ¢¥à襭¨¥ ¯à®æ¥áá "
PUSH DE
PUSH HL
;!TEST 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
;
RET
;-----------------------------------------------------------------------
; ! ¢ë§ë¢ ¥âáï ª®£¤  á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
DEC H
LD D,H
LD E,L
INC DE
LD BC,#00FF ;!HARDCODE
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,CORE_BUFFERS.SECTOR_BUFFER
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
;!FIXIT âãâ ¢®ááâ ­ ¢«¨¢ âì ¯à ¢¨«ì­ë© ª â «®£
CALL CURDISK
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 ­¥â ¯à¨¢ï§ª¨ ª CurrentDirectory.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
.loop: LD A,(HL)
LDI
CP ' '+1
JR NC,.loop
DEC DE
XOR A
LD (DE),A
LD (APPINFO.LAST_PSP_PTR),IX
;
RET
;
SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size
.loop: LD A,(HL)
CP C
JR C,.copy
INC HL
DJNZ .loop
XOR A
LD (DE),A
LD B,#80
RET
;
.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size
.loop2: LD A,(HL)
LD (DE),A
INC HL
INC DE
CP C
RET C
DJNZ .loop2
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) ‚®ááâ ­ ¢«¨¢ îâáï áâà ­¨æë ª®â®àë¥ ¡ë«¨ ¯®¤ª«îç¥­ë ¤® § ¯ã᪠ EXE-ä ©« .
; 3) ‚ᯮ¬¨­ ¥âáï á⥪.
; 4) ॣ¨áâà A ¯®¬¥é ¥âáï ª®¤ ¢®§¢à â  ¨ ¢ë¯®«­ï¥âáï RET.
;
;/////////////////////////////////////////////////////////////////////
LEAVE: LD A,B
LD (ErrorLevel),A
CALL FREE_PROCESS_MEMORY
;[x] 10/12/23 close EXE FMs
CALL FREE_PROCESS_FMs
;
_mDECTASK
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
;
POP DE ; -2
POP HL ; -2
LD (EXSTACK),SP
LD SP,HL
;
;!TEST
;EI
;
EX DE,HL
LD A,(ErrorLevel)
;R12
CP DSS_Error.sys.UNEXPECTED_APP_TRMN
JR Z,.error_exit
CP DSS_Error.sys.USER_ABORT
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 ////////////////////////////
;