mirror of
https://github.com/romychs/SprinterFirmware.git
synced 2025-04-18 18:12:39 +03:00
1209 lines
15 KiB
NASM
1209 lines
15 KiB
NASM
|
|
;[BEGIN]
|
|
;//MODULE: EXECUTE
|
|
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
|
|
;//UPDATE: 24-10-1999 DNS Restore module
|
|
;---------------------------------------------------------------
|
|
;Rev Date Name Description
|
|
;---------------------------------------------------------------
|
|
;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE
|
|
;R02 24-05-1999 DNS FIX CREATE PSP AND
|
|
; MOVE EXEC STACK
|
|
;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC
|
|
;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH
|
|
;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX
|
|
;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING
|
|
;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH
|
|
;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR
|
|
;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR
|
|
;---------------------------------------------------------------
|
|
|
|
;
|
|
; 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,#0100
|
|
XOR A
|
|
CPIR
|
|
LD A,#5C ;"\"
|
|
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,ERR_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,1
|
|
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,2
|
|
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,16
|
|
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
|
|
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 #08
|
|
RET
|
|
|
|
; B - SIZE BLOCK
|
|
; RET: A - ID MEMORY BLOCK
|
|
|
|
GETMEM
|
|
LD C,#C2
|
|
RST #08
|
|
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,31
|
|
SCF
|
|
RET NZ
|
|
PUSH DE
|
|
LD A,E
|
|
LD C,#C3
|
|
RST #08
|
|
POP DE
|
|
LD A,31
|
|
RET C
|
|
LD HL,MEMTAB
|
|
ADD HL,DE
|
|
XOR A
|
|
LD (HL),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,31
|
|
SCF
|
|
RET NZ
|
|
LD D,B
|
|
PUSH DE
|
|
LD A,E
|
|
CALL SIZEBLK
|
|
POP DE
|
|
LD A,31
|
|
RET C
|
|
LD A,B
|
|
CP D
|
|
RET Z
|
|
JR C,INCMEM
|
|
DECMEM LD B,D
|
|
LD A,E
|
|
LD C,#9D
|
|
RST #08
|
|
LD A,B
|
|
LD C,#C3
|
|
RST #08
|
|
XOR A
|
|
RET
|
|
|
|
INCMEM LD A,D
|
|
SUB B
|
|
LD B,A
|
|
LD C,E
|
|
PUSH BC
|
|
LD C,#C2
|
|
RST #08
|
|
POP BC
|
|
LD B,A
|
|
LD A,30
|
|
RET C
|
|
LD A,C
|
|
LD C,#9E
|
|
RST #08
|
|
XOR A
|
|
RET
|
|
|
|
SIZEBLK LD B,#FF
|
|
LD C,A
|
|
BLK001 INC B
|
|
PUSH BC
|
|
LD A,C
|
|
LD C,#C4
|
|
RST #08
|
|
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 PAGE1
|
|
BIT 6,H ;if 0C000h or high?
|
|
JR Z,SETWIN2 ;no, go to open in PAGE2
|
|
JR SETWIN3 ;yes, go to open in PAGE3
|
|
|
|
; B - LOGICAL PAGE
|
|
; A - ID BLOCK
|
|
; RET: A - PAGE (WIN)
|
|
|
|
SETWIN1 LD C,#C4
|
|
EX DE,HL
|
|
RST #08
|
|
EX DE,HL
|
|
RET C
|
|
LD C,PAGE1
|
|
IN B,(C)
|
|
OUT (C),A
|
|
LD A,B
|
|
RET
|
|
|
|
SETWIN2 LD C,#C4
|
|
EX DE,HL
|
|
RST #08
|
|
EX DE,HL
|
|
RET C
|
|
LD C,PAGE2
|
|
IN B,(C)
|
|
OUT (C),A
|
|
LD A,B
|
|
RET
|
|
|
|
SETWIN3 LD C,#C4
|
|
EX DE,HL
|
|
RST #08
|
|
EX DE,HL
|
|
RET C
|
|
LD C,PAGE3
|
|
IN B,(C)
|
|
OUT (C),A
|
|
LD A,B
|
|
RET
|
|
|
|
EXEC
|
|
INC B ;R03
|
|
DEC B ;R03
|
|
JP Z,EXEC0 ;R03
|
|
DEC B ;R03
|
|
JP Z,EXEC1 ;R03
|
|
LD A,ERR_INVALID_FUNCTION ;R03
|
|
SCF ;R03
|
|
RET ;R03
|
|
|
|
CHECKPATH
|
|
LD A,(HL)
|
|
INC HL
|
|
CP #5C ;"\"
|
|
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 (PAGE3),A
|
|
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
|
|
|
|
;;;
|
|
|
|
ENVTEMP EQU #FE00
|
|
TMP_CURDIR EQU #FD00
|
|
PATH_PNT_ARRAY EQU #FC80
|
|
|
|
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
|
|
CALL OPENEXE
|
|
JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
|
|
JR DECTASK ;R08
|
|
|
|
EXEC0_SHORT
|
|
;SHORT NAME
|
|
|
|
; TRY TO FIND IN CURRENT DIRECTORY
|
|
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, SEACHING 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,#5845
|
|
SBC HL,DE
|
|
LD A,17
|
|
SCF
|
|
JP NZ,ERREXE
|
|
LD A,(IX+3)
|
|
OR A
|
|
LD A,18
|
|
SCF
|
|
JP NZ,ERREXE
|
|
LD DE,(LOADER)
|
|
LD A,E
|
|
OR D
|
|
JP NZ,PRELOAD
|
|
LD L,A
|
|
LD H,A
|
|
PUSH HL
|
|
POP IX
|
|
LD B,#02
|
|
LD A,(EXE_FM)
|
|
CALL MOVE_FP
|
|
LD DE,(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,(PAGE3)
|
|
LD D,A
|
|
IN A,(PAGE2)
|
|
LD E,A
|
|
IN A,(PAGE1)
|
|
PUSH DE
|
|
PUSH AF
|
|
LD (EXSTACK),SP
|
|
LD SP,HL
|
|
EXX
|
|
LD DE,RAMMAP
|
|
LD BC,#00C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
LD (DE),A
|
|
INC DE
|
|
LD BC,#01C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
LD (DE),A
|
|
INC DE
|
|
LD BC,#02C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
LD (DE),A
|
|
INC DE
|
|
LD BC,#03C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
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 (PAGE1),A
|
|
OUT (PAGE2),A
|
|
OUT (PAGE3),A
|
|
LD HL,(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 (PAGE1),A
|
|
INC DE
|
|
FR8000
|
|
LD A,(DE)
|
|
OUT (PAGE2),A
|
|
INC DE
|
|
FRC000
|
|
LD A,(DE)
|
|
OUT (PAGE3),A
|
|
CALL M_PSP
|
|
LD HL,(OFFCOD2)
|
|
LD IX,(OFFCOD1)
|
|
LD B,#00
|
|
LD A,(EXE_FM)
|
|
CALL MOVE_FP
|
|
LD SP,#403F
|
|
LD DE,(LD_ADDR)
|
|
XOR A
|
|
LD L,A
|
|
LD H,A
|
|
SBC HL,DE
|
|
EX DE,HL
|
|
LD HL,(LD_ADDR)
|
|
LD A,(EXE_FM)
|
|
CALL READ
|
|
LD A,(EXE_FM)
|
|
CALL CLOSE
|
|
LD SP,(SP_REG)
|
|
LD HL,(LD_ADDR)
|
|
LD DE,#0080
|
|
AND A
|
|
SBC HL,DE
|
|
EX DE,HL
|
|
LD XH,D
|
|
LD XL,E
|
|
LD HL,(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,(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
|
|
JR C,ERREXE0
|
|
LD (EXE_MEM),A
|
|
EXX
|
|
POP DE
|
|
LD HL,#0000
|
|
ADD HL,SP
|
|
LD SP,(EXSTACK)
|
|
PUSH HL
|
|
PUSH DE
|
|
IN A,(PAGE3)
|
|
LD D,A
|
|
IN A,(PAGE2)
|
|
LD E,A
|
|
IN A,(PAGE1)
|
|
PUSH DE
|
|
PUSH AF
|
|
LD (EXSTACK),SP
|
|
LD SP,HL
|
|
EXX
|
|
LD DE,RAMMAP
|
|
LD BC,#00C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
LD (DE),A
|
|
INC DE
|
|
LD BC,#01C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
LD (DE),A
|
|
INC DE
|
|
LD BC,#02C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
LD (DE),A
|
|
INC DE
|
|
LD BC,#03C4
|
|
LD A,(EXE_MEM)
|
|
RST #08
|
|
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 (PAGE1),A
|
|
OUT (PAGE2),A
|
|
OUT (PAGE3),A
|
|
LD HL,(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 (PAGE1),A
|
|
INC DE
|
|
FR8000H LD A,(DE)
|
|
OUT (PAGE2),A
|
|
INC DE
|
|
|
|
FRC000H
|
|
LD A,(DE)
|
|
OUT (PAGE3),A
|
|
CALL M_PSP
|
|
LD HL,(OFFCOD2)
|
|
LD IX,(OFFCOD1)
|
|
LD B,#00
|
|
LD A,(EXE_FM)
|
|
CALL MOVE_FP
|
|
LD SP,#403F
|
|
LD HL,(LD_ADDR)
|
|
LD DE,(LOADER)
|
|
LD A,(EXE_FM)
|
|
CALL READ
|
|
LD SP,(SP_REG)
|
|
LD HL,(LD_ADDR)
|
|
LD DE,#0080
|
|
AND A
|
|
SBC HL,DE
|
|
EX DE,HL
|
|
LD XH,D
|
|
LD XL,E
|
|
LD HL,(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 (PAGE1),A
|
|
LD A,L
|
|
OUT (PAGE2),A
|
|
LD A,H
|
|
OUT (PAGE3),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,(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
|
|
CPIR
|
|
DEC HL
|
|
DEC HL
|
|
LD A,#5C ;"\"
|
|
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,#8021
|
|
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
|
|
|
|
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
|
|
DS 512-($-EXEBUFF)
|
|
;(!!!HERE STACK FOR EXEC!!!)
|
|
|
|
DS 255
|
|
XSTACK DB #00
|
|
|
|
;//MODULE: EXECUTE
|
|
;[END]
|
|
|