************************************************************************ * * The GNO Shell Project * * Developed by: * Jawaid Bazyar * Tim Meekins * ************************************************************************** * * BUILTIN.ASM * By Tim Meekins * * Builtin command searching and execution. * ************************************************************************** keep o/builtin mcopy m/builtin.mac p_next gequ 0 ;next in global proclist p_friends gequ p_next+4 ;next in job list p_flags gequ p_friends+4 ;various job status flags p_reason gequ p_flags+2 ;reason for entering this state p_index gequ p_reason+2 ;job index p_pid gequ p_index+2 ;process id p_jobid gequ p_pid+2 ;process id of job leader p_command gequ p_jobid+2 ;command (how job invoked) p_space gequ p_command+4 ;space for structure ************************************************************************** * * Find a builtin command * ************************************************************************** builtin START using BuiltinData val equ 1 file equ val+2 tbl equ file+4 space equ tbl+4 argv equ space+3 argc equ argv+4 end equ argc+2 ; subroutine (2:argc,4:argv),space tsc sec sbc #space-1 tcs phd tcd ldy #2 lda [argv] sta file lda [argv],y sta file+2 ld4 builtintbl,tbl ld2 -1,val lda argc jeq done loop ldy #2 lda [tbl] ora [tbl],y beq done lda [tbl],y pha lda [tbl] pha pei (file+2) pei (file) jsr cmpcstr beq foundit bpl done add2 tbl,#10,tbl bra loop foundit ldy #4 lda [tbl],y sta ourproc+1 iny lda [tbl],y sta ourproc+2 pei (argv+2) pei (argv) pei (argc) ourproc jsl >$FFFFFF ;might want to mutex this!!!!!! sta val pei (argc) pei (argv+2) pei (argv) jsl argfree done ldy val lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs tya rtl END ************************************************************************** * * Is it a built-in? * ************************************************************************** IsBuiltin START using BuiltinData tbl equ 0 space equ tbl+4 subroutine (4:name),space ld4 builtintbl,tbl builtinloop ldy #2 lda [tbl] ora [tbl],y beq nofile lda [tbl],y pha lda [tbl] pha pei (name+2) pei (name) jsr cmpcstr beq foundit bpl nofile add2 tbl,#10,tbl bra builtinloop foundit ldy #8 lda [tbl],y bra foundbuiltin nofile lda #-1 foundbuiltin sta tbl return 2:tbl END ************************************************************************** * * Builtin data * ************************************************************************** BuiltinData DATA ; ; First address is a pointer to the name, the second is a pointer to the ; command. MUST BE SORTED. ; builtintbl dc a4'aliasname,alias',i2'0' dc a4'bgname,bg',i2'1' dc a4'bindkeyname,bindkey',i2'0' dc a4'cdname,cd',i2'1' dc a4'chdirname,chdir',i2'1' dc a4'clearname,clear',i2'0' dc a4'cmdname,cmdbi',i2'0' dc a4'dfname,df',i2'0' dc a4'dirsname,dirs',i2'0' dc a4'echoname,echo',i2'0' dc a4'editname,edit',i2'1' dc a4'exitname,exit',i2'1' dc a4'exportname,export',i2'1' dc a4'fgname,fg',i2'1' dc a4'hashname,hashbi',i2'0' dc a4'hname,PrintHistory',i2'0' dc a4'jobsname,jobs',i2'1' dc a4'killname,kill',i2'1' dc a4'popdname,popd',i2'1' dc a4'pfxname,prefix',i2'1' dc a4'psname,psbi',i2'0' dc a4'pushdname,pushd',i2'1' dc a4'pwdname,pwd',i2'1' dc a4'rehashname,rehash',i2'1' dc a4'setname,set',i2'0' dc a4'setbugname,setdebug',i2'0' dc a4'setenvname,setenv',i2'0' dc a4'sourcename,source',i2'0' dc a4'stopname,stop',i2'1' dc a4'tsetname,tset',i2'1' dc a4'unaliasname,unalias',i2'1' dc a4'unhashname,unhash',i2'1' dc a4'unsetname,unset',i2'1' dc a4'whichname,which',i2'0' dc i4'0,0' aliasname dc c'alias',h'00' bgname dc c'bg',h'00' bindkeyname dc c'bindkey',h'00' chdirname dc c'chdir',h'00' cdname dc c'cd',h'00' clearname dc c'clear',h'00' cmdname dc c'commands',h'00' dirsname dc c'dirs',h'00' dfname dc c'df',h'00' echoname dc c'echo',h'00' editname dc c'edit',h'00' exitname dc c'exit',h'00' exportname dc c'export',h'00' fgname dc c'fg',h'00' hashname dc c'hash',h'00' hname dc c'history',h'00' jobsname dc c'jobs',h'00' killname dc c'kill',h'00' pfxname dc c'prefix',h'00' popdname dc c'popd',h'00' psname dc c'ps',h'00' pushdname dc c'pushd',h'00' pwdname dc c'pwd',h'00' rehashname dc c'rehash',h'00' setbugname dc c'setdebug',h'00' setname dc c'set',h'00' setenvname dc c'setenv',h'00' sourcename dc c'source',h'00' stopname dc c'stop',h'00' tsetname dc c'tset',h'00' unaliasname dc c'unalias',h'00' unhashname dc c'unhash',h'00' unsetname dc c'unset',h'00' whichname dc c'which',h'00' END ************************************************************************** * * CD: builtin command * syntax: cd [pathname] * * Changes the current prefix to pathname. If no pathname then set to $HOME * ************************************************************************** cd START chdir ENTRY dir equ 1 space equ dir+4 argc equ space+3 argv equ argc+2 end equ argv+4 ; subroutine (4:argv,2:argc),space tsc sec sbc #space-1 tcs phd tcd lock cdmutex lda argc dec a beq cdhome dec a jeq normalcd showusage lda [argv] tax ldy #2 lda [argv],y stx argv sta argv+2 lda [argv],y and #$FF beq cdusage ldx #^Usage2 lda #Usage2 jsr errputs jmp exit cdusage ldx #^Usage lda #Usage jsr errputs jmp exit ; ; set prefix to home ; cdhome jsl alloc256 sta dir stx dir+2 sta ReadName stx ReadName+2 ora ReadName+2 bne madeit lda #$201 jmp ohshit madeit Read_Variable ReadVar lda [dir] and #$FF beq nohome ph4 ReadName jsr p2cstr sta dir stx dir+2 ph4 @xa lda ReadName ldx ReadName+2 jsl free256 pl4 ReadName bra setprefix nohome ldx dir+2 lda dir jsl free256 jmp exit ; ; set prefix to specified path ; normalcd stz ReadName stz ReadName+2 ldy #4 lda [argv],y sta dir iny2 lda [argv],y sta dir+2 lda [dir] and #$FF if2 @a,ne,#'-',setprefix jmp showusage setprefix pei (dir+2) pei (dir) jsr c2gsstr sta PRecPath sta GRecPath stx PRecPath+2 stx GRecPath+2 GetFileInfo GRec bcc ok ohshit sta Err Error Err bra done ok if2 GRecFT,eq,#$F,ok2 ldx dir+2 lda dir jsr errputs ldx #^direrr lda #direrr jsr errputs bra done ok2 SetPrefix PRec bcs ohshit done ph4 PRecPath jsl nullfree ora2 ReadName,ReadName+2,@a beq whoaboy ph4 ReadName jsl nullfree whoaboy anop exit unlock cdmutex lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl cdmutex key PRec dc i'2' PRecNum dc i'0' PRecPath ds 4 GRec dc i'3' GRecPath ds 4 GRecAcc ds 2 GRecFT ds 2 ReadVar dc a4'home' ReadName ds 4 home str 'home' Err ds 2 Usage dc c'Usage: cd [pathname]',h'0d00' Usage2 dc c'Usage: chdir [pathname]',h'0d00' dirErr dc c': Not a directory',h'0d00' END ************************************************************************** * * CLEAR: builtin command * syntax: clear * * clears the screen * ************************************************************************** clear START space equ 1 argc equ space+3 argv equ argc+2 end equ argv+4 ; subroutine (4:argv,2:argc),space tsc phd tcd lda argc dec a beq clearit ldx #^Usage lda #Usage jsr errputs bra exit clearit jsr clearscrn jsr flush exit lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl Usage dc c'Usage: clear',h'0d00' END ************************************************************************** * * ECHO: builtin command * syntax: echo [-n] [text][...] * * Echo displays to stdout what is on the command (except -n). * * If '-n' specified then don't print newline. * ************************************************************************** echo START val equ 1 nl equ val+2 ptr equ nl+2 space equ ptr+4 argc equ space+3 argv equ argc+2 end equ argv+4 ; subroutine (4:argv,2:argc),space tsc sec sbc #space-1 tcs phd tcd stz nl if2 argc,lt,#2,loop ldy #4 lda [argv],y sta ptr iny2 lda [argv],y sta ptr+2 ldy #1 lda [ptr] and #$FF if2 @a,ne,#'-',loop lda [ptr],y and #$FF if2 @a,ne,#'n',showusage iny lda [ptr],y and #$FF bne showusage inc nl add2 argv,#4,argv dec argc bra loop showusage ldx #^Usage lda #Usage jsr errputs jmp exit loop add2 argv,#4,argv dec argc jeq done ldy #2 lda [argv],y sta ptr+2 lda [argv] sta ptr putloop lda [ptr] and #$FF cmp #0 jeq doneput cmp #'\' jne putit inc ptr lda [ptr] and #$FF jeq doneput if2 @a,ne,#'b',esc02 ldx #1 jsr moveleft bra didit esc02 if2 @a,ne,#'f',esc03 jsr clearscrn bra didit esc03 if2 @a,ne,#'n',esc04 lda #13 bra putit esc04 if2 @a,ne,#'r',esc05 lda #13 bra putit esc05 if2 @a,ne,#'t',esc06 lda #9 bra putit esc06 if2 @a,ne,#'0',putit stz val ldy #1 escloop lda [ptr],y and #$FF beq putval if2 @a,cc,#'0',putval if2 @a,cs,#'9'+1,putval sub2 @a,#'0',@a pha lda val asl2 a adc val asl a adc 1,s sta val pla inc ptr bra escloop putval lda val putit jsr putchar didit inc ptr jmp putloop doneput lda #' ' jsr putchar jmp loop done lda nl bne exit jsr newline exit jsr flush lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl Usage dc c'Usage: echo [-n] [strings...]',h'0d00' END ************************************************************************** * * PWD: builtin command * syntax: pwd * * print the working directory. * ************************************************************************** pwd START ptr equ 1 space equ ptr+4 argc equ space+3 argv equ argc+2 end equ argv+4 ; subroutine (4:argv,2:argc),space tsc sec sbc #space-1 tcs phd tcd lda argc dec a beq wait ldx #^Usage lda #Usage jsr errputs bra exit wait lock pwdmutex jsl alloc256 sta gpptr stx gpptr+2 sta ptr stx ptr+2 lda #256 sta [ptr] GetPrefix gpparm bcc ok awshit sta err Error err bra done ok ldy #2 lda [ptr],y xba sta [ptr],y ldx ptr+2 lda ptr clc adc #3 jsr putp jsr newline done ldx ptr+2 lda ptr jsl free256 unlock pwdmutex exit lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl pwdmutex key gpparm dc i'2' dc i'0' gpptr ds 4 err ds 2 Usage dc c'Usage: pwd',h'0d00' END ************************************************************************** * * WHICH: builtin command * syntax: which [command ...] * * displays the location of command * ************************************************************************** which START using hashdata ptr equ 1 file equ ptr+4 space equ file+4 argc equ space+3 argv equ argc+2 end equ argv+4 ; subroutine (4:argv,2:argc),space tsc sec sbc #space-1 tcs phd tcd ; ; display usage if no arguments given ; if2 argc,ge,#2,loop ldx #^whicherr lda #whicherr jsr errputs jmp exit ; ; loop through each argument ; loop add2 argv,#4,argv dec argc jeq exit lda [argv] sta file ldy #2 lda [argv],y sta file+2 ; ; see if it's an alias ; pei (file+2) pei (file) jsl findalias sta ptr stx ptr+2 ora ptr+2 beq chkbuiltin ldx #^aliasstr lda #aliasstr jsr puts ldx ptr+2 lda ptr jsr puts jmp nextarg ; ; was it a built-in? ; chkbuiltin pei (file+2) pei (file) jsl IsBuiltin cmp #-1 beq tryhash foundbuiltin ldx #^builtstr lda #builtstr jsr puts jmp nextarg ; ; See if it was hashed ; tryhash pei (file+2) pei (file) ph4 hash_table ph4 #hash_paths jsl search cmp #0 bne foundhash cpx #0 beq thispfx ; ; It was hashed, so say so. ; foundhash jsr puts jmp nextarg ; ; It must be in the current prefix, so check it out. ; thispfx lock pwdmutex ; ; check for existence of file ; pei (file+2) pei (file) jsr c2gsstr sta GRecPath stx GRecPath+2 sta ptr stx ptr+2 GetFileInfo GRec bcs nofile ; ; we found the file, so display the cwd ; showcwd pei (ptr+2) pei (ptr) jsl nullfree jsl alloc256 sta ptr stx ptr+2 sta gpptr stx gpptr+2 lda #256 sta [ptr] GetPrefix gpparm ldy #2 lda [ptr],y xba sta [ptr],y ldx ptr+2 add2 ptr,#3,@a jsr putp ldx file+2 lda file jsr puts ldx ptr+2 lda ptr jsl free256 stz ptr stz ptr+2 bra donecwd ; ; No such command ; nofile ldx #^cantdoit lda #cantdoit jsr puts donecwd unlock pwdmutex pei (ptr+2) pei (ptr) jsl nullfree ; ; Go try the next file. ; nextarg jsr newline jmp loop exit lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl whicherr dc c'Usage: which [file ...]',h'0d00' builtstr dc c'Shell Built-in Command',h'00' cantdoit dc c'Command Not Found',h'00' aliasstr dc c'Aliased as ',h'00' pwdmutex key gpparm dc i'2' dc i'0' gpptr ds 4 GRec dc i'4' GRecPath ds 4 ds 2 GRecFileType ds 2 GRecAuxType ds 4 END ************************************************************************** * * PREFIX: builtin command * syntax: prefix [num [prefix]] * * sets prefix number num to prefix * ************************************************************************** prefix START dir equ 1 numstr equ dir+4 space equ numstr+4 argc equ space+3 argv equ argc+2 end equ argv+4 ; subroutine (4:argv,2:argc),space tsc sec sbc #space-1 tcs phd tcd lock mutex lda argc dec a beq showall dec a jeq showone dec a jeq setprefix ldx #^usage lda #usage jsr errputs jmp done showall jsl alloc256 sta PRecPath stx PRecPath+2 sta dir stx dir+2 lda #254 sta [dir] ld2 1,PRecNum GetBootVol PRecNum jcs awshit ldx #^bootstr lda #bootstr jsr puts ldy #2 lda [dir],y xba sta [dir],y ldx dir+2 lda dir inc2 a inc a jsr putp jsr newline stz PRecNum allloop GetPrefix PRec jcs awshit ldy #2 lda [dir],y beq nextall xba sta [dir],y Int2Dec (PRecNum,#pfxstr,#2,#0) ldx #^pfxstr lda #pfxstr jsr puts ldx dir+2 lda dir inc2 a inc a jsr putp jsr newline nextall inc PRecNum if2 PRecNum,cc,#32,allloop jmp finish showone ldy #6 lda [argv],y sta numstr+2 pha dey2 lda [argv],y sta numstr pha jsr cstrlen tax Dec2Int (numstr,@x,#0),PRecNum jsl alloc256 sta PRecPath stx PRecPath+2 sta dir stx dir+2 lda #254 sta [dir] GetPrefix PRec bcs awshit ldy #2 lda [dir],y xba sta [dir],y ldx dir+2 lda dir inc2 a inc a jsr putp jsr newline lda PRecPath ldx PRecPath+2 jsl free256 bra done setprefix ldy #6 lda [argv],y sta numstr+2 pha dey2 lda [argv],y sta numstr pha jsr cstrlen tax Dec2Int (numstr,@x,#0),PRecNum ldy #2*4+2 lda [argv],y pha dey2 lda [argv],y pha jsr c2gsstr sta PRecPath sta GRecPath stx PRecPath+2 stx GRecPath+2 GetFileInfo GRec bcc okay awshit ldx #^errorstr lda #errorstr jsr errputs bra finish okay SetPrefix PRec bcs awshit finish ph4 PRecPath jsl nullfree done unlock mutex lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl mutex key errorstr dc c'prefix: could not set prefix, pathname may not exist.' dc h'0d00' usage dc c'Usage: prefix prefixnum prefixname',h'0d00' bootstr dc c' *: ',h'00' pfxstr dc c'00: ',h'00' PRec dc i'2' PRecNum dc i'0' PRecPath ds 4 GRec dc i'2' GRecPath ds 4 GRecAcc ds 2 END ************************************************************************** * * REHASH: builtin command * syntax: rehash * * rehashes the path * ************************************************************************** * * UNHASH: builtin command * syntax: unhash * * turns off command hashing * ************************************************************************** rehash START unhash ENTRY space equ 1 argc equ space+3 argv equ argc+2 end equ argv+4 tsc phd tcd lda argc dec a beq doit ldx #^Usage lda #Usage jsr errputs ldy #2 lda [argv],y tax lda [argv] jsr errputs lda #13 jsr errputchar bra exit doit jsr dispose_hash ;remove old table lda [argv] tax ldy #2 lda [argv],y sta argv+2 stx argv lda [argv] and #$FF jsr tolower if2 @a,eq,#'u',exit ;if 'rehash' do the hashing. jsl hashpath ;hash the path exit lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl Usage dc c'Usage: ',h'00' END ************************************************************************** * * DF: builtin command * syntax: df * * displays volumes and free space * ************************************************************************** df START using FSTData space equ 1 argc equ space+3 argv equ argc+2 end equ argv+4 tsc phd tcd lock mutex lda argc dec a beq showall ldx #^Usage lda #Usage jsr errputs bra exit showall ldx #^hdr lda #hdr jsr puts ld2 1,DIDevNum allloop DInfo DIParm bcs exit jsr showdev inc DIDevNum bra allloop exit unlock mutex lda space sta end-3 lda space+1 sta end-2 pld tsc clc adc #end-4 tcs lda #0 rtl showdev lda #'.' jsr putchar lda #'d' jsr putchar lda DIdevnum cmp #10 bcs dev10 clc adc #'0' jsr putchar lda #' ' jsr putchar bra endnum dev10 UDivide (DIdevnum,#10),(@a,@x) phx clc adc #'0' jsr putchar pla clc adc #'0' jsr putchar endnum lda #' ' jsr putchar Volume VolParm jcc okdev lda DIid cmp #$20 bcc okdid lda #0 okdid asl2 a tay ldx idtbl+2,y lda idtbl,y jsr puts short a ldy devname lda #' ' dev5 cpy #17 bcs dev6 sta devname+2,y iny bra dev5 dev6 lda #16 sta devname+1 long a ldx #^devname+1 lda #devname+1 jsr putp lda #' ' jsr putchar jmp newline okdev ldy volname short a lda #' ' dev1 cpy #17 bcs dev2 sta volname+2,y iny bra dev1 dev2 lda #16 sta volname+1 ldy devname lda #' ' dev3 cpy #17 bcs dev4 sta devname+2,y iny bra dev3 dev4 lda #16 sta devname+1 long a ldx #^volname+1 lda #volname+1 jsr putp lda #' ' jsr putchar ldx #^devname+1 lda #devname+1 jsr putp lda #' ' jsr putchar Long2Dec (VolFree,#numbuf,#7,#0) ldx #^numbuf lda #numbuf jsr puts Long2Dec (VolTot,#numbuf,#7,#0) ldx #^numbuf lda #numbuf jsr puts ; ; [(total - free) * 100] / total ; lda VolFree ora VolFree+2 beq put100 clc ;why clc, need to investigate :) lda VolTot sbc VolFree tax lda VolTot+2 sbc VolFree+2 LongMul (@ax,#100),(@ax,@y) LongDivide (@xa,VolTot),(@ax,@y) Long2Dec (@xa,#capbuf+3,#3,#0) ldx #^capbuf lda #capbuf jsr puts bra putsys put100 ldx #^cap100buf lda #cap100buf jsr puts putsys lda VolSysID cmp #$E bcc oksys lda #0 oksys asl2 a tay ldx FSTtable+2,y lda FSTtable,y jsr puts jmp newline hdr dc c'.d## Volume Device Free Total Capacity System',h'0d' dc c'---- ---------------- ---------------- ------- ------- -------- -----------',h'0d00' Usage dc c'Usage: df',h'0d00' numbuf dc c' ',h'00' capbuf dc c' % ',h'00' cap100buf dc c' 100% ',h'00' mutex key DIParm dc i2'8' DIDevNum ds 2 dc a4'devbuf' dc i2'0' dc i4'0' dc i2'0' dc i2'0' dc i2'0' DIid dc i2'0' VolParm dc i2'5' dc a4'devname' dc a4'volbuf' VolTot ds 4 VolFree ds 4 VolSysID ds 2 devbuf dc i'35' devname ds 33 volbuf dc i'260' volname ds 258 idtbl dc a4'id00,id01,id02,id03,id04,id05,id06,id07,id08' dc a4'id09,id0a,id0b,id0c,id0d,id0e,id0f,id10,idff' dc a4'id12,id13,id14,id15,id16,id17,id18,id19,id1a' dc a4'id1b,id1c,id1d,id1e,id1f' dc a4'idff' idff dc c' ',h'00' id00 dc c'Apple 5.25 Drive ',h'00' id01 dc c'Profile 5MB ',h'00' id02 dc c'Profile 10MB ',h'00' id03 dc c'Apple 3.5 Drive ',h'00' id04 dc c'SCSI ',h'00' id05 dc c'SCSI Hard Drive ',h'00' id06 dc c'SCSI Tape Drive ',h'00' id07 dc c'SCSI CD-ROM ',h'00' id08 dc c'SCSI Printer ',h'00' id09 dc c'Serial Modem ',h'00' id0a dc c'Console Driver ',h'00' id0b dc c'Serial Printer ',h'00' id0c dc c'Serial LaserWrit ',h'00' id0d dc c'AppleTalk LaserW ',h'00' id0e dc c'RAM Disk ',h'00' id0f dc c'ROM Disk ',h'00' id10 dc c'File Server ',h'00' id12 dc c'Apple Desktop Bu ',h'00' id13 dc c'Hard Drive ',h'00' id14 dc c'Floppy Drive ',h'00' id15 dc c'Tape Drive ',h'00' id16 dc c'Character dev dr ',h'00' id17 dc c'MFM-encoded ',h'00' id18 dc c'AppleTalk net ',h'00' id19 dc c'Sequential dev ',h'00' id1a dc c'SCSI Scanner ',h'00' id1b dc c'Scanner ',h'00' id1c dc c'LaserWriter SC ',h'00' id1d dc c'AppleTalk Main ',h'00' id1e dc c'AppleTalk fsd ',h'00' id1f dc c'AppleTalk RPM ',h'00' END ************************************************************************** * * FST descriptions * ************************************************************************** FSTData DATA FSTtable dc a4'fst0,fst1,fst2,fst3,fst4,fst5,fst6,fst7,fst8' dc a4'fst0,fsta,fstb,fstc,fstd' fst0 dc c'[Unknown]',h'00' fst1 dc c'ProDOS',h'00' fst2 dc c'DOS 3.3',h'00' fst3 dc c'DOS 3.2',h'00' fst4 dc c'Pascal',h'00' fst5 dc c'MFS',h'00' fst6 dc c'HFS',h'00' fst7 dc c'Lisa (get real)',h'00' fst8 dc c'CP/M',h'00' fsta dc c'MS-DOS',h'00' fstb dc c'High Sierra',h'00' fstc dc c'ISO 9660',h'00' fstd dc c'AppleShare',h'00' END ************************************************************************** * * EXIT: builtin command * syntax: exit * * exit gsh * ************************************************************************** exit START using global space equ 0 subroutine (4:argv,2:argc),space inc exitamundo return END ************************************************************************** * * SETDEBUG: builtin command * syntax: setdebug (val | [+|-]flag) * * sets debugging in kernel * ************************************************************************** setdebug START arg equ 0 newdebug equ arg+4 mode equ newdebug+2 space equ mode+2 subroutine (4:argv,2:argc),space lda argc dec a bne ok showusage ldx #^usage lda #usage jsr errputs jmp return ok stz mode mv2 globaldebug,newdebug dec argc add2 argv,#4,argv loop lda [argv] sta arg ldy #2 lda [argv],y sta arg+2 lda [arg] and #$FF if2 @a,eq,#'-',turnoff if2 @a,eq,#'+',turnon ldx mode bne showusage ldx argc dex bne showusage if2 @a,cc,#'0',showusage if2 @a,cs,#'9'+1,showusage pei (arg+2) pei (arg) jsr cstrlen tax Dec2Int (arg,@x,#0),@a sta newdebug jmp done turnoff jsr findflag eor #$FFFF and newdebug bra turnnext turnon jsr findflag ora newdebug turnnext sta newdebug ld2 1,mode add2 argv,#4,argv dec argc beq done jmp loop done setdebug newdebug mv2 newdebug,globaldebug return return findflag inc arg ldy #0 findloop phy lda nametbl,y ora nametbl+2,y beq nofind lda nametbl+2,y pha lda nametbl,y pha pei (arg+2) pei (arg) jsr cmpcstr beq foundit pla add2 @a,#4,@y bra findloop foundit pla lsr a tax lda bittbl,x rts nofind pla ldx arg+2 lda arg jsr errputs ldx #^errstr lda #errstr jsr errputs lda #-1 pla ;rts address jmp showusage usage dc c'Usage: setdebug (value | [+|-]flag ... )',h'0d0d' dc c'Flags: gsostrace - Trace GS/OS calls',h'0d' dc c' gsosblocks - Trace GS/OS parameter blocks',h'0d' dc c' gsoserrors - Trace GS/OS errors',h'0d' dc c' pathtrace - Trace GS/OS pathnames',h'0d' dc c' sigtrace - Trace signals',h'0d' dc c' systrace - Trace system calls',h'0d' dc h'00' errstr dc c': Unknown flag',h'0d0d00' nametbl dc a4'str01,str02,str03,str04,str05,str06,0' str01 dc c'gsostrace',h'00' str02 dc c'pathtrace',h'00' str03 dc c'gsoserrors',h'00' str04 dc c'sigtrace',h'00' str05 dc c'systrace',h'00' str06 dc c'gsosblocks',h'00' bittbl dc i2'%000001' dc i2'%000010' dc i2'%000100' dc i2'%001000' dc i2'%010000' dc i2'%100000' globaldebug dc i2'0' END ************************************************************************** * * PS: builtin command * syntax: ps * * display process status * ************************************************************************** psbi START using pdata myuid equ 0 t equ myuid+2 ps2 equ t+4 pr2 equ ps2+4 pr equ pr2+4 ps equ pr+4 space equ ps+4 subroutine (4:argv,2:argc),space lda argc dec a beq ok showusage ldx #^usage lda #usage jsr errputs jmp return ok getuid sta myuid kvm_open sta ps stx ps+2 ora2 @a,ps+2,@a bne ok2 ldx #^kvmerrstr lda #kvmerrstr jsr errputs jmp done ok2 ldx #^header lda #header jsr puts loop kvmnextproc ps sta pr stx pr+2 ora2 @a,pr+2,@a jeq done ldy #94 ;ps->p_uid lda [pr],y cmp myuid jne skip ldy #2 lda [ps],y ;ps->pid Int2Dec (@a,#pidstr,#4,#0) ldx #^pidstr lda #pidstr jsr puts ldy #2 lda [pr],y ;pr->processState cmp #9 bcc okstate lda #9 okstate asl a asl a asl a tax ldy #8 putstate lda statetbl,x phx phy jsr putchar ply plx inx dey bne putstate ldy #6 lda [pr],y ;pr->ttyID beq ttnul cmp #3 bne ttnum lda #'c' jsr putchar lda #'o' bra showuser ttnul lda #'n' jsr putchar lda #'u' bra showuser ttnum ldy #0 ttnumlup cmp #10 bcc ttnum0 sec sbc #10 iny bra ttnumlup ttnum0 pha tya clc adc #'0' jsr putchar pla clc adc #'0' showuser jsr putchar ldy #4 lda [pr],y ;pr->userID Int2Hex (@a,#userstr+1,#4) ldx #^userstr lda #userstr jsr puts ldy #94 lda [pr],y ;pr->puid Int2Hex (@a,#puidstr,#4) ldx #^puidstr lda #puidstr jsr puts ldy #50 lda [pr],y ;pr->ticks tax iny2 lda [pr],y LongDivide (@ax,#60),(@ax,@yy) LongDivide (@xa,#60),(t,@ax) Long2Dec (@xa,#timestr+4,#2,#0) Long2Dec (t,#timestr,#3,#0) lda timestr+4 and #$FF cmp #' ' bne time0 short a lda #'0' sta timestr+4 long a time0 ldx #^timestr lda #timestr jsr puts ldy #34 lda [pr],y ;pr->args tax iny2 lda [pr],y jne goodcmd cpx #0 jne goodcmd lda pjoblist ;check for name in job list ldx pjoblist+2 jobloop sta pr2 stx pr2+2 ora pr2+2 beq childof ldy #p_pid lda [pr2],y ldy #2 cmp [ps],y ;ps->pid bne loop2 ldy #p_command+2 lda [pr2],y tax ldy #p_command lda [pr2],y jsr puts bra next loop2 ldy #p_next+2 lda [pr2],y tax ldy #p_next lda [pr2],y bra jobloop childof ldx #^forkstr lda #forkstr jsr puts kvm_open sta ps2 stx ps2+2 lda [pr] tay kvmgetproc (ps2,@y) sta pr2 stx pr2+2 kvm_close ps2 ldy #34 lda [pr2],y ;pr2->args tax iny2 lda [pr2],y bne goodcmd cpx #0 bne goodcmd ldx #^forkstr2 lda #forkstr2 jsr puts bra next goodcmd tay txa tyx clc adc #8 jsr puts next jsr newline skip jmp loop done kvm_close ps return return usage dc c'Usage: ps',h'0d00' kvmerrstr dc c'ps: error in kvm_open()',h'0d00' header dc c' ID STATE TT MMID UID TIME COMMAND',h'0d00' pidstr dc c'0000 ',h'00' userstr dc c' 0000 ',h'00' puidstr dc c'0000 ',h'00' timestr dc c'000:00 ',h'00' forkstr dc c'forked child of ',h'00' forkstr2 dc c'an unknown process',h'00' test1 dc c'getuid = $' test1a dc c'0000',h'0d00' statetbl dc c'defunct ' dc c'running ' dc c'ready ' dc c'blocked ' dc c'ready ' dc c'suspend ' dc c'waiting ' dc c'waiting ' dc c'paused ' dc c'unknown ' END ************************************************************************** * * HASH: builtin command * syntax: hash * * display hashed commands * ************************************************************************** hashbi START using hashdata sv equ 0 q equ sv+4 p equ q+4 space equ p+4 subroutine (4:argv,2:argc),space ph2 t_size jsl sv_alloc sta sv stx sv+2 lda hash_table ora hash_table+2 beq exit mv4 hash_table,p lda hash_numexe beq doneadd ldy #0 ldx t_size beq doneadd ; ; loop through every hashed file and add it the string vector ; addloop lda [p],y sta q iny iny lda [p],y sta q+2 iny iny ora q beq skip phy phx pei (sv+2) pei (sv) pei (q+2) lda q inc a inc a pha pea 1 jsl sv_add plx ply skip dex bne addloop doneadd anop doneprint pei (sv+2) pei (sv) jsl sv_sort pei (sv+2) pei (sv) jsl sv_colprint pei (sv+2) pei (sv) jsl sv_dispose exit return END ************************************************************************** * * SOURCE: builtin command * syntax: source file [arguments...] * * executes a shell file w/o pushing environment * ************************************************************************** source START retval equ 0 space equ retval+2 subroutine (4:argv,2:argc),space stz retval dec argc bne ok ldx #^usage lda #usage jsr errputs lda #1 sta retval bra exit ok add2 argv,#4,argv ldy #2 lda [argv],y pha lda [argv] pha pei (argc) pei (argv+2) pei (argv) pea 0 jsl ShellExec sta retval exit return 2:retval usage dc c'usage: source file [arguments...]',h'0d00' END ************************************************************************** * * COMMANDS: builtin command * syntax: hash * * display builtin commands * ************************************************************************** cmdbi START using BuiltinData sv equ 0 space equ sv+4 subroutine (4:argv,2:argc),space ph2 #50 jsl sv_alloc sta sv stx sv+2 ldx #0 ; ; loop through every hashed file and add it the string vector ; addloop lda builtintbl,x ora builtintbl+2,x beq doneadd phx pei (sv+2) pei (sv) lda builtintbl+2,x pha lda builtintbl,x pha pea 1 jsl sv_add pla clc adc #10 tax bra addloop doneadd anop doneprint pei (sv+2) pei (sv) jsl sv_sort pei (sv+2) pei (sv) jsl sv_colprint pei (sv+2) pei (sv) jsl sv_dispose exit return END