Estex-DSS/SHELL/SHELL.ASM

555 lines
13 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.

; <20>®á«¥¤­ïï । ªæ¨ï: 22.10.2006
;
; - ˆá¯à ¢«¥­ ä¨à¬. ¡ £, ¯à¨ ª®â®à®¬ áâப  ¢ bat-ä ©«¥, ¤«¨­­¥¥ è¨à¨­ë
; íªà ­ , ®¡à¥§ « áì ¯® è¨à¨­¥ íªà ­  ¨ ®áâ â®ª áâப¨ ­¥ ¢ë¢®¤¨«áï.
; - ˆá¯à ¢«¥­ ä¨à¬. ¡ £, ¯à¨ ª®â®à®¬ ¢ ª®¬ ­¤¥ "dir" áâப  ¢ë¢®¤¨¬®£®
; ¯ã⨠¨¬¥«  ¬ ªá. 15 ᨬ¢®«®¢.
; - <20>®ä¨ªá¥­® ­¥¢¥à­®¥ ¨§¬¥­¥­¨¥ ¤¨áª /¯ã⨠¯®á«¥ ®è¨¡®ª ¢ë¯®«­¥­¨ï ª®¬ ­¤.
; - „®¡ ¢«¥­  ª®¬ ­¤  "ECHO." ¤«ï ¢áâ ¢ª¨ ¯ãá⮩ áâப¨.
; - Š®¬ ­¤  DIR ¢ë¢®¤¨â ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª®¢.
;
;
; SYSTEM.EXE /S /P
;
; /P Primary command processor
; /S Secondary command processor
; /C Execute batch file
;=====================================================================[]
;Rev. Date Name Description
;---------------------------------------------------------------------[]
;R14 22-09-2023 BAO ˆá¯à ¢«¥­ ¡ £ "File not found" ¢ ª®¬ ­¤¥ DIR ­  ¯ãá⮬ à §¤¥«¥
;R13 03-08-2023 BAO „®¡ ¢«¥­ ¢ë¢®¤ ­®¬¥à  ¢¥àᨨ Š®­á®«¨ ¤«ï ª®¬ ­¤ë VERSION
;R12 23-07-2023 BAO „®¡ ¢«¥­  ª®¬ ­¤  REBOOT - ¯¥à¥§ £à㧪  á ¯®«­®© ®ç¨á⪮© ¯ ¬ïâ¨
;R11 20-07-2023 BAO <09>®¯à ¢«¥­  äã­ªæ¨ï LCPIR ¤«ï ª®à४⭮£® ¢ë¡®à  á®®¡é¥­¨ï ®¡ ®è¨¡ª¥ ¯à¨ ­®¬¥à¥ ®è¨¡ª¨ > § £®â®¢«¥­­ëå á®®¡é¥­¨©
;R10 16-05-2023 BAO TE•T MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP
;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET
;R07 14-12-2002 DNS PARSING BATCH LINE
;R06 12-12-2002 DNS ADD %0, %1, %2 ...
;R05 11-12-2002 DNS IMPLEMENTED %VAR%
;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE
;R03 11-12-2002 DNS NEW VERSION
;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES
;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO
;=====================================================================[]
includelua 'Shared_includes/lua/Functions.lua'
include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc'
include 'SHELL/version.inc'
;
; Program EQU section
;---------------------------------------------------------------------[]
CR EQU 13
LF EQU 10
true EQU 1
false EQU 0
Loader_length EQU 0
code_addr EQU shell
program_start EQU shell
stack_point EQU #BFFE
org_addr EQU #8000 + CLP_Buffer
;---------------------------------------------------------------------[]
;
;work_buffer1 equ entry - (256+128) ; 2-© à ¡. ¡ãä¥à ; 128 bytes
;work_buffer2 equ entry - 256 ; 3-© à ¡. ¡ãä¥à ; 256 bytes
; org 7F00h
; db "EX" ; exe ID
; db 45h ; exe ⨯
; db 0 ; exe ¢¥àá¨ï
; dw 512 ; 512, ¬«. ᬥé. ª®¤ 
; dw 0 ; áâ. ᬥé. ª®¤ 
; dw 0 ; end-beg, ¯¥à¢¨ç­ë© § £àã§ç¨ª
; dw 0,0,0 ; १¥à¢
; dw entry ;  ¤à¥á § £à㧪¨ ª®¤ 
; dw shell ;  ¤à¥á ¯¥à¥¤ ç¨ ã¯à ¢«¥­¨ï
; dw #BFFE ;  ¤à¥á á⥪ 
; ds 490 ; १¥à¢
; ‚¥àá¨ï/Œ®¤¨ä¨ª æ¨ï/<2F>¨«¤ 襫« 
;entry: db "0.01.003" ;!FIXIT ¯¥à¥­¥á⨠¢ ª®­¥æ
INCLUDE 'Shared_Includes/constants/EXE_Header.z80'
ORG org_addr
;==============================================================
; ’®çª  ¢å®¤  ¢ ˜¥««
;==============================================================
shell:
;!TODO merge:  ªâ¨¢¨à®¢ âì ª®£¤  ¡ãä¥àë ¡ã¤ãâ ç¥à¥§ áâàãªâãàã,   ­¥ ­ã«ï¬¨
;LD HL,WORK_BUFFERS
;LD DE,WORK_BUFFERS+1
;LD BC,BUFFERS_STRUCT-1
;LD (HL),0
;LDIR
;
; á®åà. ã஢¥­ì ⥪. 襫« 
ld a,(ix-1)
ld (cmd_exit.TASKX),a
push ix
call save_disk_path ; á®åà. ⥪. ¤¨áª ¨ ¯ãâì
pop hl ; hl=ix
;
; ’¥áâ ­  ®¯æ¨¨ § ¯ã᪠ á ¬®£® 襫« 
call GET_CMD
ld a,(RUNMODE) ; ¡¨â-ä« £¨ ®¯æ¨©
bit 7,a ; "P" 7-© ¡¨â (¨¤¥â ¢ë§®¢ ¨§ boot-§ £àã§ç¨ª )
jr nz,FPRIMAR
bit 5,a ; "S" 5-© ¡¨â (§ ¯ã᪠2-© ª®¯¨¨ 襫« )
;jp nz,option_s
jr nz,run_shell
bit 4,a ; "C" 4-© ¡¨â (¢ë¯®«­¨âì bat-ä ©«)
jr nz,option_c
bit 6,a ; 6-© ¡¨â (¢¢®¤¨«¨áì ¤®¯®«­. ¯ à ¬¥âàë)
jr z,back_to_parent_process
; ¢¢®¤¨«¨áì ¤®¯®«­. ¯ à ¬¥âàë
call CMDMODE ; (batch.asm) ¢ë¯®«­. ª®¬ ­¤ã ¨«¨ § ¯ãáâ¨âì ä ©«
call save_disk_path ; ã§­ âì ¨ á®åà. ⥪. ¤¨áª ¨ ¯ãâì
;
; ‚¥à­ãâìáï ¢ த¨â. ¯à®æ¥áá
back_to_parent_process:
ld bc,0*256 + Dss.Exit
RST ToDSS
ret
;---------------------------------------------------------------
; ޝæ¨ï "S". ‡ ¯ã᪠2-© ª®¯¨¨ 襫« . <20>¥§ ®âà ¡®âª¨ AUTOEXEC.BAT.
; Œ®¦­® ¢ë©â¨ ¯® EXIT.
;---------------------------------------------------------------
; option_s:
; call cmd_version ; ¢¥àá¨ï „Ž‘
; jr run_shell
;---------------------------------------------------------------
; ޝæ¨ï "C". ‚믮«­¨âì BAT-ä ©«.
; <20>®á«¥ ¢ë¯®«­¥­¨ï ä ©« , ¢®§¢à é ¥âáï ¢ த¨â¥«ì᪨© ¯à®æ¥áá.
;---------------------------------------------------------------
option_c:
;ld hl,T96AE ; ¨¬ï bat-ä ©« , 256 ¡ãä¥à (inline.asm)
;ld hl,work_buffer+256;;
ld hl,struct_input_line+5 ; ¨¬ï bat-ä ©« 
call BATCH ; ®¡à ¡®âª  bat-ä ©«  (batch.asm)
call save_disk_path ; ã§­ âì ¨ á®åà. ⥪. ¤¨áª ¨ ¯ãâì
jr back_to_parent_process ; ¢¥à­ãâìáï ¢ த¨â. ¯à®æ¥áá
;---------------------------------------------------------------
; ޝæ¨ï "P". ‡ ¯ã᪠ª®¯¨¨ 襫« . ®âà ¡®âª®© AUTOEXEC.BAT.
; ­¥© ¨¤¥â ¢ë§®¢ 襫«  ¨§ boot-§ £àã§ç¨ª .
; Œ®¦­® ¢ë©â¨ ¯® EXIT, ­® ­¥ ¨§ § ¯ã饭­®£® boot-§ £àã§ç¨ª®¬.
;---------------------------------------------------------------
FPRIMAR:
ld c,Dss.CTRLKey ; ã§­ âì á®áâ. ª« ¢ë ¢ ¤ ­­ë© ¬®¬¥­â
RST ToDSS
ld hl,autoexec_fname ; ¨¬ï ä ©«  "system.bat"
ld a,b
and #C0 ; ­ ¦ âë Shift-ë ?
call z,BATCH ; ­¥â, ¢ë¯®«­¨âì bat-ä ©« (batch.asm)
;==============================================================
; ‡ ¯ã᪠ª®¯¨¨ 襫« 
;==============================================================
run_shell:
call newline
run_shell_loop:
;call A82CC ; ã§­ âì ¨ ãáâ. ¯®«®¦. ªãàá®à 
; ¢ë¢¥á⨠⥪.á¨áâ. ¯ãâì ¨ ¢®©â¨ ¢ áâபã । ªâ¨à®¢ ­¨ï
call save_disk_path ; ã§­ âì ¨ á®åà. ⥪. ¤¨áª ¨ ¯ãâì
run_shell_loop1:
call input_line
call newline ; ­  ­®¢ãî áâபã
ld a,(struct_input_line+4) ; ç¨á«® ¢¢¥¤. ᨬ¢®«®¢
or a
jr z,run_shell_loop1 ; ¯ãáâ ï
; <20> àᨭ£ ¨ ¢ë¯®«­¥­¨¥ ª®¬ ­¤
call COMP
jr run_shell_loop ; ­ § ¤ ¢ 横«
; ’¥áâ ®¯æ¨© 襫« 
; ¢å®¤: hl= ¤à¥á ª®¬-áâப¨
GET_CMD:
ld e,(hl) ; ¤«¨­  áâப¨
inc hl
ld d,0
ex de,hl ; hl=¤«¨­  áâப¨, de=áâப 
add hl,de
; ã¡à âì ª®­æ¥¢ë¥ ¯à®¡¥«ë
dec hl
ld a,(hl)
cp " "
jr z,$-4
inc hl
ld (hl),0 ; ¢ ª®­¥æ ª®¬-áâப¨
.NEXTPRM:
ex de,hl ; hl=⥪.  ¤à¥á ¢ áâப¥
.SKIPSP:
ld a,(hl)
inc hl
cp " "
ret c
jr z,.SKIPSP
dec hl
cp '/' ; ®¯æ¨ï
jr nz,.PROCESS
ld de,work_buffer1 ; 128 ¡ãä¥à ¤«ï ¯ à ¬¥âà 
ld c,Dss.GSwitch ; ¢ë¤¥«. ¯ à ¬¥âà ª®¬-áâப¨
RST ToDSS
push af
ex de,hl
ld hl,work_buffer1 ; 128 ¡ãä¥à ¤«ï ¯ à ¬¥âà 
inc hl
call set_option_flag ; ãáâ. ¡¨âë ä« £®¢
pop af
jr nc,.NEXTPRM
ret
; ãáâ. ¡¨â-ä« £
.PROCESS:
ld a,(RUNMODE)
set 6,a ; 6-© ¡¨â (¢¢®¤¨«¨áì ¤®¯®«­. ¯ à ¬¥âàë) ;!HARDCODE
ld (RUNMODE),a
; ᪮¯¨à. ¯ à ¬¥âà ¨§ ª®¬-áâப¨
; ¢ ¡ãä¥à áâப¨ । ªâ¨à®¢ ­¨ï
;copy_to_input_line:
ld iy,struct_input_line ; áâàãªâãà  ¡ãä¥à  ~input line~
push hl
call clear_inpline ; ®¡­ã«¨âì áâàãªâãàã "input line"
pop de ; de=墮áâ áâப¨
.loop: ld hl,struct_input_line ; áâàãªâãà  ¡ãä¥à  ~input line~
ld a,(iy+2) ; X ⥪. ¯®«®¦. ªãàá®à  ¢ áâப¥
add a,(iy+3)
add a,l
ld l,a
jr nc,1F
inc h
1: inc hl
inc hl
inc hl
inc hl
inc hl
ld a,(de) ; ᨬ¢®« ¨§ áâப¨
ld (hl),a
or a
ret z ; ª®­¥æ áâப¨
inc (iy+4) ; ç¨á«® ¢¢¥¤. ᨬ¢®«®¢
inc (iy+2) ; X ⥪. ¯®«®¦. ªãàá®à  ¢ áâப¥
ld a,(width_inpline) ; è¨à¨­  ¯®«ï ¢¢®¤ 
cp (iy+2) ; X ⥪. ¯®«®¦. ªãàá®à  ¢ ¯à¥¤¥« å áâப¨
jr nz,2F
; ªãàá®à §  ¯à ¢ë¬ ªà ¥¬ ¯®«ï ¢¢®¤ 
inc (iy+3) ; ᬥé. áâப¨ §  «¥¢ë© ªà ©
dec (iy+2) ; X ⥪. ¯®«®¦. ªãàá®à  ¢ ¯à¥¤¥« å áâப¨
2: ld a,(de) ; ᨬ¢®« ¨§ áâப¨
inc de ; ¯à®¤¢. ¯®â®ª
cp " "
jr nc,.loop
ret
; ’¥áâ ­  ®¯æ¨¨ 襫«  ¨ ãáâ. ¡¨â-ä« £®¢
; ¢å®¤: hl=áâப  ®¯æ¨©
set_option_flag:
ld a,(RUNMODE) ; ï祩ª  ¡¨â-ä« £®¢
ld c,a
ld a,(hl)
cp "a"
jr c,setopt1
cp "z"+1
jr nc,$+4
and 5Fh ; a..z -> A..Z
setopt1: cp "P" ; § ¯ã᪠襫«  á ®âà ¡. autoexec.bat
jr nz,setopt2
set 7,c
jr setopt4
;
setopt2: cp "S" ; § ¯ã᪠2-© ª®¯¨¨ 襫«  (¡¥§ ®âà ¡. autoexec.bat)
jr nz,setopt3
set 5,c
jr setopt4
;
setopt3:cp "C" ; ¢ë¯®«­. bat-ä ©« ¨ ¢¥à­ãâìáï ¢ த¨â. ¯à®æ¥áá
ret nz
set 4,c
setopt4: ld a,c
ld (RUNMODE),a
ret
;!TODO ¯à®¢¥à¨âì 4 ­¨¦¥¨¤ã騥 ¯à®æ¥¤ãàë ª®£¤  ¢ DSS ¡ã¤ãâ ­®à¬ «ì­® ¯ã⨠§ ¯®¬¨­ âìáï
; ‘®åà ­¨âì ⥪. ¤¨áª ¨ ¯ãâì
;GETPATH:
save_disk_path:
; ã§­ âì ⥪. ª â «®£
ld hl,system_path ; 256 ¡ãä¥à á¨áâ. ¯ãâ¨
ld c,Dss.CurDir
RST ToDSS
save_disk:
; ã§­ âì ⥪. ¤¨áª
ld c,Dss.CurDisk
RST ToDSS
add a,"A"
ld (screen_path),a ; 33 áâப  íªà ­­®£® ¯ãâ¨
ret
;!FIXIT ã¡à âì «¨è­¨¥ ¢ë§®¢ë
; ‚®ááâ ­®¢¨âì ⥪. ¤¨áª ¨ ¯ãâì (¯®á«¥ ®è¨¡ª¨)
restore_disk_path:
; ãáâ. ⥪. ¤¨áª
ld a,(screen_path) ; 33 áâப  íªà ­­®£® ¯ãâ¨
sub "A"
ld c,Dss.ChDir
RST ToDSS
;!FIXIT ã¡à âì «¨è­¨¥ ¢ë§®¢ë
restore_path:
; ãáâ. ⥪. ª â «®£
ld hl,system_path ; 256 ¡ãä¥à á¨áâ. ¯ãâ¨
ld c,Dss.ChDir
RST ToDSS
ret
; ­  ­®¢ãî áâபã ;!FIXIT ᤥ« âì ç¥à¥§ .PChars
newline: ld a,_cc.cr
ld c,Dss.PutChar
rst ToDSS
ld a,_cc.lf
ld c,Dss.PutChar
jp ToDSS
; ‘à ¢­¥­¨¥ áâப
; in: de=string1
; hl=string2
; b=¤«¨­  áâப¨
A874E: ld a,(de)
cp "a"
jr c,$+8
cp "z"+1
jr nc,$+4
and 5Fh ; a..z -> A..Z
cp (hl)
ret nz
inc hl
inc de
djnz A874E
ret
; ‘ª®¯¨à. áâபã (á ­ã«¥¬), ¬ ªá. 15 ᨬ¢®«®¢
; (hl) -> (de)
ncopy_string:
ld bc,15 ; ¬ ªá. ¤«¨­  áâப¨
ld a,(hl)
ldi
ret po
or a
jr nz,$-5
ret
; ‘ª®¯¨à. áâபã (á ­ã«¥¬)
; (hl) -> (de)
copy_string:
ld a,(hl)
ldi
or a
jr nz,copy_string
ret
; „¥áïâ¨ç­ë© ¢ë¢®¤ ¢ ¡ãä¥à
; ¢å®¤: a=ç¨á«®
; hl=¡ãä¥à
A8913: ld c,2Fh
inc c
sub 10
jr nc,$-3
add a,10
add a,"0"
push af
ld a,c
ld (hl),a
inc hl
pop af
ld (hl),a
inc hl
ret
A893C: ld hl,0
A893F: ld a,(de)
inc de
or a
ret z
cp "." ; à §¤¥«. ¤ âë
ret z
cp "-" ; à §¤¥«. ¤ âë
ret z
cp ":" ; à §¤¥«. ¢à¥¬¥­¨
ret z
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,bc
add hl,hl
call A895A
ret c
add a,l
ld l,a
jr nc,A893F
inc h
jr A893F
; char -> int
A895A: cp "0"
ret c
cp "9"+1
ccf
ret c
sub "0"
ret
;!FIXIT ¥áâì ¤ã¡«
A8964: ld de,10000
ld a,#C8 ; ret z
ld (D8996),a
call A898E
ld de,1000
call A898E
ld de,100
call A898E
ld de,10
call A898E
ld a,l
add a,"0"
;!TEST
;ld (ix+0),a
;inc ix
;ld (ix+0),0
LD (IX+0),A
LD (IX+1),0
;
ret
A898E: xor a
inc a
sbc hl,de
jr nc,$-3
add hl,de
dec a
D8996: ret z
add a,"0"
ld (ix+0),a
inc ix
xor a ; nop
ld (D8996),a
ret
Restore_Screen:
PUSH AF
LD C,Dss.GetVMod
RST ToDSS
AND #80
JR Z,.exit
LD BC,1 * 256 + Dss.SetVMod
LD A,Dss.SetVMod.txt80x32
RST ToDSS
.exit: POP AF
RET
; 梥â íªà ­  襫« 
color_screen:
db 07h
; ˆ¬ï ä ©«  "autoexec.bat"
autoexec_fname:
db "system.bat",0
; ¡¨â-ä« £¨ ®¯æ¨© á ¬®£® 襫« 
RUNMODE: db 0
; ¡ãä¥à à áè. ä ©« 
T8C1A: ds 3
db 0
T8C1E: db "BAT" ; à áè. bat-ä ©« 
T8C21: db "ON",0
T8C24: db "OFF",0
include 'edline.asm' ; áâப  । ªâ¨à®¢ ­¨ï
include 'batch.asm' ; ¯ àᨭ£ bat-ä ©«®¢
include 'exec.asm' ; ¢ë¯®«­. ¢¢¥¤. ª®¬ ­¤ á ª®­á®«¨
include 'procedures/print.asm' ; ä㭪樨 ¢ë¢®¤  á®®¡é¥­¨©
include 'messages/errors_txt.asm' ; á®®¡é¥­¨ï ®¡ ®è¨¡ª å
include 'messages/main_txt.asm' ; á®®¡é¥­¨ï
include 'procedures/parsers.asm' ; ä㭪樨 ¯à®ç¥á뢠­¨ï ¨ ¢ë¡®à 
include 'procedures/math.asm' ; ä㭪樨 ¬ â¥¬ â¨ç¥áª¨¥
;
include 'Commands/exit.asm' ; ¢ë室 ¢ த¨â. ¯à®æ¥áá
include 'Commands/pause.asm' ; ¯ ã§ 
include 'Commands/rem.asm' ; ª®¬¬¥­â à¨©
include 'Commands/ver.asm' ; ¢ë¢®¤ ¢¥àᨨ „Ž‘
include 'Commands/cls.asm' ; ®ç¨á⪠ íªà ­ 
include 'Commands/date.asm' ; ¢ë¢®¤ ¨«¨ ãáâ ­®¢ª  ¤ âë/¢à¥¬¥­¨
include 'Commands/dir.asm' ; ¢ë¢®¤ ᯨ᪠ ¤¨à¥ªâ®à¨¨
include 'Commands/chdir.asm' ; ᬥ­  ⥪. ª â «®£ 
include 'Commands/mkdir.asm' ; á®§¤ ­¨¥ ª â «®£ 
include 'Commands/rmdir.asm' ; 㤠«¥­¨¥ ª â «®£ 
include 'Commands/del.asm' ; 㤠«¥­¨¥ ä ©« 
include 'Commands/ren.asm' ; ¯¥à¥¨¬¥­®¢ ­¨¥ ä ©«  ¨«¨ ª â «®£ 
include 'Commands/echo.asm' ; íå®-०¨¬
include 'Commands/help.asm' ; ¢ë¢®¤ íªà ­  ¯®¬®é¨
include 'Commands/path.asm' ; § ¤ âì á¨áâ. ¯ãâì
include 'Commands/set.asm' ; § ¤ âì ¯¥à¥¬¥­­ãî ®ªà㦥­¨ï
include 'Commands/reboot.asm' ; á®äâ à¥á¥â
;
DISPLAY "Empty space for buffers from ",/H,$
work_buffer1 equ $ ; 2-© à ¡. ¡ãä¥à ; 128 bytes
work_buffer2 equ work_buffer1+128 ; 3-© à ¡. ¡ãä¥à ; 256 bytes
;