Estex-DSS/SHELL/SHELL.ASM
Anatoliy Belyanskiy a99ed14bda bug fix
2023-08-12 05:21:13 +10:00

513 lines
11 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 ¢ë¢®¤¨â ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª®¢.
;
;
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
work_buffer1 equ entry - (256+128) ; 2-© à ¡. ¡ãä¥à ;!FIXIT ¯¥à¥­¥á⨠¢ ª®­¥æ
work_buffer2 equ entry - 256 ; 3-© à ¡. ¡ãä¥à ;!FIXIT ¯¥à¥­¥á⨠¢ ª®­¥æ
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 0C000h ;  ¤à¥á á⥪ 
ds 490 ; १¥à¢
; ‚¥àá¨ï/Œ®¤¨ä¨ª æ¨ï/<2F>¨«¤ 襫« 
entry: db "0.01.003" ;!FIXIT ¯¥à¥­¥á⨠¢ ª®­¥æ
;==============================================================
; ’®çª  ¢å®¤  ¢ ˜¥««
;==============================================================
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 A82E7
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
; ‚®ááâ ­®¢¨âì ⥪. ¤¨áª ¨ ¯ãâì (¯®á«¥ ®è¨¡ª¨)
restore_disk_path:
; ãáâ. ⥪. ¤¨áª
ld a,(screen_path) ; 33 áâப  íªà ­­®£® ¯ãâ¨
sub "A"
ld c,Dss.ChDir
RST ToDSS
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
RST ToDSS
ret
; ‘à ¢­¥­¨¥ áâப
; 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
A8964: ld de,10000
ld a,0C8h ; 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 "shell_exec.asm" ; ¢ë¯®«­. ¢¢¥¤. ª®¬ ­¤ á ª®­á®«¨
include "error.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" ; á®äâ à¥á¥â
;
;