home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
varia
/
zshell28
/
zsh.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
13KB
|
599 lines
****************************************************
******** ZSHELL (C) 1990,91 Paul Hayter ********
******** updated to V2.2 by Martin Gierich ********
******** ZShell-Starter (ZSH) ********
****************************************************
*** TABSIZE = 8 Chars ***
*** Local Labels named .A to .Z ***
VERSION equ $1234
FIB equ 260 ;FileInfoBlock
ACCESS_READ equ -2
ACCESS_WRITE equ -1
MODE_READWRITE equ 1004
MODE_OLDFILE equ 1005
MODE_NEWFILE equ 1006
* PROCESS
pr_MsgPort equ 92
pr_SegList equ 128
pr_StackSize equ 132
pr_GlobVec equ 136
pr_TaskNum equ 140
pr_StackBase equ 144
pr_Result2 equ 148
pr_CurrentDir equ 152
pr_CIS equ 156
pr_COS equ 160
pr_ConsoleTask equ 164
pr_FileSystemTask equ 168
pr_CLI equ 172
pr_ReturnAddr equ 176
pr_PktWait equ 180
pr_WindowPtr equ 184
* COMMAND LINE INTERFACE
cli_Result equ 0
cli_SetName equ 4
cli_CommandDir equ 8
cli_ReturnCode equ 12
cli_CommandName equ 16
cli_FailLevel equ 20
cli_Prompt equ 24
cli_StandardInput equ 28
cli_CurrentInput equ 32
cli_CommandFile equ 36
cli_Interactive equ 40
cli_Background equ 44
cli_CurrentOutput equ 48
cli_DefaultStack equ 52
cli_StandardOutput equ 56
cli_Module equ 60
RETURN_OK EQU 0
RETURN_WARN EQU 5
RETURN_ERROR EQU 10
RETURN_FAIL EQU 20
*Assign Stuff
dl_Root equ 34 APTR
rn_Info equ 24 BPTR
di_DevInfo equ 4 BPTR
di_NetHand equ 16 BPTR
dvi_Next equ 0 BPTR
dvi_Type equ 4 LONG
dvi_Task equ 8 APTR
dvi_Lock equ 12 BPTR
dvi_Handler equ 16
dvi_StackSize equ 20
dvi_Priority equ 24
dvi_Startup equ 28
dvi_SegList equ 32
dvi_GlobVec equ 36
dvi_Name equ 40 BSTR
dt_device equ 0 <-- contents of dvi_Type
dt_dir equ 1
dt_volume equ 2
*Resident Stuff
resi_link equ 0 ;BPTR
resi_usecount equ 4 ;LONG
resi_seglist equ 8 ;BPTR
resi_name equ 12 ;BSTR
resi_length equ 4+4+4
*Icon Lib Stuff
sm_Process equ $14
sm_Segment equ $18
sm_NumArgs equ $1c
sm_ToolWindow equ $20
sm_ArgList equ $24
wa_Lock equ 0
wa_Name equ 4
do_Magic equ 0 ;must be $e310
do_Type equ $30
do_ToolTypes equ $36
do_ToolWindow equ $46
do_StackSize equ $4a
* AVAIL STUFF
MEMF_PUBLIC equ 1
MEMF_CHIP equ 2
MEMF_FAST equ 4
MEMF_CLEAR equ $10000
MEMF_LARGEST equ $20000
* LIBRARY CALLS
* EXEC
_LVOOldOpenLibrary equ -408
_LVOOpenLibrary equ -552
_LVOCloseLibrary equ -414
_LVOSetFunction equ -420
_LVOAllocMem equ -198
_LVOFreeMem equ -210
_LVORawDoFmt equ -522
_LVORawMayGetChar equ -510
_LVOFindTask equ -294
_LVOAddTask equ -282
_LVOForbid equ -132
_LVOPermit equ -138
_LVOAvailMem equ -216
_LVOPutMsg equ -366
_LVOGetMsg equ -372
_LVOReplyMsg equ -378
_LVOWaitPort equ -384
_LVOSetSignal equ -306
_LVOAllocSignal equ -330
_LVOFreeSignal equ -336
_LVOOpenDev equ -444
_LVOCloseDev equ -450
_LVODoIO equ -456
* DOS
_LVOSetProtection equ -186
_LVOOutput equ -60
_LVOWrite equ -48
_LVOLock equ -84
_LVOUnLock equ -90
_LVODupLock equ -96
_LVOExamine equ -102
_LVOExNext equ -108
_LVOOpen equ -30
_LVOClose equ -36
_LVORead equ -42
_LVOInput equ -54
_LVODeleteFile equ -72
_LVORename equ -78
_LVOCreateDir equ -120
_LVOCurrentDir equ -126
_LVOIoErr equ -132
_LVOParentDir equ -210
_LVOLoadSeg equ -150
_LVOUnLoadSeg equ -156
_LVOCreateProc equ -138
_LVOInfo equ -114
_LVODateStamp equ -192
_LVOSeek equ -66
_LVODeviceProc equ -174
_LVODelay equ -198
_LVOSetComment equ -180
_LVOIsInteractive equ -216
*Intuition
_LVOPrintIText equ -216
_LVODisplayBeep equ -96
*Icon
_LVOGetDiskObject equ -78
_LVOFreeDiskObject equ -90
_LVOFindToolType equ -96
_LVOMatchToolValue equ -102
* NEED THESE 2 MACROS FOR A68K ASSEMBLER
;blo macro
; bcs \1
; endm
;bhs macro
; bcc \1
; endm
*Constants (only LONGS!)
SHELLINE_SIZE equ 256 V1.30
CLIBUF_SIZE equ 256
NEWPRINTSIZE equ 200
PATH_SIZE equ 256 V1.30
HISTORY_SIZE equ 1024 MUST BE POWER OF 2
SEARCH_STRING_SIZE equ 60
DEST_LABEL_SIZE equ 60
* THE GENERAL MEMORY BLOCK (LONGS!)
blockbase equ 0 ;the fib or info goes here
sp_node equ blockbase+260 ;DOSpacket
sp_reply equ sp_node+14
sp_length equ sp_reply+4
;sp_ptr equ ;sp_ptr+4
sp_link equ sp_length+2
sp_port equ sp_link+4
packettype equ sp_port+4
sp_res1 equ packettype+4
sp_res2 equ sp_res1+4
myArg1 equ sp_res2+4
myArg2 equ myArg1+4
myArg3 equ myArg2+4
myArg4 equ myArg3+4
myArg5 equ myArg4+4
myArg6 equ myArg5+4
myArg7 equ myArg6+4
packettask equ myArg7+4
devproc equ packettask+4
dirlock equ devproc+4
last_failcode equ dirlock+4
outhandle equ last_failcode+4 ;Handles
inhandle equ outhandle+4
nonstdin equ inhandle+4 Allow 40 bytes
nonstdout equ nonstdin+40 Allow 40 bytes
stdout equ nonstdout+40
stdin equ stdout+4
EntryA0 equ stdin+4
better_Seglist equ EntryA0+4
parm1 equ better_Seglist+4 ;addr of each parameter within shelline
parm2 equ parm1+4
parm3 equ parm2+4
parm4 equ parm3+4
parm5 equ parm4+4
parm6 equ parm5+4
parm7 equ parm6+4
parm8 equ parm7+4
parm9 equ parm8+4
parm10 equ parm9+4
parm11 equ parm10+4
parm12 equ parm11+4
parm13 equ parm12+4
parm14 equ parm13+4
parm15 equ parm14+4
endofparms equ parm15+4+4*10 10 extra parms
shelline equ endofparms+4 for NULL-end
endofshelline equ shelline+SHELLINE_SIZE
CLIbuf equ endofshelline
NewPrintBuffer equ CLIbuf+CLIBUF_SIZE
errorstack equ NewPrintBuffer+NEWPRINTSIZE
topstack equ errorstack+4
stacksize equ topstack+4
temp1 equ stacksize+4
temp2 equ temp1+4
temp3 equ temp2+4
temp4 equ temp3+4
tempbuf equ temp4+4 double shellinesizebuffer
temp2buf equ tempbuf+2*SHELLINE_SIZE ;80 char temp buffer
dosbase equ temp2buf+80
intuibase equ dosbase+4
Result2 equ intuibase+4
kickver equ Result2+4
old_prompt equ kickver+2
old_setname equ old_prompt+4
old_homedir equ old_setname+4
Unused equ old_homedir+4
count_line equ Unused+18
ignoreit equ count_line+4 for filenamecompletition
OldCTask equ ignoreit+SEARCH_STRING_SIZE for the future
OldCIS equ OldCTask+4
OldCOS equ OldCIS+4
bordersize equ OldCOS+4
scsize equ bordersize+4
scaddr equ scsize+4
scptr equ scaddr+4
scflag equ scptr+4 new v1.29
openwin_flag equ scflag+1
noresi_flag equ openwin_flag+1
noreview_flag equ noresi_flag+1
ReviewMem equ noreview_flag+1
ReviewPtr equ ReviewMem+4
ReviewSize equ ReviewPtr+4
patharea equ ReviewSize+4
now equ patharea+PATH_SIZE
nost equ now+4
then equ nost+4
past equ then+4 ;history buffer=1024 bytes
thistask equ past+HISTORY_SIZE
gather_ptr equ thistask+4
gather equ gather_ptr+4 ;CSI string=40 bytes
tempbytes equ gather+40
first_set_defn equ tempbytes+2
set_search_string equ first_set_defn+4
mem_addr equ set_search_string+SEARCH_STRING_SIZE
wild_flag equ mem_addr+4
stat_mode_flag equ wild_flag+1
wild_string equ stat_mode_flag+1 allow 80 chars for wildcard
date_mark equ wild_string+80 3 lwords
mem_mark equ date_mark+12 3 lwords chip/fast/total
CD_string equ mem_mark+12 Allow 80 bytes.
prompt_string equ CD_string+80 Allow 80 bytes.
prompt_args equ prompt_string+80 Allow 40 bytes
line_count equ prompt_args+40 Allow 40 bytes
mult_comm_flag equ line_count+2
next_comm_ptr equ mult_comm_flag+2
ctrl_c_flag equ next_comm_ptr+4
failat_level equ ctrl_c_flag+2 word size
cd_block equ failat_level+2
cd_volnode equ cd_block+4
recurs_flag equ cd_volnode+4
indent_count equ recurs_flag+2
resi_flag equ indent_count+2
forcediskflag equ resi_flag+1
CLIflag equ forcediskflag+1
WBflag equ CLIflag+1
window_old equ WBflag+1
wb_msg equ window_old+4
iconbase equ wb_msg+4
diskobj equ iconbase+4
filesys_old equ diskobj+4
cdir_old equ filesys_old+4
cdback equ cdir_old+4
ctrl_codes equ cdback+4 Keyboard-CTRL-Codes
if_flag equ ctrl_codes+16
if_condition_flag equ if_flag+1
goto_flag equ if_condition_flag+1
unused equ goto_flag+1
dest_label equ unused+1
please_close_me equ dest_label+DEST_LABEL_SIZE
mem_offset_addr equ please_close_me+4
io_Message equ mem_offset_addr+4 ;io-request (timer)
io_Device equ io_Message+20
io_Unit equ io_Device+4
io_Command equ io_Unit+4
io_Flags equ io_Command+2
io_Error equ io_Flags+1
tv_secs equ io_Error+1
tv_micro equ tv_secs+4
io_pad equ tv_micro+4 ;don't remove
stackbot equ io_pad+8
sizeofblk equ stackbot
********************************************
; SECTION MYSHELL,CODE
;Try to open dos then do the shell
start moveq #-1,d7
move.l a0,a3
move.l 4.w,a6
move.l #sizeofblk,d0
move.l #1+1<<16,d1 "memf_public" & clear it
jsr _LVOAllocMem(a6) alloc general mem block
tst.l d0
beq blkfail
move.l d0,a5 A5=MEMBASE
move.l sp,topstack(a5)
move.l a3,EntryA0(a5)
move.w 20(a6),kickver(a5) Kickstart-Version
lea intuiname(pc),a1
jsr _LVOOldOpenLibrary(a6)
tst.l d0
beq intfail
move.l d0,intuibase(a5)
lea dosname(pc),a1
jsr _LVOOldOpenLibrary(a6)
tst.l d0
beq dosfail
move.l d0,dosbase(a5)
clr.w CLIflag(a5) delete CLI&WBflag
sub.l a1,a1
jsr _LVOFindTask(a6)
move.l d0,thistask(a5) save this task address
move.l d0,a2
move.l pr_CLI(a2),d0
bne.s .A
subq.w #1,CLIflag(a5) WB-Start
lea pr_MsgPort(a2),a0
jsr _LVOWaitPort(a6) !!!
lea pr_MsgPort(a2),a0
jsr _LVOGetMsg(a6)
move.l d0,wb_msg(a5)
beq.s .C
move.l d0,a0
clr.l sm_Segment(a0) Clear Seg-Descriptor
.C move.l pr_StackSize(a2),stacksize(a5)
move.l pr_SegList(a2),d0
beq.s .B
lsl.l #2,d0
move.l d0,a0
clr.l 12(a0) Clear SegPointer
bra.s .B
.A lsl.l #2,d0 CLI-Start
move.l d0,a2
move.l cli_DefaultStack(a2),d0
lsl.l #2,d0
move.l d0,stacksize(a5) save stacksize
clr.l cli_Module(a2) do not free seglist
cmp.b #"r",1(a3)
bne.s .B
addq.b #1,noresi_flag(a5)
.B move.l dosbase(a5),a6 A6=DOSBASE
tst.b noresi_flag(a5)
bne.s crerror
lookres lea ZShellName(pc),a4
bsr search_res2
lea start-4(pc),a1
tst.l d0
beq.s cresi
lsl.l #2,d0
move.l d0,a2
nop
nop
VCheck cmp.w #VERSION,VCheck-start+6(a2)
bne.w crerror
addq.l #1,resi_usecount(a0)
cmp.l a1,d0
beq.s crerror running as resident
jmp JumpIn-start+4(a2) Jump to JumpIn, but in the resident Code
JumpIn;*move.l a1,d1 here it arrives
; lsr.l #2,d1
; jsr _LVOUnLoadSeg(a6) free old mem
; bra.s doIT
cresi lea ZShellCom(pc),a0
move.l a0,d1
jsr _LVOLoadSeg(a6)
lea ZShellName(pc),a4
move.l d0,d3
beq.s crerror
bsr create_resi make zshell resident
bne.s crerror
bra.s lookres
crerror lea console(pc),a0 output a message
move.l a0,d1
move.l #1005,d2
jsr _LVOOpen(a6) on a simple CON: window
move.l d0,d4
beq.s crfail
move.l d0,d1
lea errtx(pc),a0
move.l a0,d2
move.l #errtxend-errtx,d3
jsr _LVOWrite(a6)
moveq #120,d1
jsr _LVODelay(a6) wait a bit
move.l d4,d1
jsr _LVOClose(a6)
crfail move.l dosbase(a5),a1 bad error occured
move.l 4.w,a6
jsr _LVOCloseLibrary(a6)
dosfail move.l intuibase(a5),a1
jsr _LVOCloseLibrary(a6)
intfail move.l wb_msg(a5),d2
move.l a5,a1
move.l #sizeofblk,d0
jsr _LVOFreeMem(a6)
tst.l d2
beq.s .A
jsr _LVOForbid(a6) (what for ?)
move.l d2,a1 WB-Message
jmp _LVOReplyMsg(a6) never returns !
.A moveq #0,d0
rts
blkfail moveq #RETURN_ERROR,d0
rts
search_res2
bsr resi_hand
beq.s .D
move.l a0,d2
.A lsl.l #2,d0
move.l a4,a1 string
move.l d0,a2
lea resi_name(a2),a0 BSTR
moveq #0,d3
move.b (a0)+,d3
subq.w #1,d3
.B move.b (a0)+,d0
move.b (a1)+,d1
bsr compD1D0nocase
dbne d3,.B
bne.s .E not equal
tst.b (a1)
beq.s .C the (null-)END
.E move.l a2,d2
move.l resi_link(a2),d0 get link
bne.s .A
.D moveq #0,d0
rts
.C move.l resi_seglist(a2),d0 get seglist
move.l a2,a0
rts
resi_hand move.l dl_Root(a6),a0
move.l rn_Info(a0),a0
add.l a0,a0
add.l a0,a0
lea di_NetHand(a0),a0 NetHand in A0
move.l (a0),d0 Start of Resi-List in D0
rts
compD1D0nocase
cmp.b #'a',d1
blo.s D1_OK
cmp.b #'z',d1
bhi.s D1_OK
sub.b #$20,d1
D1_OK cmp.b #'a',d0
blo.s D0_OK
cmp.b #'z',d0
bhi.s D0_OK
sub.b #$20,d0
D0_OK cmp.b d1,d0
rts
create_resi ;D3:SegList, A4:Name
moveq #resi_length,d0
move.l a4,a0
.A addq.l #1,d0 one more for lenght-byte
tst.b (a0)+
bne.s .A
addq.l #4,d0 4 more for segment-length
addq.l #8,d0 (8 more for and'ing needed by UnLoadSeg)
moveq #-4,d1
and.l d1,d0
move.l d0,d2
moveq #1,d1
bsr iwantmem
beq.s resi_no_mem
addq.l #4,d0
move.l d0,a2 D0=addr of resi_list_node
move.l d2,-4(a2) save segment-length
bsr do_forbid
bsr resi_hand
move.l d0,resi_link(a2)
move.l a2,d0
lsr.l #2,d0
move.l d0,(a0)
moveq #1,d0
move.l d0,resi_usecount(a2)
move.l d3,resi_seglist(a2)
lea resi_name(a2),a1
move.l a4,a0
moveq #-1,d0
bsr cpBSTR
bsr do_permit
moveq #0,d0
rts
resi_no_mem
moveq #-1,d0
rts
****** Copy String from A0 to BSTR A1
cpBSTR movem.l d1-d2/a0-a2,-(sp) max. Length-2 in D0
lea 1(a1),a2
moveq #0,d2
bra.s .B
.A move.b d1,(a2)+
addq.l #1,d2
.B move.b (a0)+,d1
dbeq d0,.A
clr.b (a2) ;NULL-end it
move.b d2,(a1)
move.l a1,d0
lsr.l #2,d0
movem.l (sp)+,d1-d2/a0-a2 D0 is BPTR to the BSTR
rts
*ALLOCATE MEMORY D0=size D1=type
iwantmem movem.l d1/a0-a1,-(sp)
move.l 4.w,a6
jsr _LVOAllocMem(a6)
move.l dosbase(a5),a6
movem.l (sp)+,d1/a0-a1
tst.l d0
rts
do_forbid move.l 4.w,a6
jsr _LVOForbid(a6)
move.l dosbase(a5),a6
rts
do_permit move.l 4.w,a6
jsr _LVOPermit(a6)
move.l dosbase(a5),a6
rts
ZShellCom dc.b 'C:'
ZShellName dc.b 'ZShell',0
console dc.b 'CON:100/20/450/80/$VER: ZSH 2.2 (02.01.95)',0
errtx dc.b 'Please copy "ZShell" to C: !'
errtxend
dosname dc.b 'dos.library',0
intuiname dc.b 'intuition.library',0
end
****************************************************************