Estex-DSS/DSS/EXECUTE.ASM

1386 lines
26 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>ਠ§ ¢¥à襭¨¨ ¯à¨«®¦¥­¨ï ç¥à¥§ äã­ªæ¨î #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
;---------------------------------------------------------------
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #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
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
; <20>®«ã祭¨¥ ¯ à ¬¥â஢ ª®¬ ­¤­®© áâப¨
APPINF1:
DJNZ APPINF2
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
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
; <20>®«ã祭¨¥ ¯®«­®£® ¯ã⨠ª ª â «®£ã ¯à®£à ¬¬ë
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
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #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 ;!FIXIT ­¥ çñ, çâ® ¨á¯®«ì§ã¥âáï ®¡é¨© ¡ãä¥à?
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 ;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 #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,' '
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 ; 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 BUFFER ;DS 256
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #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
LEAVMEM: 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
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #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: RRA
; 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
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #40. ‚믮«­¨âì ä ©«.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ä ©« 
; B=0 - § £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã á ª®à®âª¨¬ ¨¬¥­¥¬ (¡¥§ ¯®«­®£® ¯ã⨠¤® ¯à®£à ¬¬ë)
; B=1 - § £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã á ¯®«­ë¬ ¯ãâñ¬ ¤® ¯à®£à ¬¬ë
; ¢ë室: A - ª®¤ § ¢¥à襭¨ï, ¥á«¨ CF=0
; ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;/////////////////////////////////////////////////////////////////////
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:
SET_PAGE_X ENVPAGE
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
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
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 '\'
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
;;;
; !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
;------------------------------------------------------------------------
; ‡ £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã.
; äã­ª. 40h, 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> à ¬¥âàë ª®¬-áâப¨, § ª ­ç¨¢ ¥âáï ­ã«¥¬
;------------------------------------------------------------------------
EXEC0: LD (CMDLINE),HL
CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME
LD HL,(CMDLINE)
JR C,EXEC0_SHORT
EXEC1: CALL EXEC_1
SCF
RET ; File not found - exit
; ¯à¨ ¢ë室¥ á ®è¨¡ª®©, ¢ ॣ¨áâॠ€ - ª®¤ ®è¨¡ª¨
EXEC_1: LD (CMDLINE),HL
LD A,#01 ; %7600000R = !FAT_ATTR
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
CALL OPENEXE
JR NC,.noError
CALL DECTASK ;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 NO FOUND, SEARCHING IN PATH
; GET PATH AND ETC.
LD HL,ENVPATH
LD DE,ENVTEMP
LD B,Dss.Environ.Get
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
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 ; ­¥ ­ã¦­®, ¥á«¨ ¡ë ¡ë« 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 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
; A=0
LD H,A
LD L,A
LD XL,A
LD XH,A
;
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
;!FIXIT double 1
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 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,SECBUF+1
CALL SCOPYS
LD A,#80
SUB B
LD (SECBUF),A
;R02
LD SP,EXEBUFF+510 ;‚áâ ¢«ï¥âáï ¢ DSS_PAGE
;
LD A,DSS_PAGE ;!FIXIT ¢â몠âì áâà ­¨æë ¯à¨«®¦¥­¨ï
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,Dss.Move_FP.FrStart
LD A,(EXE_FM)
CALL MOVE_FP
;R02
LD SP,#403F ;!HARDCODE STACK before start EXE. “áâ ­ ¢«¨¢ ¥âáï ª®£¤  ¢®âª­ãâë DSS_PAGE
;
;
LD DE,(EXEBUFF.LD_ADDR)
XOR A
LD H,A
LD L,A
SBC HL,DE
EX DE,HL ; de=ç¨á«® ç¨â. ¡ ©â
LD HL,(EXEBUFF.LD_ADDR) ; ¡ãä¥à
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL CLOSE ; § ªàëâì ä ©«
;!FIXIT double 2
;R09
_mRestorePath
;
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: 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
CALL DECTASK
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:
;!FIXIT double 1
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 A,(EXE_MEM)
LD DE,RAMMAP
LD BC,#00*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,SECBUF+1
CALL SCOPYS
LD A,#80
SUB B
LD (SECBUF),A
;R02
LD SP,EXEBUFF+510 ;‚áâ ¢«ï¥âáï ¢ DSS_PAGE
;
LD A,DSS_PAGE
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,Dss.Move_FP.FrStart
LD A,(EXE_FM)
CALL MOVE_FP
;R02
LD SP,#403F ;!HARDCODE STACK before start EXE. “áâ ­ ¢«¨¢ ¥âáï ª®£¤  ¢®âª­ãâë DSS_PAGE
;
;
LD HL,(EXEBUFF.LD_ADDR) ; ¡ãä¥à
LD DE,(EXEBUFF.LOADER) ; ç¨á«® ç¨â. ¡ ©â
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
;!FIXIT double 2
;R09
_mRestorePath
;
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
;
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #41. ‡ ¢¥àè¨âì ¯à®£à ¬¬ã (¯à®æ¥áá).
;
; ¢å®¤: B - ª®¤ § ¢¥à襭¨ï
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; ‚ë室 ¨§ EXE-ä ©« :
;
; 1) Žá¢®¡®¦¤ îâáï ¢á¥ ¡«®ª¨ ¯ ¬ï⨠ª®â®àë¥ ¢ë¤¥«ï« áì ¤ ­­®¬ã ¯à¨«®¦¥­¨î.
; 2) ‚®ááâ ­ ¢«¨¢ îâáï áâà ­¨æë ª®â®àë¥ ¡ë«¨ ¯®¤ª«îç¥­ë ¤® § ¯ã᪠ EXE-ä ©« .
; 3) ‚ᯮ¬¨­ ¥âáï á⥪.
; 4) ॣ¨áâà A ¯®¬¥é ¥âáï ª®¤ ¢®§¢à â  ¨ ¢ë¯®«­ï¥âáï RET.
;
;/////////////////////////////////////////////////////////////////////
LEAVE: LD A,B
LD (ERLEVEL),A
CALL LEAVMEM
CALL DECTASK
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
;R12
JR Z,.exit
SCF
;
.exit: 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
.loop: LD A,(HL)
LDI
CP ' '+1
JR NC,.loop
DEC DE
XOR A
LD (DE),A
LD (LAST_PSP_PTR),IX
;
RET
SCOPYS: LD BC,#80*256 + ' '+1
.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 + ' '
.loop2: LD A,(HL)
LD (DE),A
INC HL
INC DE
CP C
RET C
DJNZ .loop2
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]