mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
1355 lines
27 KiB
NASM
1355 lines
27 KiB
NASM
|
||
;[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>ਠ§ ¢¥à襨¨ ¯à¨«®¦¥¨ï ç¥à¥§ äãªæ¨î #41 ¨«¨ " ¢ ਩®" ¢ ¢®§¢à é ¥¬®¥ ¯à¨«®¦¥¨¥ ¯¥à¥¤ ñâáï ª®¤ ®è¨¡ª¨ ¨ ä« £ CF=1
|
||
;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
|
||
;---------------------------------------------------------------
|
||
|
||
MACRO _mINCTASK
|
||
LD HL,TASK ;R08
|
||
INC (HL) ;R08
|
||
ENDM
|
||
;
|
||
MACRO _mDECTASK
|
||
LD HL,TASK ;R08
|
||
DEC (HL) ;R08
|
||
ENDM
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; !FIXIT âãâ ®¤¨ § âã¯ë ¨ ¤¥¡¨«¨§¬
|
||
; ”ãªæ¨ï #47. <20>®«ã票¥ ¨ä®à¬ 樨 ¯à¨«®¦¥¨ï.
|
||
;
|
||
; ¢å®¤: HL - ¡ãä¥à ¤ ëå
|
||
; B - ®¬¥à ¯®¤äãªæ¨¨:
|
||
; B=0 - ¯®«ã票¥ ¯ à ¬¥â஢ ª®¬ ¤®© áâப¨
|
||
; B=1 - ¯®«ã票¥ ¯®«®£® ¯ã⨠ª ª â «®£ã ¯à®£à ¬¬ë
|
||
; B=2 - ¯®«ã票¥ ¯®«®£® ¯ã⨠¨ ¨¬¥¨ ä ©« ¯à®£à ¬¬ë
|
||
; ¢ë室: ¥â
|
||
;
|
||
; 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
|
||
;
|
||
DJNZ .FN1
|
||
; ¯®«ã票¥ ¯ à ¬¥â஢ ª®¬ ¤®© áâப¨ 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
|
||
|
||
.FN1: DJNZ .FN2
|
||
; ¯®«ã票¥ ¯®«®£® ¯ã⨠ª ª â «®£ã ¯à®£à ¬¬ë
|
||
EX DE,HL
|
||
.LAST_PSP_PTR+1:
|
||
LD HL,0
|
||
LD C,(HL)
|
||
INC HL
|
||
ADD HL,BC
|
||
INC HL
|
||
INC HL
|
||
PUSH HL
|
||
LD BC,#100 ;!HARDCODE ¤«¨ ª®¬¬ ¤®© áâப¨
|
||
XOR A
|
||
CPIR
|
||
DEC HL ;R10 ;[x] ¨á¯à ¢«¥ ¡ £ á ¯ àᨣ®¬ ¡ãä¥à ª â «®£
|
||
DEC HL ;R10,5 - ¥ â¥á⨫ ;!!!!!
|
||
LD BC,#100 ;R10 ;[x] ¥ ¡ë«® í⮩ ª®¬ ¤ë, CPDR ¬®£ ¥ ¯à®è¥àáâ¨âì ¢áñ ;!HARDCODE ¤«¨ ª®¬¬ ¤®© áâப¨
|
||
LD A,'\'
|
||
CPDR
|
||
INC HL
|
||
INC HL
|
||
POP BC
|
||
AND A
|
||
SBC HL,BC
|
||
;R10 ;[x] ¬®£«® ¢áñ ¢ ª®á¬®á ã«¥â¥âì
|
||
LD A,DSS_Error.sys.COMMON_ERROR
|
||
JR C,.error
|
||
;
|
||
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
|
||
;
|
||
.FN2: DJNZ .FN3
|
||
; ¯®«ã票¥ ¯®«®£® ¯ã⨠¨ ¨¬¥¨ ä ©«
|
||
EX DE,HL
|
||
LD HL,(.LAST_PSP_PTR)
|
||
LD C,(HL)
|
||
INC HL
|
||
ADD HL,BC
|
||
INC HL
|
||
INC HL
|
||
;
|
||
.loop LD A,(HL)
|
||
LDI
|
||
OR A
|
||
JR NZ,.loop
|
||
;
|
||
RET
|
||
;
|
||
.FN3:
|
||
;
|
||
; ®è¨¡ª
|
||
LD A,DSS_Error.sys.INVALID_FUNCTION
|
||
.error: SCF
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #45. <20> §¡®à ª®¬ ¤®© áâப¨.
|
||
;
|
||
; ¢å®¤: HL - 㪠§ â¥«ì ª®¬ ¤®© áâப¨
|
||
; DE - 㪠§ â¥«ì ¡ãä¥à ¯®«ì§®¢ ⥫ï
|
||
; B - ®¬¥à ¯®¤äãªæ¨¨:
|
||
; 0 - <20> §®¡à âì áâபã
|
||
; 1 - ‚뤥«¨âì ¨¬ï ¤¨áª
|
||
; 2 - ‚뤥«¨âì ¤¨à¥ªâ®à¨î
|
||
; 3 - ‚뤥«¨âì ¨¬ï ä ©«
|
||
; 4 - ‚뤥«¨âì à áè¨à¥¨¥ ä ©«
|
||
; 5 - ‚뤥«¨âì ¨¬ï ¤¨áª , ¯ãâì ª ä ©«ã, ¨¬ï ä ©« ¨ à áè. ä ©«
|
||
; 6 - ‡ १¥à¢¨à®¢ ®
|
||
; 7 - ‚뤥«¨âì ¯ à ¬¥âà ª®¬ ¤®© áâப¨
|
||
; 8 - <20>८¡à §®¢ âì ¨§ 11 ᨬ¢®«ì®£® ä®à¬ â ¢ ä®à¬ â „Ž‘
|
||
; 9 - <20>८¡à §®¢ âì ¨§ ä®à¬ â „Ž‘ ¢ 11 ᨬ¢®«ìë© ä®à¬ â
|
||
; ¢ë室: ¥â
|
||
//////////////////////////////////////////////////////////////////////
|
||
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
|
||
JR Z,EX_FULL ;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 ; ¯à¥®¡à. ¨¬ï 11 -> 8.3 ä®à¬ â
|
||
DEC B
|
||
JP Z,MASK.custom ;9 ; ¯à¥®¡à. ¨¬ï 8.3 -> 11 ä®à¬ â
|
||
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
|
||
|
||
; <20> §®¡à âì áâபã
|
||
; 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
|
||
; <20> §®¡à âì áâபã
|
||
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 ;!HARDCODE áç¥â稪¨
|
||
EX_PAT1: LD A,(HL)
|
||
CALL UPPER ; a..z -> A..Z
|
||
LD (DE),A
|
||
INC HL
|
||
INC DE
|
||
INC C ; ++áç¥â稪
|
||
CP '\'
|
||
JR Z,PATH_YEP
|
||
CP ":"
|
||
JR Z,DRIVE_YEP
|
||
CP "!"
|
||
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,' '
|
||
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 £«ã¡¨ ¡ãä¥à ¥ § ¢¨á¨â ®â CurrentDirectory.DEPTH
|
||
CPIR
|
||
DEC HL
|
||
EX DE,HL
|
||
LD HL,TMPBUF ; 12 ¯à®¡¥«®¢
|
||
POP BC
|
||
LD B,0
|
||
LDIR
|
||
POP HL
|
||
EX AF,AF'
|
||
SET PATH_PR,A
|
||
EX AF,AF'
|
||
JP EX_PAT0
|
||
|
||
TMPBUF: DB " ",#00 ; 12 ¯à®¡¥«®¢
|
||
|
||
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: BLOCK 9,0
|
||
|
||
NM_NAME_A: DB " ",#00
|
||
|
||
NM_EXTN_A: DB " ",0
|
||
|
||
NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #43. ‚뤥«¨âì ¯ à ¬¥âà ª®¬ ¤®© áâப¨.
|
||
;
|
||
; ¢å®¤: HL - 㪠§ â¥«ì ª®¬ ¤®© áâப¨
|
||
; DE - ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà
|
||
; ¢ë室: HL - 㪠§ ⥫ì á«¥¤. ¯ à ¬¥âà ª®¬-áâப¨
|
||
; CF=0 - ª®¥æ áâப¨ ¥ ¤®á⨣ãâ (¥áâì ¤à㣨¥ ¯ à ¬¥âàë)
|
||
; CF=1 - ª®¥æ áâப¨ (¢ ¡ãä¥à ¯¥à¥¥áñ ¯®á«¥¤¨© ¯ à ¬¥âà ¨«¨ ®«ì)
|
||
;
|
||
;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 " "+1
|
||
JR NC,GSWIT2
|
||
CP " "
|
||
LD A,0
|
||
LD (DE),A
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #3C. ˆä®à¬ æ¨ï ® ¯ ¬ïâ¨.
|
||
;
|
||
; ¢å®¤: ¥â
|
||
; ¢ë室: HL - ®¡é¥¥ ª®«-¢® áâà ¨æ
|
||
; BC - ª®«-¢® ᢮¡. áâà ¨æ
|
||
//////////////////////////////////////////////////////////////////////
|
||
FREEMEM: LD C,BIOS.GetMemSize
|
||
RST ToBIOS
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #3D. ‚뤥«¥¨¥ ¡«®ª ¯ ¬ïâ¨.
|
||
;
|
||
; ¢å®¤: B - à §¬¥à ¡«®ª ¢ áâà ¨æ å ¯® 16kB
|
||
; ¢ë室: A - ¨¤¥â¨ä¨ª â®à ¡«®ª ¯ ¬ïâ¨, ¥á«¨ CF=0
|
||
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
//////////////////////////////////////////////////////////////////////
|
||
GETMEM: LD C,BIOS.GetMem
|
||
RST ToBIOS
|
||
LD E,A
|
||
LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
|
||
RET C
|
||
LD D,#00
|
||
LD HL,MEMTAB ; ¬ áᨢ ᯨ᪠¢ë¤¥«. áâà ¨æ
|
||
ADD HL,DE
|
||
LD A,(TASK) ; ã஢¥ì ⥪ã饩 ¯à®£à ¬¬ë
|
||
LD (HL),A
|
||
LD A,E
|
||
AND A
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #3E. Žá¢®¡®¦¤¥¨¥ ¡«®ª ¯ ¬ïâ¨.
|
||
;
|
||
; ¢å®¤: A - ¨¤¥â¨ä¨ª â®à ¡«®ª ¯ ¬ïâ¨
|
||
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
//////////////////////////////////////////////////////////////////////
|
||
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,BIOS.FreeMem
|
||
RST ToBIOS
|
||
POP DE
|
||
LD A,DSS_Error.sys.INVALID_MEMORY_HND
|
||
RET C
|
||
LD HL,MEMTAB
|
||
ADD HL,DE
|
||
XOR A
|
||
LD (HL),A
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #3F. ˆ§¬¥¥¨¥ ¡«®ª ¯ ¬ïâ¨.
|
||
;
|
||
; ¢å®¤: A - ¨¤¥â¨ä¨ª â®à ¡«®ª ¯ ¬ïâ¨
|
||
; B - ®¢ë© à §¬¥à ¡«®ª
|
||
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
//////////////////////////////////////////////////////////////////////
|
||
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,BIOS.DivMemBlocks
|
||
RST ToBIOS
|
||
LD A,B
|
||
LD C,BIOS.FreeMem
|
||
RST ToBIOS
|
||
XOR A
|
||
RET
|
||
|
||
; „®¡ ¢¨âì áâà ¨æ ¯ ¬ï⨠ª ¡«®ªã
|
||
INCMEM: LD A,D
|
||
SUB B
|
||
LD B,A
|
||
LD C,E
|
||
PUSH BC
|
||
LD C,BIOS.GetMem
|
||
RST ToBIOS
|
||
POP BC
|
||
LD B,A
|
||
LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
|
||
RET C
|
||
LD A,C
|
||
LD C,BIOS.MergeMemBlocks
|
||
RST ToBIOS
|
||
XOR A
|
||
RET
|
||
|
||
SIZEBLK: LD B,#FF
|
||
LD C,A
|
||
.loop: INC B
|
||
PUSH BC
|
||
LD A,C
|
||
LD C,BIOS.GetMemPage
|
||
RST ToBIOS
|
||
POP BC
|
||
JR NC,.loop
|
||
OR A
|
||
SCF
|
||
RET Z
|
||
XOR A
|
||
RET
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
FREE_PROCESS_MEMORY:
|
||
LD HL,MEMTAB
|
||
LD BC,256 ;!HARDCODE à §¬¥à ¡«®ª áâà ¨æ Ž‡“
|
||
.loop: 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
|
||
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)
|
||
CALL Z,.CLOSE
|
||
DJNZ .loop
|
||
RET
|
||
;
|
||
.CLOSE: PUSH IY
|
||
PUSH DE
|
||
PUSH AF
|
||
LD A,FMCOUNT+1
|
||
SUB B
|
||
CALL CLOSE_FN
|
||
POP AF
|
||
POP DE
|
||
POP IY
|
||
RET
|
||
////////////////////////////////////////////////////////////////////////
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #38. <20>®¤ª«î票¥ áâà ¨æë ¯ ¬ïâ¨.
|
||
;
|
||
; ¢å®¤: A - ¨¤¥â¨ä. ¡«®ª ¯ ¬ïâ¨
|
||
; B - ®¬¥à áâà ¨æë ¢ ¡«®ª¥ (0,1,2,..)
|
||
; H - ¡¨âë 6 ¨ 7 § ¤ îâ ®¬¥à ®ª , ¢ ª®â®à®¥ ¡ã¤¥â ¯®¤ª«. áâà ¨æ
|
||
; ¢ë室: A - ®¬¥à áâà ¨æë, ¥á«¨ CF=0
|
||
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
; if B = 0FFh, then logical page number got from DE
|
||
//////////////////////////////////////////////////////////////////////
|
||
SETWIN: BIT 7,H ; if #8000 or high?
|
||
JR Z,SETWIN1 ; no, go to open in SLOT1
|
||
BIT 6,H ; if #C000 or high?
|
||
JR Z,SETWIN2 ; no, go to open in SLOT2
|
||
//JR SETWIN3 ; yes, go to open in SLOT3
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #3B. <20>®¤ª«î票¥ áâà ¨æë ¯ ¬ï⨠¢ âà¥âì¥ ®ª®.
|
||
;
|
||
; ¢å®¤: A - ¨¤¥â¨ä. ¡«®ª ¯ ¬ïâ¨
|
||
; B - ®¬¥à áâà ¨æë ¢ ¡«®ª¥ (0,1,2,..)
|
||
; ¢ë室: A - ®¬¥à áâà ¨æë, ¥á«¨ CF=0
|
||
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
//////////////////////////////////////////////////////////////////////
|
||
SETWIN3: LD C,BIOS.GetMemPage
|
||
EX DE,HL
|
||
RST ToBIOS
|
||
EX DE,HL
|
||
RET C
|
||
LD C,SLOT3
|
||
IN B,(C)
|
||
OUT (C),A
|
||
LD A,B
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #39. <20>®¤ª«î票¥ áâà ¨æë ¯ ¬ï⨠¢ ¯¥à¢®¥ ®ª®.
|
||
;
|
||
; ¢å®¤: A - ¨¤¥â¨ä. ¡«®ª ¯ ¬ïâ¨
|
||
; B - ®¬¥à áâà ¨æë ¢ ¡«®ª¥ (0,1,2,..)
|
||
; ¢ë室: A - ®¬¥à áâà ¨æë, ¥á«¨ CF=0
|
||
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
//////////////////////////////////////////////////////////////////////
|
||
SETWIN1: LD C,BIOS.GetMemPage
|
||
EX DE,HL
|
||
RST ToBIOS
|
||
EX DE,HL
|
||
RET C
|
||
LD C,SLOT1
|
||
IN B,(C)
|
||
OUT (C),A
|
||
LD A,B
|
||
RET
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #3A. <20>®¤ª«î票¥ áâà ¨æë ¯ ¬ï⨠¢® ¢â®à®¥ ®ª®.
|
||
;
|
||
; ¢å®¤: A - ¨¤¥â¨ä. ¡«®ª ¯ ¬ïâ¨
|
||
; B - ®¬¥à áâà ¨æë ¢ ¡«®ª¥ (0,1,2,..)
|
||
; ¢ë室: A - ®¬¥à áâà ¨æë, ¥á«¨ CF=0
|
||
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
//////////////////////////////////////////////////////////////////////
|
||
SETWIN2 LD C,BIOS.GetMemPage
|
||
EX DE,HL
|
||
RST ToBIOS
|
||
EX DE,HL
|
||
RET C
|
||
LD C,SLOT2
|
||
IN B,(C)
|
||
OUT (C),A
|
||
LD A,B
|
||
RET
|
||
|
||
;!TODO ¥á«¨ ¤® ¡ã¤¥â áíª®®¬¨âì ¯ ¬ïâì, ® ¯à¨¢ï§ âìáï ª ®¬¥à ¬ ᫮⮢
|
||
; SETWIN1: LD H,SLOT1 : JR SETWIN.ALL
|
||
; SETWIN2: LD H,SLOT2 : JR SETWIN.ALL
|
||
; SETWIN3: LD H,SLOT3 : JR SETWIN.ALL
|
||
; SETWIN: LD C,A
|
||
; LD A,H
|
||
; AND %1100'0000
|
||
; JR NZ,.no_error
|
||
; OR %0100'0000
|
||
; .no_error: RR‘A
|
||
; OR %100'0010
|
||
; LD H,A ;SLOT number
|
||
; LD A,C
|
||
; .ALL: LD C,BIOS.GetMemPage
|
||
; EX DE,HL
|
||
; RST ToBIOS
|
||
; EX DE,HL
|
||
; RET C
|
||
; LD C,H ;SLOT number
|
||
; IN B,(C)
|
||
; OUT (C),A
|
||
; LD A,B
|
||
; RET
|
||
;
|
||
; // SLOT0 - #82 %1000'0010
|
||
; // SLOT0 - #A2 %1010'0010
|
||
; // SLOT0 - #C2 %1100'0010
|
||
; // SLOT0 - #E2 %1110'0010
|
||
|
||
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:
|
||
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,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
|
||
|
||
ENVPATH: DB "PATH=",0
|
||
|
||
;;;
|
||
;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
|
||
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 GETWORD
|
||
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:
|
||
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
|
||
RET C
|
||
;
|
||
LD HL,(CMDLINE)
|
||
JR EXEC.VAR_2
|
||
|
||
EXEC02: LD (EXE_FM),A
|
||
LD HL,CORE_BUFFERS.EXEBUFF
|
||
LD DE,#0080 ;!#0200(512) ;R02
|
||
LD A,(EXE_FM)
|
||
CALL READ
|
||
JP C,ERREXE
|
||
LD IX,CORE_BUFFERS.EXEBUFF
|
||
LD HL,(CORE_BUFFERS.EXEBUFF)
|
||
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,(IX+3) ;!HARDCODE
|
||
OR A
|
||
LD A,DSS_Error.sys.UNKNOWN_EXE
|
||
SCF
|
||
JP NZ,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 ; ç⥨¥ ¨§ ä ©«
|
||
;!TEST ;[x] no close source EXE file before start 08/11/23
|
||
; LD A,(EXE_FM) ; ¤¥áªà. ä ©«
|
||
; CALL CLOSE ; § ªàëâì ä ©«
|
||
;
|
||
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
|
||
|
||
PRELOAD: EX DE,HL
|
||
LD DE,(CORE_BUFFERS.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: 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)
|
||
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
|
||
; <20>… ‘Ž•<C5BD>€<EFBFBD>Ÿ…’‘Ÿ DE ¯¥à¥¤ ¢ë§®¢®¬ BIOS, ¡¨®á ¯®ª ¥£® ¨ ¥ ¯®àâ¨â
|
||
LD A,(EXE_MEM)
|
||
LD DE,RAMMAP
|
||
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.SECBUF+1
|
||
CALL SCOPYS
|
||
LD A,#80 ;!HARDCODE cmd line size
|
||
SUB B
|
||
LD (CORE_BUFFERS.SECBUF),A
|
||
;R02
|
||
LD SP,CORE_BUFFERS.EXEBUFF+510 ;‚áâ ¢«ï¥âáï ¢ SHARED_PAGE
|
||
;
|
||
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
|
||
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,(CORE_BUFFERS.EXEBUFF.OFFCOD2)
|
||
LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1)
|
||
LD B,high Dss.Move_FP.FrStart
|
||
LD A,(EXE_FM)
|
||
CALL MOVE_FP
|
||
;R02
|
||
LD SP,#403F ;!HARDCODE STACK before start EXE. “áâ ¢«¨¢ ¥âáï ª®£¤ ¢®âªãâë SHARED_PAGE
|
||
;
|
||
_ret+1: JP 0
|
||
|
||
_TST_PROC_2:
|
||
LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG)
|
||
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
|
||
LD DE,#0080
|
||
AND 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,CurrentDirectory
|
||
CALL CHDIR_FN
|
||
POP IX
|
||
;
|
||
RET
|
||
;
|
||
;-----------------------------------------------------------------------
|
||
|
||
;/////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #41. ‡ ¢¥àè¨âì ¯à®£à ¬¬ã (¯à®æ¥áá).
|
||
;
|
||
; ¢å®¤: B - ª®¤ § ¢¥à襨ï
|
||
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
|
||
;
|
||
; ‚ë室 ¨§ EXE-ä ©« :
|
||
;
|
||
; 1) Žá¢®¡®¦¤ îâáï ¢á¥ ¡«®ª¨ ¯ ¬ï⨠ª®â®àë¥ ¢ë¤¥«ï« áì ¤ ®¬ã ¯à¨«®¦¥¨î.
|
||
; 2) ‚®ááâ ¢«¨¢ îâáï áâà ¨æë ª®â®àë¥ ¡ë«¨ ¯®¤ª«îç¥ë ¤® § ¯ã᪠EXE-ä ©« .
|
||
; 3) ‚ᯮ¬¨ ¥âáï á⥪.
|
||
; 4) ‚ ॣ¨áâà A ¯®¬¥é ¥âáï ª®¤ ¢®§¢à â ¨ ¢ë¯®«ï¥âáï RET.
|
||
;
|
||
;/////////////////////////////////////////////////////////////////////
|
||
LEAVE: LD A,B
|
||
LD (ErrorLevel),A
|
||
CALL FREE_PROCESS_MEMORY
|
||
LD SP,(EXSTACK)
|
||
;[x] 10/12/23 close EXE FMs
|
||
CALL FREE_PROCESS_FMs
|
||
_mDECTASK
|
||
;
|
||
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,(ErrorLevel)
|
||
;R12
|
||
CP DSS_Error.sys.UNEXPECTED_APP_TRMN
|
||
JR NZ,.exit
|
||
SCF
|
||
JP (HL)
|
||
;
|
||
.exit: AND A
|
||
JP (HL)
|
||
|
||
;/////////////////////////////////////////////////////////////////////
|
||
; ”ãªæ¨ï #42. <20>®«ãç¨âì ª®¤ § ¢¥àè¥¨ï ¯à®£à ¬¬ë.
|
||
;
|
||
; ¢å®¤: ¥â
|
||
; ¢ë室: A - ª®¤ § ¢¥à襨ï
|
||
;/////////////////////////////////////////////////////////////////////
|
||
WAIT: LD A,(ErrorLevel)
|
||
AND A
|
||
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.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
|
||
;!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
|
||
|
||
|
||
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 ; ¤à¥á á⥪
|
||
|
||
;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] |