+JJJJ  / X5 ޹ lӠˠӠϠӠϠԮԠҠˠčӠ٠ϠԮ鷎귭෍ᷩ췩緈JJJJx Lȿ L8ᷭ緍췩 緍i 8 `巬 췌`x (`(8`I`B` ``>J>J>VU)?`8'x0|&HhHh VY)'&Y)xꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*xS&x'8*3Ixix&& 8  '  & x)*++`FG8`0($ p,&"ųųೳŪŪųųij  !"#$%&'()*+,-./0123456789:;<=>?   1 '" *"( (9"1 ( ,.(0# 2  /#0/#0 *?'#07#00/0/'#07#0:"4<*55/**5/*%5/)1/)1/)1/)'#0/#0*5/*75/**5/*:5//#0/#0'#07#0:::*::'#07#0"):$(%"%:$(%"%$$2%4%$$2%4%$(2()!)E(!8b $!H(+ "@H !D)"E` @ $ C ` DQ &J80^݌Hh ü ü݌ ռ ռ ռA ļD ļ? ļAEDE?HJ>h Լ ռ ռ ռ`HJ>݌h Hh݌`葠葠ȔЖȔЖȠHIHHHHhHH݌hHhHh݌H6 2 #">" >2 #"<" >2 #"&" >2 #$8D >2 NO, KEEP TESTING <1 #SERR AUXOUTFIRST OUT AUX.MEM ALLOW INTS BELL1ERR, SEND BELL CROUTSKIP A LINE SHELLAND LOOP ; ; $^2 STE PROCESSES ; ; ; SCOLD SHELLCOLDSTART SWARM SHELLWARMSTART ; ; SHELL #"%"SET UP PROMPT PROMPT GETLNGET A LINE OF INPUT #$00ANY INPUT? SHELLNO, GET SOME #$00START WITH 1ST CHAR STEMP1 ^1 LINBUF,XGET CHARP CURDIR ZGETPATH $E803GET FILE DSC ; ; ;MONITOR ROUTINES ; BELL1 $FBDDRING BELL GETLN $FD6AGET INPUT LINE RELOC $FEB0RELOCATOR ; ;ABSOLUTES ETC ; PROMPT $33PROMPT LOC'N LINBUF $200INPUT BUFFER "PLIST $E810LIST OF $EBTEMP STORAGE STEMP2 $EC STEMP3 $ED STEMP4 $EE ; ; ;KERNEL ROUTINES ; URDY $D003READY USTP $D006STOPPROC UCTE $D012CREATE VMEMFREE $D052CHECK MEM FREE #UMEMBLK $D055CHECK MEM BLK FREE ZCDTOBLK $E800SET U;  $E000  $800 ; ; ; %;THIS IS A CRUDE ATTEMPT AT A SHELL. #; EVENTUALLY ALL THE EQU'S WILL BE ; IN A CONFIG FILE. !;APPEND 'CONFIG.SRC' BEFORE ASM! ; ; ;ZERO PAGE USE ; ORIG $3CUSED BY RELOCATOR END $3E START $42 ; STEMP1****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * THE SHELL * * * * PART 1 * * * ****************** ; ; ; ;      9F:G а;ʎ L= ְ $ 8ЭX`'8` ְ $i 8ЭX`&(%& ذ() L= W׮;ʎߢ L=ڎMN<>iJ;=;();;  ( ׮MFNG()( xא *LD8`ߠ($(( ذ l׭(() &#жL=) ; Wע߽߮ m߮` &؊ߝ`MNDEI@ǍF װX ;%J &ذE9:MFNG а0+gi'FGF а &ؐ%8`ߌ ذ WצFG߆F߆GG аEE߮FG>)iD>)eEL٢B() *eGDHE9F:G BDELٮ;ʎ߮GDHE߽FG аEE߮DELX Wע&(I0uM'N('#* $%&Lڭ/.        ; ; ;ZERO PAGE MONTOR LOC'NS ; CH $24PRINTING COLUMN ; ; ; ;KERNEL ROUTINES ; UKILL $D00FKILL PROCESS ; ; ; $F941PRINT A,X PRBL2 $F94APRINT BLANKS CROUT $FD8EPRINT A CR-LF !PRBYTE $FDDAPRINT A HEX BYTE PRHEX $FDE3PRINT A NIBBLE PRERR $FF2DPRINT 'ERR' MON $FF69MONITOR ENTRY ; ; ; ; STACK ADDRESS ; STACK $100 ; ;I/O ADDRESSES ; COUT $FDEDSTD OUTTPUT SETERR $FE93SET ERR OUTPUT ; ; ; ;SPECIAL CHARS ; ESC $1BESCAPE ETX $03ETX CHARACTER CR $0DCR-LF ; ; ; ;OUTPUT & MONITOR ROUTINES ; PRNTYX $F940PRINT Y,X PRNTAX FTEMP8 $DFFF ; ; ; * * * * SUPPORT * * ROUTINES * * CONFIGURATION * * * ****************** ; ; ; ; ; ;MEMORY ADDRESSES ; AUXIN $C08BAUX.MEM IN AUXOUT $C080AUX.MEM OUT ; ; ; FILDSC+$1FFILE START ADRESS #LMTIME FILDSC+$21LAST MOD TIME 'HDRPTR FILDSC+$25PTR TO HEADER BLK ; ; ; ;TEMPORORY STORAGE FTEMP1 $DFF8 FTEMP2 $DFF9 FTEMP3 $DFFA FTEMP4 $DFFB FTEMP5 $DFFC FTEMP6 $DFFD FTEMP7 $DFFE FILDSC+$11KEY BLK PTR #BLOCKS FILDSC+$13NO. OF BLOCKS %ENDPTR FILDSC+$15END OF FILE PTR #CRTIME FILDSC+$18CREATION TIME $VERSION FILDSC+$1CPRODOS VERSION (MINVSN FILDSC+$1DMIN PRODOS VERSION #FILACCES FILDSC+$1EFILE'S ACCESS 'AUXPTR SYSBUF+$27PARENT POINTER )DIRPEL SYSBUF+$2APARENT ENTRY LENGTH FILEONE SYSBUF+$2BFILE DESC ; ; ; ;DESCRIPTOR LOCATIONS ; !STORTYPE FILDSC+$0STORAGE TYPE FILNAM FILDSC+$1FILE'S NAME )FILTYPE FILDSC+$10FILE TYPE (BIN=$06) !KEYPTR YTE FILETWO SYSBUF+$4FILE DESC 'DIRDSC FILETWODIRECTORY DESCRIPTOR DIRNAM SYSBUF+$5DIR'S NAME DIRID SYSBUF+$14HEADER ID &DIRENL SYSBUF+$23DSC ENTRY LENGTH !DIREPB SYSBUF+$24ENTRIES/BLK "FILCNT SYSBUF+$25NO. OF FILES $DIRPNT ROR DEVERR $28NO DEVICE DIRERR $29NOT DIRECTORY BLK FILERR $2AFILE NOT FOUND PROTERR $2BWRITE-PROTECTED ; ; ; ;DIRECTORY ADDRESSES ; !PREVPTR SYSBUF+$0PREV BLK PTR !NEXTPTR SYSBUF+$2NEXT BLK PTR "BLOCKID SYSBUF+$4BLOCK ID BDELETE ERROR SYNERR $20BAD SYNTAX ERROR PATHERR $21PATH NOT FOUND "EXERR $22FILE ALREADY EXISTS TYPERR $23FILE TYPE ERROR "PANERR $24PANIC, INCONSISTENT FULERR $25DISK FULL ERROR RENERR $26RENAME ERROR IOERR $27I/O ER $F600DEVICE BIT MAP FILDSC $F628FILE DESCRIPTOR ; ; ; ;COMMANDS ; STATUS $00GET DISK STATUS READ $01READ A BLOCK WRITE $02WRITE A BLOCK ; ; ; ;ERRORS ; WRITERR $1DWRITE ERROR EXECERR $1EEXEC ERROR DELERR $1F DRIVER ; DDD $D000 ; ; ; ;ZERO PAGE ; ZCMD $42COMMAND ZDVC $43DISK DEVICE ZBUF $44I/O BUFFER ZBLK $46BLOCK NUMBER ; ; ; ;ABSOLUTE BUFFERS ; SYSBUF $F400SYSTEM BUFFER ; ; ; ;SCRATCH SPACE ; BITMAP   ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * CONFIGURATION * * * ****************** ; ; ; ; ; ;DISK DEVICEES <5AND LOOP ^6 CROUTSEND A CR-LF ALLOW INTS SHELLAND LOOP FOR INPUT ; MONJ1 MONMONITOR JUMP ; ; ; >4 SERRERROR ^4 STEMP2GET DELIMITER LINBUF,Y #"&"WAS IT AN "&"? >6YES, JUMP TO SHELL ^5 DISABLE INTS #MEMINBRING IN SBANK2PAGED MEM PSTATE,XGET STATE #PRFREEPROC FREE? >6YES USTPELSE STOP OURSELVNARGSSAVE NO. OF ARGS STEMP1SET UP NAME #$00 ^1 LINBUF,X #" "REPLACE SPACE WITH 00 >2 #$8DSAME WITH RETURNS >3 ^2 #$00 ^3 NAME,Y   #$08NO MORE THAN 8 CHARS <1 UCTECREATE PROC URDYSET READYET 0 ARGS ^7 STEMP2EOF 'PROC'? >9YES LINBUF,XGET AN ARG #" "A SPACE? <7YES, SKIP IT ^8 ADD 1 TO ARGS #$7FKILL BIT 7 NARGS,YSAVE ARG GET NEXT ARG, INCL. SPACES STEMP2 >9 LINBUF,X <8 ; !^9 NEXT 0 CHAR <5 SKIP 00 AND ADDRESS   <3TRY AGAIN SERRELSE ERROR ; ^6 #$03IS IT 'mon'? MONJ1YES, JUMP TO IT SKIP THE ZERO PLIST,YSET UP ADDRESS PROCADDR  PLIST,Y PROCADDR+1 #$01 PRIORITY #$00S#$00SET Y TO 0 ^3 STEMP1GET X-REG ^4 PLIST,YGET A CHAR LINBUF,XSAME AS INPUT? >5NO, A NEW 'PROC'  PLIST,YGET NEXT CHAR >60, FOUND A 'PROC' ELSE MATCH AGAIN <4 SERRELSE ERROR ; ^5 PLIST,YGET LINBUF,XGET CHAR #"!"COMPARE WITH DELIMITERS >2 #">" >2 #"<" >2 #"&" >2 #$8D >2 NO, KEEP TESTING <1 SERR BELL1ERR, SEND BELL CROUTSKIP A LINE SHELLAND LOOP ; ; $^2 STEMP2SAVE END OF 'PROC' T LOC'N LINBUF $200INPUT BUFFER "PLIST $E800LIST OF PROCESSES ; ; ; SCOLD SHELLCOLDSTART SWARM SHELLWARMSTART ; ; SHELL #"%"SET UP PROMPT PROMPT GETLNGET A LINE OF INPUT #$00START WITH 1ST CHAR STEMP1 ^1 DY $D003READY USTP $D006STOPPROC UCTE $D012CREATE ; ; ;MONITOR ROUTINES ; BELL1 $FBDDRING BELL GETLN $FD6AGET INPUT LINE CROUT $FD8ESEND CR-LF MON $FF69THE MONITOR ; ;ABSOLUTES ETC ; PROMPT $33PROMP;  $E000  $800 ; ; ; %;THIS IS A CRUDE ATTEMPT AT A SHELL. #; EVENTUALLY ALL THE EQU'S WILL BE ; IN A CONFIG FILE. !;APPEND 'CONFIG.SRC' BEFORE ASM! ; ; ;ZERO PAGE USE ; STEMP1 $EBTEMP STORAGE STEMP2 $EC ; ; ;KERNEL ROUTINES ; UR ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * THE SHELL * * * * PART 1 * * * ****************** ; ; ; ;      ߼ m߮ mآFG Т'Lخ9:L٭9F:G аFG mحFGF А`B() Q#8`>i9F:GDE а׬=`>Jߎߌ߭9F:GDE а߅D߅E߽FߨF)@&ܱ) ߑB B` (%8`ߊ ߩ*ߠe-I= ߪ`@ JjJJ)e=гe`)B B?MFNG а0%%& %B B ׭()Z_ $8`9F:G m а;ʎˠ젠ĠӍӠ젠ՠư          㠠͠򍠠         Ű          ð              İ         °                                                                                           ͠͠͠͠͠͠͠                ͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠͠                 ŠՠŠ֠֟ àĠŠƍ        v XLY4ɻɍLLɠ`:4ɍ)I i$: : :0ψ4ʆ: :@ @AA?@>`(!{|`}L`B:C;8=<e?A>@ -/):= ?e<:8:e/:;@Х;A`<)}`؆FGEIhHh:h; J?>ʊ:>Ș;M/=:   S;:Li Ls= BC D..=D5֤4 J :Li ɠ ɓЭ x=   &B&C= 4ݴ ݺ ɤ4&D ?5=ɥD 5 5 Dtch ; ;  $FFEB ;  BCMonitor ctrl-B jump patch ; ;  $FFF3 ;  ACMonitor W jump patch ; ;  $FFF5 ;  AFMonitor R jump patch ; ; ; ;  $FFFA  $300 ; NMIVCTR NMINMI vector patch ;  idying up HOMEClear the screen OLDBRKJump to the monitor ; ; ; ; ;  $FEB0 ; MONRJMP RELOCMonitor R jump ; ;  $FEC2 ; MONTJMP TOGGLEMonitor T jump ; ;  $FFCF ;  E0Monitor S patch ; ;  $FFE6 ;  C1Monitor T jump pa#$0FConvert to 0-F SBANK2Move it into bank2 and return ; ;  $FF07 ; ; NMI Clear decimal mode XREGX-reg YREGY-REG ACCA-reg  SPNTS-reg  STATUSP-reg  PCLProgram counter  PCH TIDYUPDo a bit of t * * NMI Handler * * * *************** ; ; ; ; ACC $45 XREG $46 YREG $47 STATUS $48 SPNT $49 ; ; HOME $FC58 OLDBRK $FA59 TIDYUP $FA76 ; ; ; ; ; TOGGLE A1LGet the Ram block ANGE MSB OF OPERAND ADD (PCL),YDONE ^3 MOVE UP PCL,H PCL LENGTH PCL >4 PCH #^4 END2CHECK PCL,H vs END2 <1LSB LESS, BRANCH PCH END2+1 <1MSB LESS, BRANCH ^5 ELSE END ; ; *************** * S2 #$10BAD OPCODE? >5YES, EXIT LENGTHGET LENGTH #$022-BYTE OPERAND? >3NO, MOVE UP COPY OFFSET TO Y (PCL),YGET OPERAND MSB ORIG+1CHECK IN OLD RANGE >3LESS, SKIP END+1 >2LESS, DO >3NOT EQUAL, SKIP !^2 CHADD ORIGADDEND ; ; ;MONITOR LOCATIONS ; ; ; RELOC STARTSET UP PCL,H PCL START+1 PCH  ORIG+1GET DIFFERENCE ADDSAVE ADDEND  END+1CALC NEW END END2+1 END END2DONE ; ^1 #$00CHECK OPCODE INSDVZTX40SHOW 40-COL SCREEN AND RETURN ; ; ; ************* * * * RELOCATOR * * * ************* ; ; ;ZPG LOCATIONS ; ORIG A1LORIGINAL ADDR END A2LORIGINAL END START A4LNEW ADDR END2 A3LNEW END OUR resets the screen to !; 40-columns when the machine is ; coldstarted. ; &FOUR #$28SET 40-COLS REGARDLESS WNDWTH #$04SET 40-COL SCREEN TXTMOD #$00RESET BANKS TO 0,1,X,F SBANK1 #$60RTS AT $F80F FOR PRINTER #$01 SBANK2 Yes, try next byte pair 'PRINTA3Success, print out address!! #NEXTBASEA3LIncrement start base STOPYET A3H STOPYET A3HIs A3L,H = A2L,H? A2H LOOP2No, goto LOOP2 A3L A2L LOOP2No, goto LOOP2 All finished!! ; ; #;Routine Fr #YSAVand fix up YSAV for monitor Get right value for X #STRNLENStore string length down CROUTDo a LOOP2 STRNLENGet length LOOP3 (A3L),YGet test byte STRNGBUF,YSame byte? NEXTBASENo, move the base up  LOOP3next nybble PUTFLAGToggle the putflag PARSEAnd do next char SHIFT Shift the nybble to the top of the byte   STRNGBUF,XStore in buffer PUTFLAGToggle the putflag PARSEAnd do next character "DONPARS Leave for monito0' to '9'? PUTSTRNGYes, insert it  #$99'A' to 'F'? #$10 PUTSTRNGYes, insert it PARSEelse do next character PUTSTRNGPUTFLAGShift it? SHIFTYes, so do so "STRNGBUF,XAdd the lower nybble STRNGBUF,XStore it down Move to mory for a specific ;set of bytes. ; %SEARCH #$00Set X to 0 for buffer PUTFLAGSet up flag YSAVGet INBUF offset PARSE INBUF,YGet next char incrementing Y #$8DA return? DONPARSYes, no more parsing #$B0What is it. #$0A'T A3H,L $PRBYTE $FDDAPrint byte in A-reg CROUT $FD8EPrint a ; ; !PUTFLAG $3AUsed as a 0-1 flag &STRNLEN $3ALength of search string ; ; ; ; ; ";SEARCH Routine. This addition to ;the FPBasic monitor allows a %;search of the meTHE CHAR Y-REG POINTS TO IT ; ; ; ****************** * * * SEARCH ROUTINE * * * ****************** ; ; INBUF $200Input buffer STRNGBUF $200Search string PRNTAX $F941Print A & X PRINTA3 $FBB5PRININ,YGET AN INPUT CHAR #";"IS IT A SEMI-COLON >9YES, SKIP #$8DOR A RETURN? >9YES, OK ERROR2NO, GIVE AN ERROR &^9 FINDNOW FIND THE CMD BYTES ; NOTSP IN,YGET THE NEXT NON-SPACE CHARACTER #" " NOTSPA-REG HOLDS OTHER CMD CHAR A5LGET CMD FORMAT SHIFT LEFT TWICE  YSAV1ADD BITS FROM YSAV1 #$20LEGAL CMD? >8YES, SKIP YSAV1ELSE GET YSAV1 >8AND SKIP IF =0 #$80ELSE TURN BIT 7 ON ^8 A5LUSE AS CMD FORMAT YSAVSAVE Y-REG AGAIN YET? >7NO, SKIP GETNUMGET ADDRESS IN A2L,H A2HGET HI BYTE OF CMD ADDR >6IS ZERO PAGE? INCREMENT X-REG !^6 YSAV1SAVE IT IN YSAV1 #$03SET IT BACK TO 3 MOVE BACK ALONG INPUT ^7 A1HSAVE X IN A1H  <2AND GET ANR CHAR2,XIS IT Y,X,$ or NUL >5YES CHAR2,XNO, GET THAT CHAR >4SKIP IF ZERO #"$"IS IT A $ SIGN? >4YES YSAVGET FIRST CHAR POSN ^3 CLEAR CARRY ^4 DECREMENT Y "^5 A5LROLL CARRY INTO A5L #$03DONE 2 CHARS 4L,H A4L A4H  <1LOOP BACK A1HDONE 3 CHARS YET? <1 %<9YES, NOW 3CHARS=15BITS IN A4L,H $#$05COMPARE NEXT CHAR WITH TABLE ^2 NOTSPGET NEXT CHAR YSAVSAVE Y POSN CHAR1,XIS IT ( , ) # or $ >3NO NOTSPGET NEXT CHAO PCL,H &^8 #$03GET 3 CHARS AS COMMAND A1H "^9 NOTSPGET NEXT CMD CHAR IS IT ALPHABETICAL? #$BECONVERT TO $C4-$F6 #$C2 MONPNOT UPCASE, PASS TO MON  NOW $10,$18..,$D8 #$04SHIFT THE CHAR'S 5 BITS ^1 INTO AZMODESET MODE TO 0 INGET FIRST CHARACTER #" "A SPACE, CONTINUATION OF >8ASSEMBLY, SKIP GETNUMGET ADDRESS INTO A2L,H #$93A $93? ERROR3 MONPNO, PAS TO MON IF X-REG=0, AN ERROR AS WELL MONPPASS TO MON A1PCLPCOPY A1L,H TDECREMENT YSAV1 FINDAND LOOP ; ERROR YSAVELSE GET Y BACK $ERROR2 TRANSFER OFFSET TO X-REG  PRBL2PRINT MANY BLANKS #"^"NOW PRINT POINTER COUTUNDERNEATH THE ERROR BELLGIVE A BELL ; ; MONZRETURN TO MONITOR ; ASM A5LGET OUR CMD FORMAT FORMATGET REAL FORMAT #$9DIS IT RELATIVE? RELYES, SUBTRACT ADDRESSES FORMATCOMPARE FORMATS IDNIDENTICAL, ASSEMBLE BYTES '^7 A1HELSE TRY ANOTHER COMMAND FINDAND LOOP A5LMOVE OUR FORMAT UP YSAV1; ; %FIND A1HGET INSTRUCTION OPCODE "INSDS2+2CALC FORMAT OF COMMAND PUT MNEM OFFSET INTO X-REG MNEMR,XGET A KNOWN COMMAND A4LSAME AS OUR ONE? >7NO, TRY ANOTHER !MNEML,XOK, CHECK 2ND BYTE TOO A4HSAME? >7NO, TRY ANOTHER E INTO MEMORY (PCL),Y  <4 UPMOVE UP TWO LINES UP #INSTDSPDISASSEMBLE THE NEW LINE PCADJMOVE THE PC FORWARD PCHAND STORE IT IN PCL,H PCL MONZNOW GET NEXT COMMAND ; MONP ZMODESET MODE TO 0 NXTITMJUMP TO MONITOR TH ^1 AND SUBTRACT THE PC LO BYTE PCL A2LSTORE THE NEW VALUE >2IS NEGATIVE SUBTRACT THE PC HI BYTE ^2 PCH #ERROR4 ERRORIF NOT ZERO, ERROR +IDN LENGTHGET LEN OF OPCODE ADDRESS '^4 A2L-1,YAND SAVGGLE SBANK1 $C07CBANK1 INPUT SBANK2 $C07DBANK2 INPUT ; ;  $F686  $800 ; ; %REL #$81RELATIVE, IS IT >$80? CHECK IF CARRY IS CLEAR ERROR4YES, ERROR A2HGET CMD ADDRESS A2LINTO X,Y >1IF LO BYTE IS 0 DECREMENT BO67 COUT $FDED BL1 $FE00 A1PCLP $FE78 BELL $FF3A MONZ $FF69 NXTITM $FF73 GETNUM $FFA7 TOSUB $FFBE ZMODE $FFC7 CHRTBL $FFCC ; ; ;I/O LOCATIONS ; TXTMOD $57B40/80 INDICATOR VZTX40 $C04C40-COL TOA4L $42 A4H $43 A5L $44 ; ; ;MONITOR ROUTINES ; IN $200 INSDS2 $F88C INSTDSP $F8D0 PRBL2 $F94A PCADJ $F953 CHAR1 $F9B4 CHAR2 $F9BA MNEML $F9C0 MNEMR $FA00 UP $FC1A GETLNZ $FDFBYTES IN CMD MODE $31MONITOR MODE PROMPT $33INPUT PROMPT YSAV $34Y STORE YSAV1 $35X STORE PCL $3APC ADDRESS PCH $3B A1L $3C A1H $3DCOUNTER A2L $3E A2H $3F A3L $40 A3H $41  ************* * * * XINU * * OPERATING * * SYSTEM * * * * MINI * * ASSEMBLER * * * ************* ; ; ;ZERO PAGE (MONITOR) USE ; WNDWTH $21SCREEN WIDTH FORMAT $2ECMD FORMAT LENGTH $2           4ɻɍLjL>ɠ`ɍЀLXɠ`J?>ʊ:>Ș;M/=:   S;:Li Ls= BC D..=D5֤4 J :Li ɠ ɓЭ x=    &B&C=  4ݴ  ݺ ɤ4&D ?5=ɥD 5 5 D  RACTER #" " NOTSPA-REG HOLDS THE CHAR Y-REG POINTS TO IT ; ; ;  START MONZ CMD FORMAT YSAVSAVE Y-REG AGAIN IN,YGET AN INPUT CHAR #";"IS IT A SEMI-COLON >9YES, SKIP #$8DOR A RETURN? >9YES, OK ERROR2NO, GIVE AN ERROR &^9 FINDNOW FIND THE CMD BYTES ; NOTSP IN,YGET THE NEXT NON-SPACE CHAHSAVE X IN A1H  <2AND GET ANOTHER CMD CHAR A5LGET CMD FORMAT SHIFT LEFT TWICE  YSAV1ADD BITS FROM YSAV1 #$20LEGAL CMD? >8YES, SKIP YSAV1ELSE GET YSAV1 >8AND SKIP IF =0 #$80ELSE TURN BIT 7 ON ^8 A5LUSE AS CARRY INTO A5L #$03DONE 2 CHARS YET? >7NO, SKIP GETNUMGET ADDRESS IN A2L,H A2HGET HI BYTE OF CMD ADDR >6IS ZERO PAGE? INCREMENT X-REG !^6 YSAV1SAVE IT IN YSAV1 #$03SET IT BACK TO 3 MOVE BACK ALONG INPUT ^7 A1 or $ >3NO NOTSPGET NEXT CHAR CHAR2,XIS IT Y,X,$ or NUL >5YES CHAR2,XNO, GET THAT CHAR >4SKIP IF ZERO #"$"IS IT A $ SIGN? >4YES YSAVGET FIRST CHAR POSN ^3 CLEAR CARRY ^4 DECREMENT Y "^5 A5LROLL THE CHAR'S 5 BITS ^1 INTO A4L,H A4L A4H  <1LOOP BACK A1HDONE 3 CHARS YET? <1 %<9YES, NOW 3CHARS=15BITS IN A4L,H $#$05COMPARE NEXT CHAR WITH TABLE ^2 NOTSPGET NEXT CHAR YSAVSAVE Y POSN CHAR1,XIS IT ( , ) #PPASS TO MON A1PCLPCOPY A1L,H TO PCL,H &^8 #$03GET 3 CHARS AS COMMAND A1H "^9 NOTSPGET NEXT CMD CHAR IS IT ALPHABETICAL? #$BECONVERT TO $C4-$F6 #$C2 MONPNOT UPCASE, PASS TO MON  NOW $10,$18..,$D8 #$04SHIFT MONZRETURN TO MONITOR ; ASM ZMODESET MODE TO 0 INGET FIRST CHARACTER #" "A SPACE, CONTINUATION OF >8ASSEMBLY, SKIP GETNUMGET ADDRESS INTO A2L,H #$93A $93? ERROR3 MONPNO, PAS TO MON IF X-REG=0, AN ERROR AS WELL MONP A5LMOVE OUR FORMAT UP YSAV1DECREMENT YSAV1 FINDAND LOOP ; ERROR YSAVELSE GET Y BACK $ERROR2 TRANSFER OFFSET TO X-REG  PRBL2PRINT MANY BLANKS #"^"NOW PRINT POINTER COUTUNDERNEATH THE ERROR BELLGIVE A BELL ; ;  A4HSAME? >7NO, TRY ANOTHER A5LGET OUR CMD FORMAT FORMATGET REAL FORMAT #$9DIS IT RELATIVE? RELYES, SUBTRACT ADDRESSES FORMATCOMPARE FORMATS IDNIDENTICAL, ASSEMBLE BYTES '^7 A1HELSE TRY ANOTHER COMMAND FINDAND LOOODE TO 0 NXTITMJUMP TO MONITOR ; ; %FIND A1HGET INSTRUCTION OPCODE "INSDS2+2CALC FORMAT OF COMMAND PUT MNEM OFFSET INTO X-REG MNEMR,XGET A KNOWN COMMAND A4LSAME AS OUR ONE? >7NO, TRY ANOTHER !MNEML,XOK, CHECK 2ND BYTE TOO E ADDRESS '^4 A2L-1,YAND SAVE INTO MEMORY (PCL),Y  <4 UPMOVE UP TWO LINES UP #INSTDSPDISASSEMBLE THE NEW LINE PCADJMOVE THE PC FORWARD PCHAND STORE IT IN PCL,H PCL MONZNOW GET NEXT COMMAND ; MONP ZMODESET M>1IF LO BYTE IS 0 DECREMENT BOTH ^1 AND SUBTRACT THE PC LO BYTE PCL A2LSTORE THE NEW VALUE >2IS NEGATIVE SUBTRACT THE PC HI BYTE ^2 PCH #ERROR4 ERRORIF NOT ZERO, ERROR +IDN LENGTHGET LEN OF OPCODONZ $FF69 NXTITM $FF73 GETNUM $FFA7 TOSUB $FFBE ZMODE $FFC7 CHRTBL $FFCC ; ;  $800  $800 ; ; %REL #$81RELATIVE, IS IT >$80? CHECK IF CARRY IS CLEAR ERROR4YES, ERROR A2HGET CMD ADDRESS A2LINTO X,Y IN $200 INSDS2 $F88C INSTDSP $F8D0 PRBL2 $F94A PCADJ $F953 CHAR1 $F9B4 CHAR2 $F9BA MNEML $F9C0 MNEMR $FA00 UP $FC1A GETLNZ $FD67 COUT $FDED BL1 $FE00 A1PCLP $FE78 BELL $FF3A M1MONITOR MODE PROMPT $33INPUT PROMPT YSAV $34Y STORE YSAV1 $35X STORE PCL $3APC ADDRESS PCH $3B A1H $3DCOUNTER A2L $3E A2H $3F A4L $42 A4H $43 A5L $44 ; ; ;MONITOR ROUTINES ; _************* * * * XINU * * OPERATING * * SYSTEM * * * * MINI * * ASSEMBLER * * * ************* ; ; ;ZERO PAGE (MONITOR) USE ; FORMAT $2ECMD FORMAT LENGTH $2FBYTES IN CMD MODE $3     DLLgLLLLDLe٠BDGFE А`ߌߢ'J߈߬`` xװ6&(0ݍ߆FGBDE а))8`+߱ )i'ڭFGF *FG8` аб  ; #$75 DIRID HDRPTRSET UP PARENT PTR DIRPNT HDRPTR+1 DIRPNT+1 #$27SET ENTRY LENGTHS DIRENL DIRPEL #$0DNO. ENTRIES/BLK DIREPB #$00NO FILES IN DIRECTORY FILCNT FILCNT+1 IBLK2NOW WRITE THE HEADER ; ; ; ; <1YES, LOOP &IBLK2 #SYSBUFOK, WRITE INDEX BLK ZBUF /SYSBUF ZBUF+1 IBLK ; ; !SUB3 CLRBUFFIRST CLR BUFFR #$26COPY FILDSC ^2 FILDSC,XTO DIRDSC DIRDSC,X  <2TO SET UP SUBHDR #$30SET UP A HEADER BLOCKID +1 ZBUF+1 #$00SET UP OFFSET INTO FTEMP5INDEX BLOCK &^1 SYSBUF,XGET BLOCK PTR FROM ZBLKINDEX BLOCK SYSBUF+$100,X ZBLK+1 DDDWRITE THE BLK RTS3 ZBUF+1MOVE BUFFER UP ZBUF+1 FTEMP5 FTEMP5 FTEMP1MORE BLKS? K KEYPTR+1 ZBLK+1 DDDDONE ZCMDRESET TO READ RTS3 RTS2 #SYSBUFNOW SET TO SYSBUF ZBUF /SYSBUF ZBUF+1 SAVMAPAND SAVE MAP ; ; !SAP3 BLOCKSGET NO. OF BLKS  FTEMP1 AUXPTRSET UP BASE ADDRESS ZBUF AUXPTRADY ; BEEN WRITTEN TO DISK. ; WRITFIL #WRITESET WRITING ZCMD STORTYPEGET STORAGE TYPE #$F0 #$20A SAPLING? SAP3 #$D0A SUBDIR? SUB3 ; SEED3 AUXPTRWRITE THE ONLY ZBUFBLOCK AUXPTR+1 ZBUF+1 IBLK KEYPTR ZBLUP OFFSET MPTRINTO MAIN MEMORY AS WE DID ABOVE ENDPTR+1 #$01 ZBUF+1 MPTR+1 LASTONEAND GET LAST BLOCK ; ; ; ; ; ; &;WRITFIL: WRITES THE FILE IN THE FILE $; DESCRIPTOR. BITMAP HOLDS MAP WITH (; 1 BLOCK ALLOCATED. FILDSC HAS ALRE1 FTEMP2GET NEXT BLOCK FTEMP2 FTEMP1ONLY ONE LEFT? <3NO, KEEP GOING SYSBUF,XSET UP LAST BLK PTR ZBLK SYSBUF+$100,X ZBLK+1 #$00SET UP OFFSET INTO QPTRSYSTEM BUFFER  ENDPTR+1 #$01 /SYSBUF QPTR+1 ZBUFSET GOT IT ERR105 FTEMP2NOW SET UP ADDRESS ZBUF FTEMP3 ZBUF+1 #$00SET UP OFFSET INTO FTEMP2INDEX TABLE !^3 SYSBUF,XGET BLOCK NO. ZBLK SYSBUF+$100,X ZBLK+1 DDDGET IT RTS2 RTS1 ZBUF+1MOVE UP BUFPTR ZBUF+R RTS1 AND RETURN ; ; SAP2 ENDPTR+1GET EOF MSB DIV BY 2 FTEMP1SAVE AS BLK COUNT FTEMP2SAVE BASE ADDRESS FTEMP3 KEYPTRGET INDEX BLOCK ZBLK KEYPTR+1 ZBLK+1 #SYSBUFINTO BUFFER ZBUF /SYSBUF ZBUF+1 DDD(QPTR),YCOPY OVER BYTES (MPTR),Y  <1 (QPTR),YCOPY BYTE 0 TOO! (MPTR),Y MPTR+1MOVE DOWN PTRS QPTR+1 QPTR+1 /SYSBUFFINISHED? >3YES, LEAVE &^2 (QPTR),YNO, COPY LAST PAGE (MPTR),Y  <2 ^3 SET NO ERRONDPTR+1GET EOF PTR /SYSBUFOFFSET INTO BUFFER QPTR+1 KEYPTRGET THE ONLY DATA ZBLKBLOCK KEYPTR+1 ZBLK+1 "LASTONE #SYSBUFINTO THE BUFFER ZBUF /SYSBUF ZBUF+1 DDDGET LAST BLOCK ERR105 ENDPTRGET OFFSET  #^1 ZCMD STORTYPEGET STORAGE TYPE #$F0 #$20A SAPLING? SAP2YES #$10A SEEDLING? SEED2YES #TYPERRELSE BAD FILE TYPE ERR105 EXIT  ; ; !SEED2 MPTRSAVE BASE ADDRESS MPTR+1 #$00SET UP PTR TO OUR BUFFER QPTR  EBLK ZBLK NEXTPTR+1 ZBLK+1 ZBLK SAVMAPALL DONE, SAVE MAP DDDELSE GET BLOCK <1AND DEALLOCATE IT ERROR, RETURN ; ; ; %;READFIL: READS THE FILE IN THE FILE %; DESCRIPTOR. X,Y HOLD START ADDRESS ; READFIL #READSET READING AKAND PUT BACK ON DISK ; ; SEED1 KEYPTRDEALLOC THE KEYPTR+1ONLY BLOCK LASTBLK ; ; SUB1 KEYPTRGET THE HEADER ZBLK KEYPTR+1 ZBLK+1 DDD ERR104 ^1 ZBLKDEALLOC THE BLK ZBLK+1 REMBLK NEXTPTRNOW GET NEXT O NEXT BLOCK FTEMP1 <4 SYSBUF+$100NOW FIRST BLOCK SYSBUF LASTBLK REMBLKDONE SAVMAP #$06READ THE BIT MAP ZBLK #$00 ZBLK+1 DDDGOT IT #$27COPY THE MAP BACK !^5 BITMAP,XTO THE BUFFER SYSBUF,X  <5 WRITB SAP1 KEYPTRDEALLOCATE THE ZBLKINDEX BLOCK KEYPTR+1 ZBLK+1 REMBLKAND NOW READ IT DDD ERR104 BLOCKSSTART WITH LAST BLOCK   FTEMP1 $^4 SYSBUF+$100,XGET A BLOCK SYSBUF,X  REMBLKDEALLOCATE IT FTEMP1DOK, WRITE THE HEADER DDD ZCMD ; ; ; FREEBLKSGETMAPGET THE BITMAP STORTYPEGET STORE TYPE #$F0 #$10A SEEDLING? SEED1 #$D0A SUBDIRECTORY? SUB1 #$20A SAPLING? SAP1 #PANERRELSE PANIC!! ERR104 AND EXIT  ; ; SC DDD ZCMD ERR104 HDRPTRGET HEADER POINTER ZBLK HDRPTR+1 ZBLK+1 DDDAND GET HEADER ERR104 ; "^2 FILCNTDEC THE FILE CNT FILCNT #$FF >3 FILCNT+1 ^3 FILCNTNO FILES LEFT? FTEMP2SAVE RESULT ZCMDTHE FILE IN THE ; MAIN FILE DESCRIPTOR. ; *N.B: FINDFIL JUST CALLED #; FTEMP2=0 IF NO FILES LEFT IN DIR ; DELFIL #$00DELETE FILE DESC  (MPTR),YDONE BLOCKIDTHIS THE HEADER BLK? #$E0 #$E0 >2YES, SKIP ZCMDELSE SAVE DELETED DE****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * PART 2 * * * ****************** ; ; ; ; ; !;DELFIL:DELETES              ; ; ; CKS #CRTIMESET UP /CRTIMECREATION TIME DATEFIL DISABLE INTS FTEMP2SAVE 2ND S-REG BEFORE MAKFIL ZBLKGET DIRECTORY PTR ZBLK+1IN X,Y ZMAKFILMAKE THE SUBDIR RETIREVE S-REG FTEMP2 <1ERROR NOERR203ELSE FINISHED ME OTHER ERROR FTEMP1GET FINAL NAME LENGTH USE AS OFFSET #$D0SET STORTYPE=SUBDIR STORTYPE QPTRSHIFT PTR DOWN 1 "^3 (QPTR),YCOPY OVER NAME STORTYPE,Y  <3 #$0FSET FILETYPE=SUBDIR FILTYPE #$01SET ONE BLOCK BLOABLE INTS AUXINBRING IN AUX.MEM AUXIN SAVE 2ND S-REG FTEMP2 USE IN GETPATH  GET ARGS PTR GETPATHFIND PATH >2ERROR, GOOD #EXERRELSE ALREADY EXISTS ^1 ERR203EXIT %^2 #PATHERRCOULDN'T FIND IT? <1NO, SODAYLOFINALLY HOURS  #MEMOUTPAGE MEM OUT SBANK2 #$03PULL DATE ^2 (QPTR),YAND SAVE  <2 SET NO ERRORS ALLOW INTS AND RETURN ; ; ; %;MKDIR:PROCESS TO CREATE A DIRECTORY ; AT THE GIVEN PATH. ; MKDIR DISsss ; DATEFIL DISABLE INTS QPTRSAVE POINTER QPTR+1 #MEMINGET SYS.DATE ON STACK SBANK2 MONTHFIRST MONTH SHIFTED TO RIGHT SPOT    DAYHIPLUS DAY  YEARNOW YEAR WITH A MONTH BIT  CLOCKHINOW MINUTES  CONVERT SYSTEM DATE $; TO PRODOS FILE DATE. X,Y POINT TP ; PRODOS TIME FIELD. ; #;*N.B PRODOS TIME FIELD (4 BYTES): ; mmmddddd yyyyyyym ; 00mmmmmm 000hhhhh ; ;SYSTEM DATE (6 BYTES) ; 0yyyyyyy 0000mmmm ; 000ddddd 000hhhhh ; 00mmmmmm 00sssS CHARS IN Y,A TO HEX &; VALUE 0-99 IN A-REG. Y,A CLOBBERED. ; DECHEX FIRST CONVERT BOTH TO 0-9 #$0F   #$0F NOW ADD ON Y*10 MULTEN,Y AND RETURN ; MULTEN 000A141E28*10 TABLE 323C46505A ; ; ; (;DATEFIL:ROUTINE TO ,10,100? >3 HTDTABL,YSUBTRACT 1,10,100 ADD 1 TO COUNT <2UNTIL IT IS LESS ^3 SAVE INPUT GET COUNT #$B0CONVERT TO CHAR COUTPRINT LETTER  AND LOOP <1  ; ; HTDTABL 010A641,10,100 ; ; ; &;DECHEX: CONVERTVC" ; ; ; #;HEXDEC: ROUTINE TO PRINT A-REG IN (; DECIMAL (3CHARS). ALL REGS CLOBBERED. ; HEXDEC2 PRINTS 2 CHARS. ; HEXDEC #$02PRINT 3 CHARS  C0SKIP INST. HEXDEC2 #$01ONLY 2 CHARS ^1 #$00SET COUNT TO 0 %^2 HTDTABL,YIS A > 1EXCONVERT TO HEX QPTR YEAR,YSAVE D,M,Y  >7PAST YEAR, SKIP  MOVE UP PTR  <6 ; !^7 QPTR+1DONE, KILL ARGS  <1AND EXIT ; ; ; ML1 "JFMAMJJASOND"MONTH !ML2 "AEAPAUUUECOE"LETTERS ML3 "NBRRYNLGPTGET OFFSET DAYLO,YSAVE H,M,S PAST SECONDS? #$03 >4YES, SKIP  MOVE UP PTR  <3 ^4 #' 'SKIP ANY SPACES ^5 STACK,X <5 #$02OFFSET FROM YEAR ^6 QPTR STACK,XGET 2 DIGITS STACK+1,X DECHCOUT #MEMOUTPAGED MEM OUT SBANK2 SET NO ERRORS ALLOW INTS AND RETURN ; ^2 QPTR+1SAVE 2ND S-REG GET ARGS PTR  #$00POINT TO DAYLO ^3 QPTR STACK,XGET 2 DIGITS STACK+1,X DECHEXCONVERT TO HEX QPTRT 2 SPACES PRBL2 DAYHINOW DAYS HEXDEC2 #"-" COUT MONTHUSE MONTH AS OFFSET ML1-1,XGET 1ST LETTER COUT ML2-1,X COUT ML3-1,X COUT #"-" COUT YEARFINALLY YEAR HEXDEC2 CROUTA CR-LF ^1 #ETXSEND ETX ATE DISABLE INTS #MEMINBRING IN PAGED MEM SBANK2 #$00ANY ARGS? >2YES, SKIP DAYLOPRINT OUT HOUR HEXDEC2 #":"PLUS A COLON COUT CLOCKHIAND MINUTES HEXDEC2 #":" COUT CLOCKLOAND SECONDS HEXDEC2 #$02PRINR TO NAME /STACK ZRENAMRENAME FILE "^2 FTEMP4PUT 2ND S-REG IN FTEMP2FTEMP2 <4ERROR, EXIT NOERR203AND FINISH ; ; ; &;DATE:PROCESS TO DISPLAY AND SET DATE ; IF SETTING DATE, FORMAT IS %; date {hh}:{mm}:{ss} {dd}/{mm}/{yy} ; DOF 1ST NAME STACK,X #' 'TERMINATED BY A ' ' <1 USE IN GETBUF GET BACK ARG PTR  GETPATHFIND FILE >2ERR, EXIT STORTYPEIF FILE INVALID >2EXIT GET 2ND NAME LEN FTEMP4 FTEMP2 #$0FONLY 15 CHARS FTEMP2LOAD PT";MV: PROCESS TO REMANE A FILE/DIR #; N.B WONT COPY ACROSS DIRECTORIES ; ^4 <4B.O.O.RANGE MV DISABLE INTS AUXINBRING IN AUXINAUX.MEM #$00ANY ARGS <4NO, EXIT  FTEMP4SAVE 2ND S-REG GET ARGS PTR ^1 FIND E****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 3 * * * ****************** ; ; ; ; 0  L.ͩ*  8ʩ}LFEDCBA9876543210$ )`)_I0 iz 8`)` ?  АLL蚽 ? а蚽 ?۪ ॠ$$ @44 CI0LL eerf skcolB x}YXW   $ $X $X $$ X pX Н}LCFRRSSWNRDCLUATEYVPSTx}_** $ à--H h` dH)h)y=` (2  J$ ȱ A i'Lj h 8چߩBDE m/FG`C5.0 аf'F(GFu/yL=lߩ/߭ߦʤ אFG0CICߦʤ װ()9F:G߆L=!8``xߊ  LmL L L L i_<yA[tנּFj C(*G`CGF`xD mBE а=)8eH/H'F(GFh  X`H -      E READY QUEUE. ; START KILL ALL ARGS STACK,XGET ONLY ARG GETHEXCONVERT TO HEX <2ERROR, EXIT #$00IS PID ZERO <3YES, CAN'T START SHELL PUT INT X-REG URSUMESET PROCESS READY <2 <3 ; ; ; ; SYNTAX AS PER KILL. ; HALT KILL ALL ARGS STACK,XGET ONLY ARG GETHEX <2ERROR, EXIT #$00PID ZERO? <2YES, ERROR  USUSPSUSPEND PROCESS <2 <3AND EXIT ; ; ; %;START:RESTARTS A SUSPENDED PROCESS, !; PLACING IT ON THERROR, EXIT #$00IS PID ZERO >2YES, CAN'T KILL SHELL PUT INT X-REG UKILLKILL PROCESS >3NO ERROR, EXIT ^2 ERR200EXIT WITH ERR !^3 NOERR200ELSE FINISHED ; ; ; !;HALT: SETS THE REQUIRED PROCESS ; TO THE SUSPENDED STATE.SET ERROR AND RETURN ^4 #$0FWANT ONLY 1-F SET NO ERROR AND RETURN ; ; ; #;KILL:PROCESS TO KILL THE REQUIRED &; PROCESS. SYNTAX kill {p} :p='1'-'F' ; KILL KILL ALL ARGS STACK,XGET ONLY ARG GETHEXCONVERT TO HEX >2; GETHEX #$7FBIT 7 OFF #$60IF LOWERCASE >1CONVERT TO UPPERCASE #$5F "^1 #$30IS CHAR '0' - '9'? #$0A >4YES, SKIP #$08ELSE, ADD 9 #$7AIS CHAR 'A' - 'F'? >4YES, SKIP $^2 #SYNERRELSE SYNTAX ERROR ^3 QPTR QPTR #$10BY 16 QPTR <2AND LOOP #MEMOUTDONE, OUT SBANK2PAGED MEM NOERR200AND FINISH ; !MAPSTG 'FEDCBA9876543210$ ' ; ; ; ; #;GETHEX:CONVERTS THE CHAR IN A-REG "; TO A HEX VALUE 00-0F. LOWERCASE ; CHARS CAN BE USED. M PAGE >4ZERO, FREE PAGE PRHEXELSE PRINT PID >6AND DO NEXT ONE ^4 #'.'FREE, PRINT '.'  CDSKIP INST. !^5 #'*'SYSTEM, PRINT '*' COUT ^6 NEXT PAGE #$10DONE 16? <3NO, LOOP CROUTSEND A CR-LF DECREMEMT PSTGPRINT HEADER STRING ^1 MAPSTG,X COUT  <1DONE CROUTNEXT LINE ^2 #'$'PRINT '$' COUT QPTRAND PAGE MSB PRBYTE #' 'THEN A SPACE COUT #$00NOW 16 CHARS #^3 (QPTR),YGET PAGE STATUS >5MINUS, SYSTE ;  $;MAP:PROCESS TO DISPLAY THE CURRENT !; STATE OF THE USER MEMORY. USES ; MEMLIST IN THE SYSTEM MEMORY. ; MAP DISABLE INTS KILL ALL ARGS #MEMINPAGED MEM IN SBANK2 !/MEMLISTSET UP PTR TO MEMLIST QPTR+1 #$F0 QPTR MA PADDRL,X PRBYTE CROUTPRINT A CR-LF ^4 #$10ANY MORE PROCESSES? <1YES #MEMOUTNO, KICK PAGED SBANK2MEM OUT NOERR200AND FINISH ; PSL1 'CFRRSSW'STRING LIST PSL2 'NRDCLUA'OF STATES PSL3 'TEYVPST' ; ;XPRINT PRIORITY PRBYTE #$11COL 17 CH PSTATE,XGET STATE PSL1-1,YPRINT OUT 3 CHARS COUTSHOWING THE STATE PSL2-1,Y COUT PSL3-1,Y COUT #$16COL 22 CH #'$'PRINT A '$' COUT PADDRH,XPRINT START PRBYTEADDRESSPRFREEFREE? >4YES, SKIP MULT PID BY 8    QPTRLSB OF NAME PTR #$00 ^2 (QPTR),YPRINT NAME >3 COUT  #$08 <2 ^3 #$0AMOVE TO COL 10 CH PRINT PID PRHEXONLY 1 CHAR #$0DCOL 13 CH PPRIO,; ; ;PS:PROCESS TO DISPLAY THE ; CURRENT LIST OF PROCESSES. ; PS DISABLE INTS #MEMINPAGED.MEM IN SBANK2 KILL ALL ARGS /NAMELISTSET UP PTR QPTR+1TO LIST OF NAMES #$00START WITH PROCESS 0 ^1 PSTATE,XGET STATE #KS FREE PRNTYXPRINT AMOUNT DFSTRINGPRINT 'BLOCKS FREE' ^4 DFSTRING,X COUT  <4 CROUTPRINT 2 CR-LF'S CROUT ZDVCNEXT DEVICE #$80 <2 NOERR200AND FINISH ^5 ERR200ELSE ERROR ; DFSTRING 'eerf skcolB ' ; YSBUF ZBUF+1 DDDGET DISK HEADER >5 #'/'PRINT '/' COUT FILETWOGET LENGTH #$0F USE AS COUNTER #$01 ^3 FILETWO,XPRINT NAME COUT   <3 #$12MOVE TO COL 14 CH #'$'PRINT '$' COUT ZGETMAPGET BLOC#;DF:PROCESS TO SHOW BLOCKS FREE ON ; DISK SYSTEM ; DF DISABLE INTS AUXINBRING IN AUX.MEM AUXIN  #$60START WITH DRIVE 1 ^2 ZDVC #$02SET UP BLOCK 2 ZBLK #READREADING ZCMD  ZBLK+1 ZBUFINTO SYSBUF /S****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 4 * * * ****************** ; ; ; ;                      FTEMP2FTEMP2 ERR204 NOERR203FINISHED! ; ; ; XIN #$00ANY ARGS? <4NO, EXIT (SYNERER) INC 2ND S-REG  GET ARGS START  SAVE 2ND S-REG ON STACK GETPATHGET FILE'S PATH ERR204 STORTYPEIF FILDSC INVALID ERR204THEN EXIT ZDELFILDELETE IT GET S-REG, DELFIL USES  FTEMP5INVERT THE MASK FILACCESREMOVE FROM ACCESS <7AND REWRITE IT ; ; PROTABL2 8040040201 ; (;PROTABL2 CONVERTS PROTABL TO BIT POS'N ; ; ; %;RM:PROCESS TO REMOVE NAMED FILE/DIR ; RM DISABLE INTS AUXINBRING IN AUX.MEM AUEIS FILE VALID? ERR204NO, EXIT FTEMP4GOT IT,NEW ACCESS? >8REMOVE IT FTEMP5GET OUR MASK FILACCESADD IT TO ACCESS !^7 #$1EREPLACE IN SYSBUF (MPTR),Y ZWRITBAKAND WRITE IT BACK ERR204 NOERR203AND FINISHED! ; !^8 <3KEEP LOOKING $^4 #SYNERRELSE SYNTAX ERROR ERR204 ERR203AND EXIT ; #^5 PROTABL2,YGET BIT POS'N FTEMP5ADD TO OUR MASK FTEMP5 <2AND GET NEXT BIT ; ; ^6 NOW FIND FILE/DIR FTEMP2 GETPATH ERR204 STORTYP#$00SET NO ALTERED BITS FTEMP5AS YET ^2 MOVE UP PTR FTEMP2EOF ARGS? >4YES, ERROR STACK,XGET CHAR #' 'A SPACE? >6YES, NOW GET PATH #$04COMPARE WITH VALID CHARS ^3 PROTABL,YSAME? >5YES, SET THE BIT  AUXIN SAVE 2ND S-REG FTEMP2 #$00ANY ARGS? >4NO, ERROR GET PTR TO ARGS  STACK,X #'-'REMOVE ACCESS? >1 #'+'ALLOW ACCESS? >4NO, ERROR #$00SET TO ALLOW  CDSKIP NEXT INST. ^1 #$FFSET TO REMOVE FTEMP4  ' 'SUBDIRECTORY HDR  'CMD'  'BAS'  'REL'  'SYS'  ' 'DENOTES A HEADER I.E . ; ; ; );CHMOD: ROUTINE TO CHANGE THE PROTECTION ; ON A FILE/DIR. SYNTAX IS ; CHMOD {+OR-}{r,w,x,n,d} ; CHMOD DISABLE INTS AUXINBRING IN AUX.MEM ALLOW INTS AND RETURN ; ; !PROTABL 'dnxwrxwr'PROTECTIONS ; ; FTYPE 000104060F75VALID  F0FCFEFF00FILETYPES ; TYPTABL 000306090C0FSTRING  1215181B1EPOINTERS ; !TYPTABL2 '???'FILETYPE STRINGS  'BAD'  'TXT'  'BIN'  'DIR' RGET NEXT BLK ZBLK NEXTPTR+1 ZBLK+1 ZBLKEOF DIRECTORY? NOERR203YES, END GETBLKELSE GET NEXT BLOCK ; "NOERR203#ETXFINISHED, SEND ETX COUT FTEMP2GET 2ND S-REG BACK  KILL ARGS SET NO ERROR AUXOUTAUX.MEM OUT NT A & X ; ;DO DATES LATER ; NEXTFIL CROUTPRINT A CR-LF NEXTFIL2MOVE UP PTR QPTR #$27 QPTR >4FIX MSB TOO !^3 PRTFILELSE PRINT FILE ^4 QPTR+1PAST BLK END? QPTR+1 /SYSBUF+$200 <3NO, PRINT NEXT FILE NEXTPTOOP &^1 TYPTABL,XGET PTR TO STRING #$03 #^2 TYPTABL2,YPRINT 3 CHARS COUT   <2 #$02PRINT 2 BLANKS PRBL2 #'$'PRINT A '$' COUT #$15GET LENGTH LSB (QPTR),Y INTO X-REG NOW MSB (QPTR),Y PRNTAXPRIL,XGET A CHAR FTEMP1PRINT IT? >8YES #'-'NO, PRINT '-' ^8 COUT LOOP 8 TIMES <7 #$02PRINT 2 BLANKS PRBL2 #$10GET FILE TYPE (QPTR),Y !#$0ACHECK AGAINST KNOWN TYPES ^9 FTYPE,X >1FOUND IT  <9ELSE L^6 FTEMP4LONG LISTING? NEXTFILNO, DO NEXT FILE  FTEMP1GET LENGTH BACK !#$0FFILL OUT NAME TO 20 CHARS #$02 OUTPUT BLANKS PRBL2 #$1EGET PROTECTION BYTE (QPTR),Y FTEMP1SAVE #$07PRINT OUT 8 CHARS ^7 PROTAB #$01ELSE SET 1 CHAR FTEMP1FOR NAME #'.'WHICH IS '.' COUTPRINT IT >6AND CONTINUE !^4 FTEMP1GET NAME LENGTH #$0FFINALLY! FTEMP1SAVE FOR LATER USE AS COUNTER ^5 OUTPUT NAME (QPTR),Y COUT  <5DONE F ZBUF+1 QPTR+1AND DSC PTR #FILETWO QPTR DDD ERR203ERROR, EXIT ; PRTFIL #$00GET FILE LENGTH (QPTR),Y FTEMP1SAVE #$F0IS IT DELETED? >3NO NEXTFIL2YES, DO NEXT FILE ^3 #$E0IS A HEADER? >4NO, PRINT NAME A PATH, GET MAX OFFSET GETPATHGET THE PATH >4OK, GO ON ERR203 FTEMP2ELSE KILL ARGS   ERR200AND EXIT ; '^3 CDTOBLKNO ARGS, SET UP ZBLK !^4 #READSET UP DISK READ ZCMD  ZBUFSET UP SYSBUF PTR GETBLK /SYSBU>3NO, SKIP GET PTR TO ARGS  STACK,X #'-'ANY OPTIONS? >1NO, SKIP GET OPTION STACK,X #'l'A 'l'? >1NO, IGNORE #$01SET UP LONG LIST FLAG FTEMP4 MOVE UP TO ANY PATH  FTEMP2EOF ARGS >3 ,^1 FTEMP2OK,";LS: ROUTINE TO LIST FILES IN THE !; CURRENT DIRECTORY. OPTIONS ARE ; -l: LONG LISTING. ; LS DISABLE INTERRUPTS AUXINBRING IN AUXINAUX.MEMORY !#$00SET SHORT LIST BY DEFAULT FTEMP4 SAVE 2ND S-REG FTEMP2 #$00ANY ARGS? 7****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 2 * * * ****************** ; ; ; ; CESS UKILL $D00FKILL PROCESS ; ; ; ;FILE SYSTEM ROUTINES ; ZGETMAP $D700 ZFINDFIL $D703 ZRENAM $D706 ZWRITBAK $D709 ZDELFIL $D70C ZMAKFIL $D70F ZREADFIL $D712 ; ; ; BYTE PRHEX $FDE3PRINT A NIBBLE PRERR $FF2DPRINT 'ERR' MON $FF69MONITOR ENTRY ; ; ; ;ZERO PAGE MONTOR LOC'NS ; CH $24PRINTING COLUMN ; ; ; ;KERNEL ROUTINES ; URSUME $D009RESUME PROCESS USUSP $D00CSUSPEND PRO; ;I/O ADDRESSES ; SETERR $FE93SET ERR OUTPUT ; ; ; ;SPECIAL CHARS ; CR $0DCR-LF ; ; ; ;OUTPUT & MONITOR ROUTINES ; PRNTYX $F940PRINT Y,X PRNTAX $F941PRINT A,X PRBL2 $F94APRINT BLANKS !PRBYTE $FDDAPRINT A HEX ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * CONFIGURATION * * * ****************** ; ; ; ;             KILL ALL ARGS   ERR202 ERR200AND EXIT ; ; ; IP KEYPTRSET UP PTR TO ZBLKTHE DIRECTORY KEYPTR+1 ZBLK+1 !^1 BLKTOCDSET UP NEW DIR FTEMP2GET 2ND S-REG TO KILL ALL ARGS  NOERR202AUXOUTAUX.MEM OUT SET NO ERRORS ENABLE INTS AND RETURN ; ; ^2 FTEMP2AT GIVEN IN THE ; ARGUMENTS. ; CD DISABLE INTS AUXINBRING IN AUXINAUX.MEM INC 2ND S-REG FTEMP2AND SAVE COPY TO A-REG GET 1ST ARG PTR  GETPATHGET THE PATH >2ERROR, EXIT STORTYPEIF AN INVALID >1FILDSC, SKR201 #PATHERRSET BAD PATH SET ERROR AND RETURN ; ; !^1 FTEMP3GET OFFSET BACK FTEMP2ANY MORE CHARS? ERR201YES, ERROR ^9 ELSE RETURN JSR BLKTOCD ELSEWHERE ; ; ; ;CD: PROCESS TO SET THE CURRENT !; DIRECTORY TO TH ; ^8 STORTYPEFILE A DIR? #$F0 #$D0 >1NO, CHECK NO MORE CHARS FTEMP3UPDATE OFFSET QPTRAND QPTR FTEMP2ANY MORE CHARS? >9NO, EXIT KEYPTRYES, SET UP ITS ZBLKKEYPTR IN ZBLK KEYPTR+1 ZBLK+1 <1AND LOOP ; ER8FOUND QPTRRE-INC QPTR ZBLKERR, ARE WE AT ROOT ZBLK+1 #$02 ERR201NO, EXIT ZDVCTRY OTHER DRIVE #$80 ZDVC FTEMP1RESET REGS QPTR START 1 BEHIND QPTR+1 ZFINDFIL !BC1 ERR201OK, A REAL ERR! QPTRRE-INC QPTR '/' ^6 FTEMP1  FTEMP2EOF CHARS? >7YES, GET LAST DSC STACK,XA DELIM? <6NO, LOOP SKIP DELIM !^7 FTEMP3SAVE NEW OFFSET FTEMP1GET LENGTH QPTRAND NAME PTR START 1 BEHIND QPTR+1 ZFINDFILFIND THE DIR >#'/'SET A-REG TO '/' ^4 MOVE UP PTR FTEMP2EOF CHARS? >9 STACK,XFOUND A DELIM? <4NO, KEEP LOOKING SKIP DELIM QPTR <1AND LOOP BACK BQ2 >9B.O.O.RANGE ; "^5 #$00A DSC, SET 0 CHARS FTEMP1 #'/'FIND ATACK+1,X2ND A '.'? >3NO, SKIP QPTRX CLOBBERED DDDWHEN GETTING QPTRHEADER BC1 DIRPNTGET PARENT PTR ZBLK DIRPNT+1 ZBLK+1 ZBLKNO PARENT? #$06 BQ1 ERR201ERROR, EXIT ; ^3 #$00SET BAD FILDSC STORTYPE SKIP QPTRYES, SKIP '/' #$02SET BLK TO ROOT ZBLK #$00 STORTYPE(AND FILDSC INVALID) ZBLK+1 #$60 ZDVC QPTRGET X BACK ; ^1 FTEMP2NO MORE CHARS? BQ2NO, LEAVE STACK,XGET 1ST CHAR #'.'A '.'? >5NO, SKIP SPATH QPTRSAVE PTR /STACK QPTR+1 FTEMP2SAVE MAX OFFSET #READSET READING ZCMD #SYSBUFSET UP BUF PTR ZBUF /SYSBUF ZBUF+1 CDTOBLKSET UP BLK & DVC QPTRSTART WITH 1ST CHAR STACK,XGET 1ST CHAR #'/'A '/'? >1NO, SOLUTE) PATH, INCLUDING . AND .. "; X HOLDS THE PTR TO THE START OF ; THE PATHNAME IN THE STACK. ; A-REG HOLDS MAX OFFSET+1. ; "; RETURNS THE FILDSC OF THE FILE, ; WITH ZBLK, MPTR & SYSBUF SET. ; IF NO FILDSC (. .. /) THEN ; STORTYPE IS ZERO. ; GETCROUTSEND A CR-LF PRERRPRINT 'ERR' #' 'PRINT A SPACE COUT GET THE ERROR CODE PRBYTEAND PRINT IT CROUTSEND A CR-LF SET SYSERROR <4AND EXIT ; ; ; &;GETPATH:FINDS THE SPECIFIED DIR/FILE ; ALONG THE GIVEN (RELATIVE OR %; ABM <4 "NOERR200#ETXSEND ETX TO OUTPUT COUT SET NO ERRORS ^4 AUXOUTKICK MEM OUT ALLOW INTS AND RETURN ; ^5 QPTR+1RESTORE STACK  ERR200 SAVE ERROR CODE #ETXOUTPUT AN ETX COUT SETERRSET ERROR OUTPUT IMITER ON DIRPNTGET PARENT PTR ZBLK DIRPNT+1 ZBLK+1 <1AND LOOP ^3 QPTRDID WE START #$01AT ROOT? >4NO, SKIP #'/'SEND A DELIM COUT(START OF PATH) ^4 NOW PULL OFF COUTALL CHARS, AND OUTPUT QPTRTHEHEADER? #$02 >3YES, EXIT DDDELSE GET THE HEADER BLK >5ERROR, EXIT BLOCKIDGET BLOCKID #$0FGET NAME LENGTH USE AS OFFSET  QPTRADD TO PATH LENGTH QPTR (^2 DIRNAM-1,XSAVE NAME ON STACK   <2 #'/'PUSH DELSET UP 0 CHARS ZBUFAND LSB OF BUFFER CDTOBLKCONVERT CURDIR TO BLK #READREAD THE BLOCK ZCMD QPTRAND SET QPTR TO 1 #CRSAVE A CR-LF AS LAST CHARACTER /SYSBUFSET UP BUFFER ZBUF+1 ^1 ZBLKARE WE AT THE ZBLK+1VOLUME DONE ; ; ; (;PWD: FINDS THE CURRENT DIRECTORY NAME, (; AND PASSES IT TO THE STANDARD OUTPUT. "; USES ZPG DIRECTORY PTR CURDIR. ; PWD DISABLE INTS IGNORE ANY ARGS QPTR+1SAVE IN CASE OF ERROR AUXINBRUNG IN AUX.MEM AUXIN #$00 SAVE SHIFT BACK ZDVCSAVE DEVICE #$00 NOW GET MSB OF BLOCK  ZBLK+1 DONE ; ; ; ";BLKTOCD: CONVERTS ZBLK & ZDVC TO ; CURDIR ; BLKTOCD ZDVCGET DEVICE ZBLK+1ADD BLK MSB CURDIR+1SAVE ZBLK& COPY LSB CURDIR ;  "map"  00  MAP ; "kill"  00  KILL ; "halt"  00  HALT ; "start"  00  START ; ; ; ";CDTOBLK: CONVERTS CURDIR TO ZBLK ; AND ZDVC ; CDTOBLK CURDIRCOPY OVER LSB ZBLKOF ZBLK CURDIR+1GET DVC & MSB PUSH OUT MSB MON ;  "pwd"  00  PWD ;  "cd"  00  CD ;  "ls"  00  LS ; "chmod"  00  CHMOD ;  "rm"  00  RM ;  "mv"  00  MV ; "date"  00  DATE ; "mkdir"  00  MKDIR ;  "df"  00  DF ;  "ps"  00  PS  $E800  $800 ; ; $;POINTERS USED BY OTHER ASSEMBLIES. ; ZCDTOBLKCDTOBLK ZGETPATHGETPATH ZDECHEX DECHEX GETPATH GETPATH  00 %;AVAILABLE PROCESS LIST. WILL ALWAYS ; BE AT $E810. ; PLIST "mon"  00  MONFOR NOW  "at"  00 9****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 1 * * * ****************** ; ; ; ;      ON TIME DATEFIL DISABLE INTS FTEMP2SAVE 2ND S-REG BEFORE MAKFIL ZBLKGET DIRECTORY PTR ZBLK+1IN X,Y ZMAKFILMAKE THE SUBDIR RETIREVE S-REG FTEMP2 <1ERROR NOERR203ELSE FINISHED ; ; ; LENGTH USE AS OFFSET #$D0SET STORTYPE=SUBDIR STORTYPE QPTRSHIFT PTR DOWN 1 "^3 (QPTR),YCOPY OVER NAME STORTYPE,Y  <3 #$0FSET FILETYPE=SUBDIR FILTYPE #$01SET ONE BLOCK BLOCKS #CRTIMESET UP /CRTIMECREATIAUXIN SAVE 2ND S-REG FTEMP2 USE IN GETPATH  GET ARGS PTR GETPATHFIND PATH >2ERROR, GOOD #EXERRELSE ALREADY EXISTS ^1 ERR203EXIT %^2 #PATHERRCOULDN'T FIND IT? <1NO, SOME OTHER ERROR FTEMP1GET FINAL NAMEGE MEM OUT SBANK2 #$03PULL DATE ^2 (QPTR),YAND SAVE  <2 SET NO ERRORS ALLOW INTS AND RETURN ; ; ; %;MKDIR:PROCESS TO CREATE A DIRECTORY ; AT THE GIVEN PATH. ; MKDIR DISABLE INTS AUXINBRING IN AUX.MEM SAVE POINTER QPTR+1 #MEMINGET SYS.DATE ON STACK SBANK2 MONTHFIRST MONTH SHIFTED TO RIGHT SPOT    DAYHIPLUS DAY  YEARNOW YEAR WITH A MONTH BIT  CLOCKHINOW MINUTES  DAYLOFINALLY HOURS  #MEMOUTPAATE. X,Y POINT TP ; PRODOS TIME FIELD. ; #;*N.B PRODOS TIME FIELD (4 BYTES): ; mmmddddd yyyyyyym ; 00mmmmmm 000hhhhh ; ;SYSTEM DATE (6 BYTES) ; 0yyyyyyy 0000mmmm ; 000ddddd 000hhhhh ; 00mmmmmm 00ssssss ; DATEFIL DISABLE INTS QPTRA-REG. Y,A CLOBBERED. ; DECHEX FIRST CONVERT BOTH TO 0-9 #$0F   #$0F NOW ADD ON Y*10 MULTEN,Y AND RETURN ; MULTEN 000A141E28*10 TABLE 323C46505A ; ; ; (;DATEFIL:ROUTINE TO CONVERT SYSTEM DATE $; TO PRODOS FILE D10,100 ADD 1 TO COUNT <2UNTIL IT IS LESS ^3 SAVE INPUT GET COUNT #$B0CONVERT TO CHAR COUTPRINT LETTER  AND LOOP <1  ; ; HTDTABL 010A641,10,100 ; ; ; &;DECHEX: CONVERTS CHARS IN Y,A TO HEX &; VALUE 0-99 IN A-REG IN (; DECIMAL (3CHARS). ALL REGS CLOBBERED. ; HEXDEC2 PRINTS 2 CHARS. ; HEXDEC #$02PRINT 3 CHARS  C0SKIP INST. HEXDEC2 #$01ONLY 2 CHARS ^1 #$00SET COUNT TO 0 %^2 HTDTABL,YIS A > 1,10,100? >3 HTDTABL,YSUBTRACT 1,E D,M,Y  >7PAST YEAR, SKIP  MOVE UP PTR  <6 ; !^7 QPTR+1DONE, KILL ARGS  <1AND EXIT ; ; ; ML1 "JFMAMJJASOND"MONTH !ML2 "AEAPAUUUECOE"LETTERS ML3 "NBRRYNLGPTVC" ; ; ; #;HEXDEC: ROUTINE TO PRINTAST SECONDS? #$03 >4YES, SKIP  MOVE UP PTR  <3 ^4 #' 'SKIP ANY SPACES ^5 STACK,X <5 #$02OFFSET FROM YEAR ^6 QPTR STACK,XGET 2 DIGITS STACK+1,X DECHEXCONVERT TO HEX QPTR YEAR,YSAVNK2 SET NO ERRORS ALLOW INTS AND RETURN ; ^2 QPTR+1SAVE 2ND S-REG GET ARGS PTR  #$00POINT TO DAYLO ^3 QPTR STACK,XGET 2 DIGITS STACK+1,X DECHEXCONVERT TO HEX QPTRGET OFFSET DAYLO,YSAVE H,M,S PHEXDEC2 #"-" COUT MONTHUSE MONTH AS OFFSET ML1-1,XGET 1ST LETTER COUT ML2-1,X COUT ML3-1,X COUT #"-" COUT YEARFINALLY YEAR HEXDEC2 CROUTA CR-LF ^1 #ETXSEND ETX COUT #MEMOUTPAGED MEM OUT SBAIN PAGED MEM SBANK2 #$00ANY ARGS? >2YES, SKIP DAYLOPRINT OUT HOUR HEXDEC2 #":"PLUS A COLON COUT CLOCKHIAND MINUTES HEXDEC2 #":" COUT CLOCKLOAND SECONDS HEXDEC2 #$02PRINT 2 SPACES PRBL2 DAYHINOW DAYS LE "^2 FTEMP4PUT 2ND S-REG IN FTEMP2FTEMP2 <4ERROR, EXIT NOERR203AND FINISH ; ; ; &;DATE:PROCESS TO DISPLAY AND SET DATE ; IF SETTING DATE, FORMAT IS %; date {hh}:{mm}:{ss} {dd}/{mm}/{yy} ; DATE DISABLE INTS #MEMINBRING OF 1ST NAME STACK,X #' 'TERMINATED BY A ' ' <1 USE IN GETBUF GET BACK ARG PTR  GETPATHFIND FILE >2ERR, EXIT GET 2ND NAME LEN FTEMP4 FTEMP2 #$0FONLY 15 CHARS FTEMP2LOAD PTR TO NAME /STACK ZRENAMRENAME FI";MV: PROCESS TO REMANE A FILE/DIR #; N.B WONT COPY ACROSS DIRECTORIES ; ^4 <4B.O.O.RANGE MV DISABLE INTS AUXINBRING IN AUXINAUX.MEM #$00ANY ARGS <4NO, EXIT  FTEMP4SAVE 2ND S-REG GET ARGS PTR ^1 FIND E****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 3 * * * ****************** ; ; ; ;        INC 2ND S-REG  GET ARGS START  SAVE 2ND S-REG ON STACK GETPATHGET FILE'S PATH ERR204 ZDELFILDELETE IT GET S-REG, DELFIL USES FTEMP2FTEMP2 ERR204 NOERR203FINISHED! ; ; ; ROM ACCESS <7AND REWRITE IT ; ; PROTABL2 8040040201 ; (;PROTABL2 CONVERTS PROTABL TO BIT POS'N ; ; ; %;RM:PROCESS TO REMOVE NAMED FILE/DIR ; RM DISABLE INTS AUXINBRING IN AUX.MEM AUXIN #$00ANY ARGS? <4NO, EXIT (SYNERER)GOT IT,NEW ACCESS? >8REMOVE IT FTEMP5GET OUR MASK FILACCESADD IT TO ACCESS !^7 #$1EREPLACE IN SYSBUF (MPTR),Y ZWRITBAKAND WRITE IT BACK ERR204 NOERR203AND FINISHED! ; !^8 FTEMP5INVERT THE MASK FILACCESREMOVE Fz#  ǠŠ̮ʠ̱à ̲à̳à  ͮǠǮà"Ͳà Ͳʠ Ԯà"Ԯʠ  бàвà гà дà  Юʠ  ̮Ǡ Ůʠ̠ ̠ ˠ ֠ЮǠĠ IJ ŮǠ űà ŲàųàŴà*h`8LխӅ:HhHh Ո թ թ ՘VYҪҦ>:Y)Ң`;R?AJ;<ȰY)Ң`Y?)Ң`ȐҰ ;HhHh=Ң`Hh `Hh`DEiȍ0` ZԍsԍԍԍԥDEԌ8TԌ8WpԌqԠ 7I꽌ɪ꽌ɭ蠪:љVE:8`]ѾV]H)]ѾV]ҙ)]ѾT]ҙ)] >8hUD` ԝY`> Hh݌(`HCJJJJ)0($ p,&"op8`kkV꽌ɪɖxlӽ*kӽ-kәmMlӈ 꽌ɪ`8>*L o % ԽYӍZӭoӝY 3Ѡ шNZ`rZLkӭZӍq8r7IZӐiZkӐk 8 ѹs ӭq ѹ| kн Z)*>>` @ $(,048<@DHLPTX\`dh 0ުlptx| P ְ $H 8h Ei 8EX`'8` .Vӈ  JJJJ`jӍWӥC)p> pӥCYӍY 轊( ( ӈBV ( ӭp0 \BkJ ՠ@iӦ> Ӑi'j:ZH i@ioZZH h ѐȭnWǥBJ Ӱ8XӦ>` Ր+֌18V%֌&8V֌֠)HV)hH)hHIhդD?DRIDQD)҅; ?JDQD]ՎՎՎ`MY pӭY)p  ӭp`C)`BFGV 8``*h`8LխӅ:HhHh Ո թ թ ՘VYҪҦ>:Y)Ң`;R?AJ;<ȰY)Ң`Y?)Ң`ȐҰ ;HhHh=Ң`Hh `Hh`DEiȍ0` ZԍsԍԍԍԥDEԌ8TԌ8WpԌqԠ 7I꽌ɪ꽌ɭ蠪:љVE:8`]ѾV]H)]ѾV]ҙ)]ѾT]ҙ)] >8hUD` ԝY`> Hh݌(`HCJJJJ)0($ p,&"op8`kkV꽌ɪɖxlӽ*kӽ-kәmMlӈ 꽌ɪ`8>*L o % ԽYӍZӭoӝY 3Ѡ шNZ`rZLkӭZӍq8r7IZӐiZkӐk 8 ѹs ӭq ѹ| kн Z)*>>` @ $(,048<@DHLPTX\`dh 0ުlptx| P ְ& .Vӈ  JJJJH 8h Ei 8EX`'8`jӍWӥC)p> pӥCYӍY 轊( ( ӈBV ( ӭp0 \BkJ ՠ@iӦ> Ӑi'j:ZH i@ioZZH h ѐȭnWǥBJ Ӱ8XӦ>` Ր+     MONITOR JUMP ; ; ; ABLE INTS #MEMINBRING IN SBANK2PAGED MEM PSTATE,XGET STATE #PRREADYPROCESS READY? >6NO, RESTART SHELL USTPELSE STOP OURSELVES <5AND LOOP ^6 CROUTSEND A CR-LF ALLOW INTS SHELLAND LOOP FOR INPUT ; MONJ1 MONH RETURNS >3 ^2 #$00 ^3 NAME,Y   #$08NO MORE THAN 8 CHARS <1 UCTECREATE PROC SERR2 URDYSET READY SERR2 ^4 STEMP2GET DELIMITER LINBUF,Y #"&"WAS IT AN "&"? >6YES, JUMP TO SHELL ^5 DISDD 1 TO ARGS #$7FKILL BIT 7 NARGS,YSAVE ARG GET NEXT ARG, INCL. SPACES STEMP2 >9 LINBUF,X <8 ; !^9 NARGSSAVE NO. OF ARGS STEMP1SET UP NAME #$00 ^1 LINBUF,X #" "REPLACE SPACE WITH 00 >2 #$8DSAME WITP TO IT SKIP THE ZERO PLIST,YSET UP ADDRESS PROCADDR  PLIST,Y PROCADDR+1 ANYPROC #$01 PRIORITY #$00SET 0 ARGS ^7 STEMP2EOF 'PROC'? >9YES LINBUF,XGET AN ARG #" "A SPACE? <7YES, SKIP IT ^8 A AUXINBRING BACK DOS AUXIN AUXPTRMEM FREE, LOAD FILE AUXPTR+1 ZREADFILDONE AUXOUTREMOVE AUX.MEM STEMP3GET PTR TO ARGS ANYPROCAND CREATE PROCESS SERR2 SERRELSE AN ERROR ; ; SHPROC #$03IS IT 'mon'? MONJ1YES, JUM STATIC ADDRESS, CALC AUXPTRADDRESS RANGE BY PROCADDR ENDPTRADDING START AND PROCEND AUXPTR+1LENGTH PROCADDR+1 ENDPTR+1 PROCEND+1 AUXOUTKICK OUT DOS VMEMFREEIS THAT MEMORY FREE SERR2NO, ERROR STILL DISK ACCESS+1 ZREADFILREAD FILE AUXOUTKICK AUX.MEM OUT SERR2ERR, EXIT PROCADDRSET UP START NOW, AS STARTIT CLOBBERS ZDVC PROCADDR+1 START+1OK, NOW RELOCRELOCATE THE FILE STEMP3GET PTR TO ARGS ANYPROCAND CREATE PROCESS ; BIN BACK DOS AUXIN AUXIN !PROCADDR+1YES, SAVE START MSB  ADD LENGTH STEMP4TO GET END MSB PROCEND+1  AUXPTR+1GET ORIGINAL END MSB ORIG+1 STEMP4BY ADDING LENGTH END+1FOR RELOCATOR PROCADDRGET ADDR TO LOAD PROCADDRF GONE OVER A PAGE. ENDPTR PROCENDSET UP END LSB FOR ENDRELOCATOR AS WELL $ENDPTR+1PAGES=LENGTH MSB + CARRY #$00 STEMP4SAVE LENGTH  ADD 1 FOR MEMBLK AUXOUTKICK AUX.MEM OUT UMEMBLKA FREE BLOCK? SERR2NO, EXIT BRINGZGETPATHFIND FILE ON DISK SERR FILTYPECHECK TYPE #$FFA SYS FILE? BIN #$06A BIN FILE? BIN #$FEA REL FILE? SERRNO, ERROR REL CALC NEW END LSB "AUXPTRBY ADDING START & LENGTH PROCADDRLSB. CARRY INDICATES ORIGIK+1,XSAVE ON STACK FOR GETPATH NEXT CHAR STEMP2AT DELIM? <2NO, LOOP ^3 A=MAX.OFFSET+1   SAVE END OF NAME STEMP3FOR LATER DISK ACCESS, DISABLE INTS AUXINBRING IN AUX.MEM AUXIN STEMP1GET START OF NAME  SKPROCELSE LOOK ON DISK ; ^5 PLIST,YGET NEXT 0 CHAR <5 SKIP 00 AND ADDRESS   <3TRY AGAIN ; #DISKPROCSTEMP1FIND PROCESS NAME ^2 LINBUF,XGET CHAR #" "A SPACE? >3YES, EOF NAME #$7FTURN BIT 7 OFF &STACMP2SAVE END OF 'PROC' #$00SET Y TO 0 ^3 STEMP1GET X-REG ^4 PLIST,YGET A CHAR LINBUF,XSAME AS INPUT? >5NO, A NEW 'PROC'  PLIST,YGET NEXT CHAR A0, FOUND A SHELL PROC SHPROC A ELSE MATCH AGAIN <4 DI֌18V%֌&8V֌֠)HV)hH)hHIhդD?DRIDQD)҅; ?JDQD]ՎՎՎ`MY pӭY)p  ӭp`C)`BFGV 8`` $305PROCESS NAME NARGS $30DNO. OF ARGUMENTS ; ; ; ;PROCESS NAMES BASE ADDRESS ; NAMELIST $5900 ; ; ; ;WAIT QUEUE CONSTANTS ; NSEM $20NO. OF SEMAPHORES 'WAITHEAD $5B00+5+NSEM*5HEAD OF SEM Q #WAITTAIL WAITHEAD+5TAIL OF SEM Q ER BUSY FLAG !SETTXT $FB39SET UP FULL TEXT TABV $FB5BDO A VTAB "SETPWRC $FB6FSET POWER-UP BYTE ; ; ; ;PARAMETERS FOR CREATE ; PROCADDR $300PROCESS ADDRESS %PROCEND $302PROCESS 'END' ADDRESS PRIORITY $304PROCESS PRIORITY NAME SE BUF $4000KEYBOARD BUFFER ; ; ; ;MONITOR ROUTINES & ABSOLUTES ; SOFTEV $3F2RESET VECTOR IRQV $3FEIRQ VECTOR KYBD $C000KEYBOARD INPUT KYBDSTRB $C010KEYBOARD STROBE LPROUT $C090PRINTER ADDRESS "LPRBUSY $C1C1PRINTONTH YEAR+1MONTH DAYHI MONTH+1DAYS DAYLO DAYHI+1HOURS CLOCKHI DAYLO+1MINUTES CLOCKLO CLOCKHI+1SECONDS ; ; ;MEMORY CONSTANTS ; ; ; ; ;MISCELLANEOUS ; #NPROC $10MAX NO. OF PROCESSES 'PROCBASE $6000ZPG & STACK STORE BABUFS WE GET FROM ; ; ; ;SYSTEM VARIABLES ; #CURRPID $58E0ID OF CURRENT PROC 'NUMPROC CURRPID+1CURNT NO. OF PROCS !TIKCNT NUMPROC+1TICK COUNTER !CLKCNT TIKCNT+1CLOCK COUNTER DUMMY1 CLKCNT+1DUMMY BYTE YEAR BUFCNT+1YEAR BYTE MAGS 'PTIML PHASMSGL+NPROCLIST OF SLEEP 'PTIMH PTIML+NPROC TIMES FOR PROCS $PARGS PTIMH+NPROCNO. ARGUMEMTS $PADDRL PARGS+NPROCLIST OF START "PADDRH PADDRL+NPROC ADDRESSES 'PBUFIN PADDRH+NPROCBUFS WE SEND TO (PBUFOUT PBUFIN+NPROCAD $5A00+5+NPROC*5READY HEAD NODE %RDYTAIL RDYHEAD+$5READY TAIL NODE ; ; ; ;PROCESS TABLE ; $PSTATE $5800LIST OF PROC STATES *PPRIO PSTATE+NPROCLIST OF PRIORITIES 'PMSGL PPRIO+NPROCLIST OF MESSAGES $PHASMSGL PMSGL+NPROCMESSAGE FLR MESG PRSLEEP $05SLEEPING PRSUSP $06SUSPENDED !PRWAIT $07ON SEMAPHORE QUEUE ; ; ; ;ZPG REGISTER STORES ; REGA $09 REGP $1A REGS $1B REGX $1C REGY $1D PC $1E ; ; ; ;READY QUEUE CONSTANTS ; *RDYHEITOR A-REG STORE ; ; ; ;QUEUE CONSTANTS ; MININT $00MIN KEY IN QUEUE MAXINT $20MAX KEY IN QUEUE ; ; ; ;PROCESS STATES ; PRCURR $01CURRENTLY RUNNING PRFREE $02SLOT IS FREE PRREADY $03ON READY QUEUE PRRECV $04WAITING FO ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * KERNEL CONFIG * * * ****************** ; ; ; ;ZERO PAGE VARIABLES ; "ACC $45MON   ϠűÍРŲÍРųÍРŴÍŮÍРŮǍРͮǍ m=Hm> RаxGH ׭L/{ȹȹɠ) 0 ɠɍ а аɦx}X L XLLiLL੥3 jɡ ɾɼɦɍ歀X LȹL2 ȹݦɠ )ʆx 谤8eaЕG>i譀 UаsxeH=e? ׭JBC LDG K   FTEMP1 $^4 SYSBUF+$100,XGET A BLOCK SYSBUF,X  REMBLKDEALLOCATE IT FTEMP1DO NEXT BLOCK FTEMP1 <4 SYSBUF+$100NOW FIRST BLOCK SYSBUF LASTBLK REMBLKDONE SAVMAP #$06READ THE BIT MAP ZBLK #$00 ZBL0A SUBDIRECTORY? SUB1 #$20A SAPLING? SAP1 #PANERRELSE PANIC!! ERR104 AND EXIT  ; ; SAP1 KEYPTRDEALLOCATE THE ZBLKINDEX BLOCK KEYPTR+1 ZBLK+1 REMBLKAND NOW READ IT DDD ERR104 BLOCKSSTART WITH LAST BLOCFILE CNT FILCNT #$FF >3 FILCNT+1 ^3 FILCNTNO FILES LEFT? FTEMP2SAVE RESULT ZCMDOK, WRITE THE HEADER DDD ZCMD ; ; ; FREEBLKSGETMAPGET THE BITMAP STORTYPEGET STORE TYPE #$F0 #$10A SEEDLING? SEED1 #$D(MPTR),YDONE BLOCKIDTHIS THE HEADER BLK? #$E0 #$E0 >2YES, SKIP ZCMDELSE SAVE DELETED DESC DDD ZCMD ERR104 HDRPTRGET HEADER POINTER ZBLK HDRPTR+1 ZBLK+1 DDDAND GET HEADER ERR104 ; "^2 FILCNTDEC THE THE FILE IN THE ; MAIN FILE DESCRIPTOR. ; *N.B: FINDFIL JUST CALLED #; FTEMP2=0 IF NO FILES LEFT IN DIR ; DELFIL FILACCESGET ACCESS #$80DELETABLE? >1YES #DELERRNO, SET ERROR ERR104AND EXIT ; !^1 #$00DELETE FILE DESC.  ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * PART 2 * * * ****************** ; ; ; ; ; !;DELFIL:DELETES $F660FILE SEARCH PATH #CURDIR $F680CURRENT DIRECTORY ; ; ;  !; ;I/O CONSTANTS &c ; $ETX $03END OF TEXT CHARACTER ESC $1BESCAPE CHARACTER ; ; ; ;AVAILABLE MEMORY MAP ; MEMLIST $5F00 ; ; ; ;DOS EQUS & SCRATCH SPACE ; BUFCNT $F64FKYBD BUF PTR KYBDPTR $F650PROC'S KBD PTR !PATH ; ; ; ;MONITOR ROUTINES & ABSOLUTES ; %STACK $100BASE ADDRESS OF STACK SBANK2 $C07DBANKSWITCH I/O !HOME $FC58CLEAR THE SCREEN CROUT $FD8EOUTPUT CR-LF $COUT $FDEDMONITOR CHAR OUTPUT #COUT1 $FDF040-COL TEXT OUTPUT ; ; UE POINTER MPTR $FCTEMP POINTER TPTR $FETEMP POINTER ; ; ; ;MEMORY CONSTANTS ; MEMIN $02MEMORY IN BYTE MEMOUT $01MEMORY OUT BYTE AUXIN $C08BAUX.MEMORY IN AUXOUT $C080AUX.MEMORY OUT WRITMEM $C083LANG.CARD WRITE H****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SYSTEM CONFIG * * * ****************** ; ; ; ;ZERO PAGE VARIABLES ; QPTR $FAQUE  BUFFER FREE BLIMBO $FFBUFFER IN LIMBO #BUFBASE $4000BUFFER POOL'S BASE ; ; ; ;I/O CONSTANTS &c ; ; ; ;AVAILABLE MEMORY LIST ; MEMLIST $5F00 ; ; ;  TBUF INBUF+NBUFOUTPUT PTRS ; BFREE $00BUFFER FREE BLIMBO $FFBUFFER IN LIMBO #BUFBASE $4000BUFFER POOL'S BASE ; ; ; **ASE $4000BUFFER POOL'S BASE ; ; ; 4000BUFFER POOL'S BASE ; ; ; 000BUFFER POOL'S BASE ; ; ; $00 ; ;NULL PROCESS INFO ; NULL $E000I.E THE SHELL NULLPID $00PROCESS ID NULLPRIO $01PROCESS PRIORITY ; ; ; ;BUFFER LISTS ETC ; NBUF $10MAX NO. OF BUFS 'BUFLIST RDYTAIL+5LIST OF OWNER PIDS "INBUF BUFLIST+NBUFINPUT PTRS !OU(SEMLIST WAITTAIL+5LIST OF SEM STATES *SEMCNT SEMLIST+NSEMLIST OF SEM COUNTS ; SFREE $00 #SUSED $FFSEM STATES-FREE&USED ; ; ; ;CLOCK CONSTANTS ; 'TIKNO $08NO. IRQ'S BEFORE RESCHED *CLKNO $03NO. RESCHEDS BEFORE CLK INC ; ; IN THE REQUIRED ); DIRECTORY (HELD BY X,Y) OF THE PARTIAL $; FILE DESCRIPTOR. MUST HAVE SET UP ; - NAME_LENGTH ; - NAME -FILETYPE ; - EOF -CREATION ; - AUX_TYPE ; MAKFIL HDRPTRSAVE DIRECTORY HDRPTR+1POINTER VERSIONSE TO OFFSETS FTEMP5 +^5 FTEMP1START WITH 1ST NEW OFFSET ADDBLKGET A NEW BLK  FTEMP1GET OFFSET SYSBUF,XSAVE NEW BLOCK  SYSBUF+$100,X FTEMP5NEW & OLD SAME? <5NO, LOOP FINALLY RETURN ; ; ; (;MAKFIL: CREATES A FILEE BLK FTEMP1MOVE OFFSET DOWN FTEMP1OLD & NEW THE SAME? FTEMP5 <1NO, KEEP DEALLOCATING #$00FINALLY, CLEAR REST OF FTEMP5I-BLK  ^2 SYSBUF,X SYSBUF+$100,X  <2 ^3 AND RETURN ; ; '^4 FTEMP1RESET BOTH ; +CNGBLKS FTEMP5COMPARE OLD & NEW OFFSETS FTEMP1 >3SAME, EXIT >4BIGGER, ALLOCATE MORE BLKS FTEMP1RESET BOTH TO OFFSETS FTEMP5 FTEMP1ELSE, GET OLD OFFSET !^1 SYSBUF,XGET BLOCK PTR SYSBUF+$100,X  REMBLKDEALLOC THS THE BLOCKS ALLOCATED ; TO A SAPLING FILE. #; INPUT - SYSBUF HOLDS OLD I-BLOCK (; - BITMAP HAOLDS CURRENT BIT MAP ); - FTEMP1 HOLDS NO. OLD DATA BLKS ); - FTEMP5 HOLDS NO. NEW DATA BLKS 2; **N.B: SEEDLING OFFSET IS #$00, I.E 0 DATA BLKS****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * PART 3 * * * ****************** ; ; ; ; ; ';CNGBLKS; CHANGE     FTEMP1ONLY ONE LEFT? <3NO, KEEP GOING SYSBUF,XSET UP LAST BLK PTR ZBLK SYSBUF+$100,X ZBLK+1 #$00SET UP OFFSET INTO QPTRSYSTEM BUFFER  ENDPTR+1 #$01 /SYSBUF QPTR+1 ZBUFSET UP OFFSET MPTRINTO MAIN MEMORY ADDRESS ZBUF FTEMP3 ZBUF+1 #$00SET UP OFFSET INTO FTEMP2INDEX TABLE !^3 SYSBUF,XGET BLOCK NO. ZBLK SYSBUF+$100,X ZBLK+1 DDDGET IT RTS2 RTS1 ZBUF+1MOVE UP BUFPTR ZBUF+1 FTEMP2GET NEXT BLOCK FTEMP2  ENDPTR+1GET EOF MSB DIV BY 2 FTEMP1SAVE AS BLK COUNT FTEMP2SAVE BASE ADDRESS FTEMP3 KEYPTRGET INDEX BLOCK ZBLK KEYPTR+1 ZBLK+1 #SYSBUFINTO BUFFER ZBUF /SYSBUF ZBUF+1 DDDGOT IT ERR105 FTEMP2NOW SET UP <1 (QPTR),YCOPY BYTE 0 TOO! (MPTR),Y MPTR+1MOVE DOWN PTRS QPTR+1 QPTR+1 /SYSBUFFINISHED? >3YES, LEAVE &^2 (QPTR),YNO, COPY LAST PAGE (MPTR),Y  <2 ^3 SET NO ERROR RTS1 AND RETURN ; ; SAP2 NTO BUFFER QPTR+1 KEYPTRGET THE ONLY DATA ZBLKBLOCK KEYPTR+1 ZBLK+1 "LASTONE #SYSBUFINTO THE BUFFER ZBUF /SYSBUF ZBUF+1 DDDGET LAST BLOCK ERR105 ENDPTRGET OFFSET  #^1 (QPTR),YCOPY OVER BYTES (MPTR),Y F0 #$20A SAPLING? SAP2YES #$10A SEEDLING? SEED2YES #TYPERRELSE BAD FILE TYPE ERR105 EXIT  ; ; !SEED2 MPTRSAVE BASE ADDRESS MPTR+1 #$00SET UP PTR TO OUR BUFFER QPTR  ENDPTR+1GET EOF PTR /SYSBUFOFFSET IEADFIL: READS THE FILE IN THE FILE %; DESCRIPTOR. X,Y HOLD START ADDRESS ; READFIL FILACCESGET ACCESS #$04EXECUTABLE? >1YES #EXECERRNO, SET ERROR ERR105AND EXIT ; ^1 #READSET READING ZCMD STORTYPEGET STORAGE TYPE #$TR+1 ZBLK+1 DDD ERR104 ^1 ZBLKDEALLOC THE BLK ZBLK+1 REMBLK NEXTPTRNOW GET NEXT BLK ZBLK NEXTPTR+1 ZBLK+1 ZBLK SAVMAPALL DONE, SAVE MAP DDDELSE GET BLOCK <1AND DEALLOCATE IT ERROR, RETURN ; ; ; %;RK+1 DDDGOT IT #$27COPY THE MAP BACK !^5 BITMAP,XTO THE BUFFER SYSBUF,X  <5 WRITBAKAND PUT BACK ON DISK ; ; SEED1 KEYPTRDEALLOC THE KEYPTR+1ONLY BLOCK LASTBLK ; ; SUB1 KEYPTRGET THE HEADER ZBLK KEYPKEYPTR+1 ZBLK+1 DDDDONE ERR108 ^5 BLOCKSSET UP CURRENT BLOCKS FTEMP5 #CNGBLKSADD/DEL BLOCKS AS NEEDED &^9 WRITFILNOW JUST WRITE FILE ; ; ; $10NOW A SEEDLING? <9NO, ERROR ; #$01SET NO CURRENT BLKS BLOCKSAND DEALLOC BLOCKS SAP4 ; ; #^4 CLRBUFCLEAR INDEX BLOCK #$00AND NO OLD BLKS FTEMP1 >5SET UP CURRENT BLKS ; ; !SAP4 KEYPTRGET INDEX BLOCK ZBLK PEYES, HANDLE IT #$F0 #$20A SAPLING? SAP4 #$10A SEEDLING? SEED4 )^9 #TYPERRELSE SET BAD FILE TYPE ERR108AND EXIT ; ; "SEED4 WRITFILJUST WRITE FILE ; ; NEWTYPE #$F0NEW TYPE OF FILE #$20NOW A SAPLING? >4 #^2 FILDSC,YAUX_TYPE & LAST_MOD (MPTR),Y  #$1E <2 #$17NOW BLOCKS & EOF ^3 FILDSC,Y (MPTR),Y  #$12 <3 WRITBAKWRITE NEW DSC BACK ERR108 COPYDSCAND COPY ALL BACK STORTYPE FILE TYPE CHANGED? NEWTY WITH ERROR  ; ; (^1 #$13BEFORE WE CHECK STORTYPE (MPTR),YSET UP OLD BLK CNT FTEMP1IN FTEMP1 FTEMP1 #$00HAS FILE TYPE CHANGED? STORTYPE (MPTR),Y SAVE FOR LATER (MPTR),YSAVE NEW STORTYPE #$24COPY OVER NEW INFO 'T UP HDR PTR ZBLK HDRPTR+1 ZBLK+1 STORTYPEAND CHECK TO SEE IF #$0FIT ALREADY EXISTS #FILNAM-1 /FILNAM-1 FINDFIL2 >1ALREADY EXISTS, OVERWRITE #FILERRCOULDN'T FIND IT? ERR108 MAKFILNO, CREATE ONE ERR108 ELSE EXITORTYPENOW SET UP STORTYPE #$0F BLOCKSONY 1 BLOCK? #$01 >2YES, A SEEDLING BLOCKSADD 1 FOR I-BLOCK #$20SET AS SAPLING >3 "^2 #$10ELSE IS A SEEDLING ^3 STORTYPESAVE FINALLY GETMAPNOW GET DISK MAP HDRPTRNOW SE - LAST_MOD ; SAVFIL HDRPTRSAVE DIR PTR HDRPTR+1 #$00SET BLOCKS MSB BLOCKS+1TO 0  ENDPTR+1GET FILE LENGTH #$01ADD 1 DIV BY 2 BLOCKSSAVE AS BLOCKS >1 ENDPTRIF LSB <>0 >1 BLOCKSADD ANOTHER BLOCK '^1 STITFILELSE WRITE FILE ; ; ; &;SAVFIL: SAVES A FILE IN THE REQUIRED ); DIRECTORY (HELD BY X,Y) OF THE PARTIAL *; FILE DESCRIPTOR, WHICH MUST HAVE SET UP !; - STORTYPE - NAME_LENGTH ; - NAME - FILETYPE ; - EOF - AUX_TYPE ; 107 STORTYPENOW IF NOT A SAPLING #$F0 #$20 >3 #WRITFILTHEN WRITE THE ONLY FILE ; &^3 CLRBUFELSE ALLOCATE BLOCKS BLOCKS FOR THE FILE FTEMP5SAVE NO. BLOCKS #$00SET NO OLD BLKS FTEMP1 CNGBLKSALLOCATE BLOCKS WRFTEMP2 ZBLK+1 #FILETWOPOINT TO 1ST DSC MPTR /FILETWO MPTR+1 ; ^9 #$26COPY OVER DSC ^1 FILDSC,YTO DIR BLK (MPTR),Y  <1 FILCNTADD 1 TO FILE >2COUNT FILCNT+1 %^2 WRITBAKSAVE BLOCK TO DISK ERR EXIT ; #^8 NEXTPTRADD PTR TO BLOCK FTEMP1 NEXTPTR+1 FTEMP2 !WRITBAKWRITE BLK BACK TO DISK ERR107 CLRBUFNOW CLEAR BUFFER ZBLKSET UP PREV PTR PREVPTR ZBLK+1 PREVPTR+1 FTEMP1SET UP PTR TO ZBLKNEW BLK K NEXTPTR+1 ZBLK+1 ZBLKEOF DIRECTORY? >7YES, ADD ANOTHER BLK DDDGET NEXT BLOCK ERR106 ERR107 #FILETWOAND TRY AGAIN MPTR /FILETWO MPTR+1 <6 ; #^7 ADDBLKADD ANOTHER BLOCK >8 #FULERRNONE, DISK FULL ERR107TR TO 1ST DSC MPTR /FILEONE MPTR+1 ^6 #$00 (MPTR),YDSC EMPTY? >9YES, USE IT  MPTRELSE MOVE PTR UP #$27 MPTR <6AND TRY AGAIN MPTR+1 MPTR+1EOF BLK? /SYSBUF+$200 <6 NEXTPTRYES, SET UP NEXT PTR ZBL#FULERRNO, SET DISK FULL ERR106AND EXIT ; "^5 ADDBLKALLOCATE A BLOCK ERR106 KEYPTRUSE AS KEYPTR KEYPTR+1 ; HDRPTRNOW FIND AN EMPTY FILE ZBLKDESCRIPTOR HDRPTR+1 ZBLK+1 DDDGOT HEADER BLK ERR106 #FILEONESET PT UP VERSIONS MINVSN #$03COPY CREATION TIME TO %^3 LMTIME,XSET CREATION TIME CRTIME,X  <3 #$C7SET ACCESS FILACCES !^4 GETMAPGET THE BIT MAP ERR106 #$01ENOUGH BLOCKS TO FIT >5FILE?  BLOCKS >5YES ;  $E000  $800 ; ; ; %;THIS IS A CRUDE ATTEMPT AT A SHELL. #; EVENTUALLY ALL THE EQU'S WILL BE ; IN A CONFIG FILE. !;APPEND 'CONFIG.SRC' BEFORE ASM! ; ; ;ZERO PAGE USE ; ORIG $3CUSED BY RELOCATOR END $3E START $42 ; DLYFLG4****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * THE SHELL * * * * PART 1 * * * ****************** ; ; ; ; (4);"BLOAD TESTSAV"9 (4);"BLOAD DDD2,A$5000"[(4);"BLOAD FILE.OBJ,A$5700"g"";A$(4);"RUN CATHELLO")            TR DIRPNT HDRPTR+1 DIRPNT+1 #$27SET ENTRY LENGTHS DIRENL DIRPEL #$0DNO. ENTRIES/BLK DIREPB #$00NO FILES IN DIRECTORY FILCNT FILCNT+1 IBLK2NOW WRITE THE HEADER ; ; ; TE INDEX BLK ZBUF /SYSBUF ZBUF+1 IBLK ; ; !SUB3 CLRBUFFIRST CLR BUFFR #$26COPY FILDSC ^2 FILDSC,XTO DIRDSC DIRDSC,X  <2TO SET UP SUBHDR #$30SET UP A HEADER BLOCKID #$75 DIRID HDRPTRSET UP PARENT P FTEMP5INDEX BLOCK &^1 SYSBUF,XGET BLOCK PTR FROM ZBLKINDEX BLOCK SYSBUF+$100,X ZBLK+1 DDDWRITE THE BLK RTS3 ZBUF+1MOVE BUFFER UP ZBUF+1 FTEMP5 FTEMP5 FTEMP1MORE BLKS? <1YES, LOOP &IBLK2 #SYSBUFOK, WRIZCMDRESET TO READ RTS3 RTS2 #SYSBUFNOW SET TO SYSBUF ZBUF /SYSBUF ZBUF+1 SAVMAPAND SAVE MAP ; ; !SAP3 BLOCKSGET NO. OF BLKS  FTEMP1 AUXPTRSET UP BASE ADDRESS ZBUF AUXPTR+1 ZBUF+1 #$00SET UP OFFSET INTOL #WRITESET WRITING ZCMD STORTYPEGET STORAGE TYPE #$F0 #$20A SAPLING? SAP3 #$D0A SUBDIR? SUB3 ; SEED3 AUXPTRWRITE THE ONLY ZBUFBLOCK AUXPTR+1 ZBUF+1 IBLK KEYPTR ZBLK KEYPTR+1 ZBLK+1 DDDDONE AS WE DID ABOVE ENDPTR+1 #$01 ZBUF+1 MPTR+1 LASTONEAND GET LAST BLOCK ; ; ; ; ; ; &;WRITFIL: WRITES THE FILE IN THE FILE $; DESCRIPTOR. BITMAP HOLDS MAP WITH (; 1 BLOCK ALLOCATED. FILDSC HAS ALREADY ; BEEN WRITTEN TO DISK. ; WRITFIAS ABOVE, BUT WRITES 256 BYTES "; TO THE SECOND HALF OF THE BLOCK ; DDD2 $D6BE $D6D0 <1 $D024  #$02 $D038 $D358  ; ; ; TO DISK LIKE DDD, !; BUT ONLY WRITES 256 BYTES FROM "; THE BUFFER TO THE FIRST HALF OF ; THE SPECIFIED BLOCK. ; DDD1 DO SOME OF THE $D6BEINSTRUCTIONS IN DDD $D6D0 >1 $D024 $D038 $D358  ^1 #$27   ; ; ; %;DDD2:****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * PART 4 * * * ****************** ; ; ; ; ; ";DDD1: DOES I/O   #FULERRNO, SET DISK FULL ERR106AND EXIT ; "^5 ADDBLKALLOCATE A BLOCK ERR106 KEYPTRUSE AS KEYPTR KEYPTR+1 ; HDRPTRNOW FIND AN EMPTY FILE ZBLKDESCRIPTOR HDRPTR+1 ZBLK+1 DDDGOT HEADER BLK ERR106 #FILEONESET PT UP VERSIONS MINVSN #$03COPY CREATION TIME TO %^3 LMTIME,XSET CREATION TIME CRTIME,X  <3 #$C7SET ACCESS FILACCES !^4 GETMAPGET THE BIT MAP ERR106 #$01ENOUGH BLOCKS TO FIT >5FILE?  BLOCKS >5YES  IN THE REQUIRED ); DIRECTORY (HELD BY X,Y) OF THE PARTIAL $; FILE DESCRIPTOR. MUST HAVE SET UP ; - NAME_LENGTH ; - NAME -FILETYPE ; - EOF -CREATION ; - AUX_TYPE ; MAKFIL HDRPTRSAVE DIRECTORY HDRPTR+1POINTER VERSIONSE TO OFFSETS FTEMP5 +^5 FTEMP1START WITH 1ST NEW OFFSET ADDBLKGET A NEW BLK  FTEMP1GET OFFSET SYSBUF,XSAVE NEW BLOCK  SYSBUF+$100,X FTEMP5NEW & OLD SAME? <5NO, LOOP FINALLY RETURN ; ; ; (;MAKFIL: CREATES A FILEE BLK FTEMP1MOVE OFFSET DOWN FTEMP1OLD & NEW THE SAME? FTEMP5 <1NO, KEEP DEALLOCATING #$00FINALLY, CLEAR REST OF FTEMP5I-BLK  ^2 SYSBUF,X SYSBUF+$100,X  <2 ^3 AND RETURN ; ; '^4 FTEMP1RESET BOTH ; +CNGBLKS FTEMP5COMPARE OLD & NEW OFFSETS FTEMP1 >3SAME, EXIT >4BIGGER, ALLOCATE MORE BLKS FTEMP1RESET BOTH TO OFFSETS FTEMP5 FTEMP1ELSE, GET OLD OFFSET !^1 SYSBUF,XGET BLOCK PTR SYSBUF+$100,X  REMBLKDEALLOC THS THE BLOCKS ALLOCATED ; TO A SAPLING FILE. #; INPUT - SYSBUF HOLDS OLD I-BLOCK (; - BITMAP HAOLDS CURRENT BIT MAP ); - FTEMP1 HOLDS NO. OLD DATA BLKS ); - FTEMP5 HOLDS NO. NEW DATA BLKS 2; **N.B: SEEDLING OFFSET IS #$00, I.E 0 DATA BLKS****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * PART 3 * * * ****************** ; ; ; ; ; ';CNGBLKS; CHANGEKE PROC LATER USLP $D036TIME DELAY UMEMFREE $D052CHECK MEM FREE #UMEMBLK $D055CHECK MEM BLK FREE ZCDTOBLK $E800SET UP CURDIR ZGETPATH $E803GET FILE DSC ZDECHEX $E806DEC TO HEX ; ; ;MONITOR ROUTINES ; BELL1 $FBDDRING BELL G $E8DELAY FLAG TIME $E9TIME (2 BYTES) STEMP1 $EBTEMP STORAGE STEMP2 $EC STEMP3 $ED STEMP4 $EE STEMP5 $EF ; ; ;KERNEL ROUTINES ; URDY $D003READY USTP $D006STOPPROC UCTE $D012CREATE UWAK $D033WA@` ۰`L`C װL@5 # J @Q ڰ``L Iذ`5 !DԆզ8eЅԐ JP @   Bװ`L Iذ`0OF 1ST NAME STACK,X #' 'TERMINATED BY A ' ' <1 USE IN GETBUF GET BACK ARG PTR  GETPATHFIND FILE >2ERR, EXIT GET 2ND NAME LEN FTEMP4 FTEMP2 #$0FONLY 15 CHARS FTEMP2LOAD PTR TO NAME /STACK ZRENAMRENAME FIILNOW JUST WRITE FILE ; ; ; #$00AND NO OLD BLKS FTEMP1 >5SET UP CURRENT BLKS ; ; !SAP4 KEYPTRGET INDEX BLOCK ZBLK KEYPTR+1 ZBLK+1 DDDDONE ERR108 ^5 BLOCKSSET UP CURRENT BLOCKS FTEMP5 #CNGBLKSADD/DEL BLOCKS AS NEEDED &^9 WRITF "SEED4 WRITFILJUST WRITE FILE ; ; NEWTYPE #$F0NEW TYPE OF FILE #$20NOW A SAPLING? >4 #$10NOW A SEEDLING? <9NO, ERROR ; #$01SET NO CURRENT BLKS BLOCKSAND DEALLOC BLOCKS SAP4 ; ; #^4 CLRBUFCLEAR INDEX BLOCK RITBAKWRITE NEW DSC BACK ERR108 COPYDSCAND COPY ALL BACK STORTYPE FILE TYPE CHANGED? NEWTYPEYES, HANDLE IT #$F0 #$20A SAPLING? SAP4 #$10A SEEDLING? SEED4 )^9 #TYPERRELSE SET BAD FILE TYPE ERR108AND EXIT ; ;ANGED? STORTYPE (MPTR),Y SAVE FOR LATER (MPTR),YSAVE NEW STORTYPE #$24COPY OVER NEW INFO '^2 FILDSC,YAUX_TYPE & LAST_MOD (MPTR),Y  #$1E <2 #$17NOW BLOCKS & EOF ^3 FILDSC,Y (MPTR),Y  #$12 <3 W WITH ERROR  ; ; ^8 FILACCESGET ACCESS #$02WRITEABLE? >1YES #WRITERRNO, SET ERROR ERR108AND EXIT ; (^1 #$13BEFORE WE CHECK STORTYPE (MPTR),YSET UP OLD BLK CNT FTEMP1IN FTEMP1 FTEMP1 #$00HAS FILE TYPE CHT UP HDR PTR ZBLK HDRPTR+1 ZBLK+1 STORTYPEAND CHECK TO SEE IF #$0FIT ALREADY EXISTS #FILNAM-1 /FILNAM-1 FINDFIL2 >8ALREADY EXISTS, OVERWRITE #FILERRCOULDN'T FIND IT? ERR108 MAKFILNO, CREATE ONE ERR108 ELSE EXITORTYPENOW SET UP STORTYPE #$0F BLOCKSONY 1 BLOCK? #$01 >2YES, A SEEDLING BLOCKSADD 1 FOR I-BLOCK #$20SET AS SAPLING >3 "^2 #$10ELSE IS A SEEDLING ^3 STORTYPESAVE FINALLY GETMAPNOW GET DISK MAP HDRPTRNOW SE - LAST_MOD ; SAVFIL HDRPTRSAVE DIR PTR HDRPTR+1 #$00SET BLOCKS MSB BLOCKS+1TO 0  ENDPTR+1GET FILE LENGTH #$01ADD 1 DIV BY 2 BLOCKSSAVE AS BLOCKS >1 ENDPTRIF LSB <>0 >1 BLOCKSADD ANOTHER BLOCK '^1 STITFILELSE WRITE FILE ; ; ; &;SAVFIL: SAVES A FILE IN THE REQUIRED ); DIRECTORY (HELD BY X,Y) OF THE PARTIAL *; FILE DESCRIPTOR, WHICH MUST HAVE SET UP !; - STORTYPE - NAME_LENGTH ; - NAME - FILETYPE ; - EOF - AUX_TYPE ; 107 STORTYPENOW IF NOT A SAPLING #$F0 #$20 >3 #WRITFILTHEN WRITE THE ONLY FILE ; &^3 CLRBUFELSE ALLOCATE BLOCKS BLOCKS FOR THE FILE FTEMP5SAVE NO. BLOCKS #$00SET NO OLD BLKS FTEMP1 CNGBLKSALLOCATE BLOCKS WRFTEMP2 ZBLK+1 #FILETWOPOINT TO 1ST DSC MPTR /FILETWO MPTR+1 ; ^9 #$26COPY OVER DSC ^1 FILDSC,YTO DIR BLK (MPTR),Y  <1 FILCNTADD 1 TO FILE >2COUNT FILCNT+1 %^2 WRITBAKSAVE BLOCK TO DISK ERR EXIT ; #^8 NEXTPTRADD PTR TO BLOCK FTEMP1 NEXTPTR+1 FTEMP2 !WRITBAKWRITE BLK BACK TO DISK ERR107 CLRBUFNOW CLEAR BUFFER ZBLKSET UP PREV PTR PREVPTR ZBLK+1 PREVPTR+1 FTEMP1SET UP PTR TO ZBLKNEW BLK K NEXTPTR+1 ZBLK+1 ZBLKEOF DIRECTORY? >7YES, ADD ANOTHER BLK DDDGET NEXT BLOCK ERR106 ERR107 #FILETWOAND TRY AGAIN MPTR /FILETWO MPTR+1 <6 ; #^7 ADDBLKADD ANOTHER BLOCK >8 #FULERRNONE, DISK FULL ERR107TR TO 1ST DSC MPTR /FILEONE MPTR+1 ^6 #$00 (MPTR),YDSC EMPTY? >9YES, USE IT  MPTRELSE MOVE PTR UP #$27 MPTR <6AND TRY AGAIN MPTR+1 MPTR+1EOF BLK? /SYSBUF+$200 <6 NEXTPTRYES, SET UP NEXT PTR ZBLETLN $FD6AGET INPUT LINE RELOC $FEB0RELOCATOR ; ;ABSOLUTES ETC ; PROMPT $33PROMPT LOC'N LINBUF $200INPUT BUFFER "PLIST $E810LIST OF PROCESSES ; ; ; SCOLD SHELLCOLDSTART SWARM SHELLWARMSTART ; ; SHELL #"%"N TIME DATEFIL DISABLE INTS FTEMP2SAVE 2ND S-REG BEFORE MAKFIL ZBLKGET DIRECTORY PTR ZBLK+1IN X,Y ZMAKFILMAKE THE SUBDIR RETIREVE S-REG FTEMP2 <1ERROR NOERR203ELSE FINISHED ; ; ; LENGTH USE AS OFFSET #$D0SET STORTYPE=SUBDIR STORTYPE QPTRSHIFT PTR DOWN 1 "^3 (QPTR),YCOPY OVER NAME STORTYPE,Y  <3 #$0FSET FILETYPE=SUBDIR FILTYPE #$02SET TWO BLKS BLOCKS #CRTIMESET UP /CRTIMECREATIOAUXIN SAVE 2ND S-REG FTEMP2 USE IN GETPATH  GET ARGS PTR GETPATHFIND PATH >2ERROR, GOOD #EXERRELSE ALREADY EXISTS ^1 ERR203EXIT %^2 #PATHERRCOULDN'T FIND IT? <1NO, SOME OTHER ERROR FTEMP1GET FINAL NAMEGE MEM OUT SBANK2 #$03PULL DATE ^2 (QPTR),YAND SAVE  <2 SET NO ERRORS ALLOW INTS AND RETURN ; ; ; %;MKDIR:PROCESS TO CREATE A DIRECTORY ; AT THE GIVEN PATH. ; MKDIR DISABLE INTS AUXINBRING IN AUX.MEM SAVE POINTER QPTR+1 #MEMINGET SYS.DATE ON STACK SBANK2 MONTHFIRST MONTH SHIFTED TO RIGHT SPOT    DAYHIPLUS DAY  YEARNOW YEAR WITH A MONTH BIT  CLOCKHINOW MINUTES  DAYLOFINALLY HOURS  #MEMOUTPAATE. X,Y POINT TP ; PRODOS TIME FIELD. ; #;*N.B PRODOS TIME FIELD (4 BYTES): ; mmmddddd yyyyyyym ; 00mmmmmm 000hhhhh ; ;SYSTEM DATE (6 BYTES) ; 0yyyyyyy 0000mmmm ; 000ddddd 000hhhhh ; 00mmmmmm 00ssssss ; DATEFIL DISABLE INTS QPTRA-REG. Y,A CLOBBERED. ; DECHEX FIRST CONVERT BOTH TO 0-9 #$0F   #$0F NOW ADD ON Y*10 MULTEN,Y AND RETURN ; MULTEN 000A141E28*10 TABLE 323C46505A ; ; ; (;DATEFIL:ROUTINE TO CONVERT SYSTEM DATE $; TO PRODOS FILE D10,100 ADD 1 TO COUNT <2UNTIL IT IS LESS ^3 SAVE INPUT GET COUNT #$B0CONVERT TO CHAR COUTPRINT LETTER  AND LOOP <1  ; ; HTDTABL 010A641,10,100 ; ; ; &;DECHEX: CONVERTS CHARS IN Y,A TO HEX &; VALUE 0-99 IN A-REG IN (; DECIMAL (3CHARS). ALL REGS CLOBBERED. ; HEXDEC2 PRINTS 2 CHARS. ; HEXDEC #$02PRINT 3 CHARS  C0SKIP INST. HEXDEC2 #$01ONLY 2 CHARS ^1 #$00SET COUNT TO 0 %^2 HTDTABL,YIS A > 1,10,100? >3 HTDTABL,YSUBTRACT 1,E D,M,Y  >7PAST YEAR, SKIP  MOVE UP PTR  <6 ; !^7 QPTR+1DONE, KILL ARGS  <1AND EXIT ; ; ; ML1 "JFMAMJJASOND"MONTH !ML2 "AEAPAUUUECOE"LETTERS ML3 "NBRRYNLGPTVC" ; ; ; #;HEXDEC: ROUTINE TO PRINTAST SECONDS? #$03 >4YES, SKIP  MOVE UP PTR  <3 ^4 #' 'SKIP ANY SPACES ^5 STACK,X <5 #$02OFFSET FROM YEAR ^6 QPTR STACK,XGET 2 DIGITS STACK+1,X DECHEXCONVERT TO HEX QPTR YEAR,YSAVNK2 SET NO ERRORS ALLOW INTS AND RETURN ; ^2 QPTR+1SAVE 2ND S-REG GET ARGS PTR  #$00POINT TO DAYLO ^3 QPTR STACK,XGET 2 DIGITS STACK+1,X DECHEXCONVERT TO HEX QPTRGET OFFSET DAYLO,YSAVE H,M,S PHEXDEC2 #"-" COUT MONTHUSE MONTH AS OFFSET ML1-1,XGET 1ST LETTER COUT ML2-1,X COUT ML3-1,X COUT #"-" COUT YEARFINALLY YEAR HEXDEC2 CROUTA CR-LF ^1 #ETXSEND ETX COUT #MEMOUTPAGED MEM OUT SBAIN PAGED MEM SBANK2 #$00ANY ARGS? >2YES, SKIP DAYLOPRINT OUT HOUR HEXDEC2 #":"PLUS A COLON COUT CLOCKHIAND MINUTES HEXDEC2 #":" COUT CLOCKLOAND SECONDS HEXDEC2 #$02PRINT 2 SPACES PRBL2 DAYHINOW DAYS LE "^2 FTEMP4PUT 2ND S-REG IN FTEMP2FTEMP2 <4ERROR, EXIT NOERR203AND FINISH ; ; ; &;DATE:PROCESS TO DISPLAY AND SET DATE ; IF SETTING DATE, FORMAT IS %; date {hh}:{mm}:{ss} {dd}/{mm}/{yy} ; DATE DISABLE INTS #MEMINBRING RING IN SBANK2PAGED MEM PSTATE,XGET STATE #PRREADYPROCESS READY? >6NO, RESTART SHELL USTPELSE STOP OURSELVES <5AND LOOP ^6 CROUTSEND A CR-LF ALLOW INTS SHELLAND LOOP FOR INPUT ; ; ; AT DLYFLGSET A DELAY ASLEEP >4 ^2 TIMEGET Y=HRS TIME+1A=MINUTES USLPAND DELAY PROC >4 ^1 URDYELSE SET READY SERR3 ^4 STEMP2GET DELIMITER LINBUF,Y #"&"WAS IT AN "&"? >6YES, JUMP TO SHELL ^5 DISABLE INTS #MEMINB>2 #$8DSAME WITH RETURNS >3 ^2 #$00 ^3 NAME,Y   #$08NO MORE THAN 8 CHARS <1 UCTECREATE PROC SERR2 DLYFLGANY TIME DELAY? >1NO >2OFFSET DELAY TIMEGET Y=HRS TIME+1A=MINUTES UWAKAND SET PROC SKIP IT ^8 ADD 1 TO ARGS #$7FKILL BIT 7 NARGS,YSAVE ARG GET NEXT ARG, INCL. SPACES STEMP2 >9 LINBUF,X <8 ; !^9 NARGSSAVE NO. OF ARGS STEMP1SET UP NAME #$00 ^1 LINBUF,X #" "REPLACE SPACE WITH 00 ATYES, JUMP TO AT ^1 SKIP THE ZERO PLIST,YSET UP ADDRESS PROCADDR  PLIST,Y PROCADDR+1 ANYPROC #$01 PRIORITY #$00SET 0 ARGS ^7 STEMP2EOF 'PROC'? >9YES LINBUF,XGET AN ARG #" "A SPACE? <7YES, LOAD FILE AUXPTR+1 ZREADFILDONE AUXOUTREMOVE AUX.MEM STEMP3GET PTR TO ARGS ANYPROCAND CREATE PROCESS SERR2 SERRELSE AN ERROR ; ; SHPROC #$03IS IT 'mon'? >1NO MONELSE JUMP TO MON ^1 #$08IS IT 'at'? >1NO PROCADDR ENDPTRADDING START AND PROCEND AUXPTR+1LENGTH PROCADDR+1 ENDPTR+1 PROCEND+1 AUXOUTKICK OUT DOS UMEMFREEIS THAT MEMORY FREE? SERR2NO, ERROR STILL DISK ACCESS AUXINBRING BACK DOS AUXIN AUXPTRMEM FREE, SERR2ERR, EXIT PROCADDRSET UP START NOW, AS STARTIT CLOBBERS ZDVC PROCADDR+1 START+1OK, NOW RELOCRELOCATE THE FILE STEMP3GET PTR TO ARGS ANYPROCAND CREATE PROCESS ; BIN STATIC ADDRESS, CALC AUXPTRADDRESS RANGE BY RT MSB  ADD LENGTH STEMP4TO GET END MSB PROCEND+1  AUXPTR+1GET ORIGINAL END MSB ORIG+1 STEMP4BY ADDING LENGTH END+1FOR RELOCATOR PROCADDRGET ADDR TO LOAD PROCADDR+1 ZREADFILREAD FILE AUXOUTKICK AUX.MEM OUT  FOR ENDRELOCATOR AS WELL $ENDPTR+1PAGES=LENGTH MSB + CARRY #$00 STEMP4SAVE LENGTH  ADD 1 FOR MEMBLK AUXOUTKICK AUX.MEM OUT UMEMBLKA FREE BLOCK? SERR2NO, EXIT BRING BACK DOS AUXIN AUXIN !PROCADDR+1YES, SAVE STAPE #$FFA SYS FILE? BIN #$06A BIN FILE? BIN #$FEA REL FILE? SERRNO, ERROR REL CALC NEW END LSB "AUXPTRBY ADDING START & LENGTH PROCADDRLSB. CARRY INDICATES ORIGIF GONE OVER A PAGE. ENDPTR PROCENDSET UP END LSBAT DELIM? <2NO, LOOP ^3 A=MAX.OFFSET+1   SAVE END OF NAME STEMP3FOR LATER DISK ACCESS, DISABLE INTS AUXINBRING IN AUX.MEM AUXIN STEMP1GET START OF NAME  ZGETPATHFIND FILE ON DISK SERR FILTYPECHECK TYNEXT 0 CHAR <5 SKIP 00 AND ADDRESS   <3TRY AGAIN ; #DISKPROCSTEMP1FIND PROCESS NAME ^2 LINBUF,XGET CHAR #" "A SPACE? >3YES, EOF NAME #$7FTURN BIT 7 OFF &STACK+1,XSAVE ON STACK FOR GETPATH NEXT CHAR STEMP2EMP1GET X-REG ^4 PLIST,YGET A CHAR LINBUF,XSAME AS INPUT? >5NO, A NEW 'PROC'  PLIST,YGET NEXT CHAR A0, FOUND A SHELL PROC SHPROC A ELSE MATCH AGAIN <4 DISKPROCELSE LOOK ON DISK ; ^5 PLIST,YGET SE #"&" PARSE #$8D PARSE NO, KEEP TESTING DELIM #SERR AUXOUTFIRST OUT AUX.MEM ALLOW INTS BELL1ERR, SEND BELL CROUTSKIP A LINE SHELLAND LOOP ; ; $PARSE STEMP2SAVE END OF 'PROC' #$00SET Y TO 0 ^3 STSET UP PROMPT PROMPT GETLNGET A LINE OF INPUT #$00ANY INPUT? SHELLNO, GET SOME #$00START WITH 1ST CHAR STEMP1 DLYFLGSET NO DELAY DELIM LINBUF,XGET CHAR #"|"COMPARE WITH DELIMITERS PARSE #">" PARSE #"<" PAREND OF FILE PTR #CRTIME FILDSC+$18CREATION TIME $VERSION FILDSC+$1CPRODOS VERSION (MINVSN FILDSC+$1DMIN PRODOS VERSION #FILACCES FILDSC+$1EFILE'S ACCESS 'AUXPTR FILDSC+$1FFILE START ADRESS #LMTIME FILDSC+$21LAST MOD TIME 'HDRPTR FISYSBUF+$2BFILE DESC ; ; ; ;DESCRIPTOR LOCATIONS ; !STORTYPE FILDSC+$0STORAGE TYPE FILNAM FILDSC+$1FILE'S NAME )FILTYPE FILDSC+$10FILE TYPE (BIN=$06) !KEYPTR FILDSC+$11KEY BLK PTR #BLOCKS FILDSC+$13NO. OF BLOCKS %ENDPTR FILDSC+$15M SYSBUF+$5DIR'S NAME DIRID SYSBUF+$14HEADER ID &DIRENL SYSBUF+$23DSC ENTRY LENGTH !DIREPB SYSBUF+$24ENTRIES/BLK "FILCNT SYSBUF+$25NO. OF FILES $DIRPNT SYSBUF+$27PARENT POINTER )DIRPEL SYSBUF+$2APARENT ENTRY LENGTH FILEONE NOT FOUND PROTERR $2BWRITE-PROTECTED ; ; ; ;DIRECTORY ADDRESSES ; !PREVPTR SYSBUF+$0PREV BLK PTR !NEXTPTR SYSBUF+$2NEXT BLK PTR "BLOCKID SYSBUF+$4BLOCK ID BYTE FILETWO SYSBUF+$4FILE DESC 'DIRDSC FILETWODIRECTORY DESCRIPTOR DIRNA $22FILE ALREADY EXISTS TYPERR $23FILE TYPE ERROR "PANERR $24PANIC, INCONSISTENT FULERR $25DISK FULL ERROR RENERR $26RENAME ERROR IOERR $27I/O ERROR DEVERR $28NO DEVICE DIRERR $29NOT DIRECTORY BLK FILERR $2AFILE $F600DEVICE BIT MAP FILDSC $F628FILE DESCRIPTOR ; ; ; ;COMMANDS ; STATUS $00GET DISK STATUS READ $01READ A BLOCK WRITE $02WRITE A BLOCK ; ; ; ;ERRORS ; SYNERR $20BAD SYNTAX ERROR PATHERR $21PATH NOT FOUND "EXERR DRIVER ; DDD $D000 ; ; ; ;ZERO PAGE ; ZCMD $42COMMAND ZDVC $43DISK DEVICE ZBUF $44I/O BUFFER ZBLK $46BLOCK NUMBER ; ; ; ;ABSOLUTE BUFFERS ; SYSBUF $F400SYSTEM BUFFER ; ; ; ;SCRATCH SPACE ; BITMAP  ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * CONFIGURATION * * * ****************** ; ; ; ; ; ;DISK DEVICE        MON ;  "pwd"  00  PWD ;  "cd"  00  CD ;  "ls"  00  LS ; "chmod"  00  CHMOD ;  "rm"  00  RM ;  "mv"  00  MV ; "date"  00  DATE ; "mkdir"  00  MKDIR ;  "df"  00  DF ;  "ps"  00  PS  $E800  $800 ; ; $;POINTERS USED BY OTHER ASSEMBLIES. ; ZCDTOBLKCDTOBLK ZGETPATHGETPATH ZDECHEX DECHEX GETPATH GETPATH  00 %;AVAILABLE PROCESS LIST. WILL ALWAYS ; BE AT $E810. ; PLIST "mon"  00  MONFOR NOW  "at"  00 ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 1 * * * ****************** ; ; ; ;            OF 'PROC' STEMP2AND PARSE REST PARSE ; ; ; ZDECHEXCONVERT TO HEX TIMESAVE HOURS  SKIP DIGITS & COLON  LINBUF,XGET 2 MINUTE DIGITS LINBUF+1,X ZDECHEXCONVERT TO HEX TIME+1SAVE MINUTES  #" "SKIP TRAILING SPACES ^3 LINBUF,X <3 STEMP1SAVE STARTSKIP LEADING SPACES STEMP2NO TIME? >1ERROR SERR3 SERREXIT ^1 LINBUF,XGET CHAR #" "A SPACE ATLOOP ^1 #"+"A TIME OFFSET? >2NO DLYFLGSET DELAY FLAG -VE  %^2 LINBUF,XGET 2 HOUR DIGITS LINBUF+1,XPROCESS ADDRESS %PROCEND $302PROCESS 'END' ADDRESS PRIORITY $304PROCESS PRIORITY NAME $305PROCESS NAME NARGS $30DNO. OF ARGUMENTS ; ; ; ;PROCESS NAMES BASE ADDRESS ; NAMELIST $5900 ; ; ; ;WAIT QUEUE CONSTANTS ; NSEM $2D INPUT KYBDSTRB $C010KEYBOARD STROBE LPROUT $C090PRINTER ADDRESS "LPRBUSY $C1C1PRINTER BUSY FLAG !SETTXT $FB39SET UP FULL TEXT TABV $FB5BDO A VTAB "SETPWRC $FB6FSET POWER-UP BYTE ; ; ; ;PARAMETERS FOR CREATE ; PROCADDR $300 ; ;MISCELLANEOUS ; #NPROC $10MAX NO. OF PROCESSES 'PROCBASE $6000ZPG & STACK STORE BASE BUF $4000KEYBOARD BUFFER ; ; ; ;MONITOR ROUTINES & ABSOLUTES ; SOFTEV $3F2RESET VECTOR IRQV $3FEIRQ VECTOR KYBD $C000KEYBOARLKCNT TIKCNT+1CLOCK COUNTER BUFCNT CLKCNT+1KBD BUF PTR YEAR BUFCNT+1YEAR BYTE MONTH YEAR+1MONTH DAYHI MONTH+1DAYS DAYLO DAYHI+1HOURS CLOCKHI DAYLO+1MINUTES CLOCKLO CLOCKHI+1SECONDS ; ; ;MEMORY CONSTANTS ; ; ; PADDRH+NPROCBUFS WE SEND TO (PBUFOUT PBUFIN+NPROCBUFS WE GET FROM )KYBDPTR PBUFOUT+NPROCKEYBD INPUT PTRS ; ; ; ;SYSTEM VARIABLES ; #CURRPID $58E0ID OF CURRENT PROC 'NUMPROC CURRPID+1CURNT NO. OF PROCS !TIKCNT NUMPROC+1TICK COUNTER !COCLIST OF MESSAGES $PHASMSGL PMSGL+NPROCMESSAGE FLAGS 'PTIML PHASMSGL+NPROCLIST OF SLEEP 'PTIMH PTIML+NPROC TIMES FOR PROCS $PARGS PTIMH+NPROCNO. ARGUMEMTS $PADDRL PARGS+NPROCLIST OF START "PADDRH PADDRL+NPROC ADDRESSES 'PBUFIN $1E ; ; ; ;READY QUEUE CONSTANTS ; *RDYHEAD $5A00+5+NPROC*5READY HEAD NODE %RDYTAIL RDYHEAD+$5READY TAIL NODE ; ; ; ;PROCESS TABLE ; $PSTATE $5800LIST OF PROC STATES *PPRIO PSTATE+NPROCLIST OF PRIORITIES 'PMSGL PPRIO+NPRRREADY $03ON READY QUEUE PRRECV $04WAITING FOR MESG PRSLEEP $05SLEEPING PRSUSP $06SUSPENDED !PRWAIT $07ON SEMAPHORE QUEUE ; ; ; ;ZPG REGISTER STORES ; REGA $09 REGP $1A REGS $1B REGX $1C REGY $1D PC ; ; ; ;ZERO PAGE VARIABLES ; "ACC $45MONITOR A-REG STORE ; ; ; ;QUEUE CONSTANTS ; MININT $00MIN KEY IN QUEUE MAXINT $20MAX KEY IN QUEUE ; ; ; ;PROCESS STATES ; PRCURR $01CURRENTLY RUNNING PRFREE $02SLOT IS FREE PϠбÍРвÍРгÍРдÍɍ̠ǮâЮÍϠЮ RITBAK $D709 ZDELFIL $D70C ZMAKFIL $D70F ; ; ; ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * KERNEL CONFIG * * * ****************** 'ERR' MON $FF69MONITOR ENTRY ; ; ; ;ZERO PAGE MONTOR LOC'NS ; CH $24PRINTING COLUMN ; ; ; ;KERNEL ROUTINES ; UKILL $D00FKILL PROCESS ; ; ; ;FILE SYSTEM ROUTINES ; ZGETMAP $D700 ZFINDFIL $D703 ZRENAM $D706 ZW ; ;SPECIAL CHARS ; CR $0DCR-LF ; ; ; ;OUTPUT & MONITOR ROUTINES ; PRNTYX $F940PRINT Y,X PRNTAX $F941PRINT A,X PRBL2 $F94APRINT BLANKS !PRBYTE $FDDAPRINT A HEX BYTE PRHEX $FDE3PRINT A NIBBLE PRERR $FF2DPRINTNG * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * CONFIGURATION * * * ****************** ; ; ; ; ; ;I/O ADDRESSES ; SETERR $FE93SET ERR OUTPUT ; ;LDSC+$25PTR TO HEADER BLK ; ; ; ;TEMPORORY STORAGE FTEMP1 $DFF8 FTEMP2 $DFF9 FTEMP3 $DFFA FTEMP4 $DFFB FTEMP5 $DFFC FTEMP6 $DFFD FTEMP7 $DFFE FTEMP8 $DFFF ; ; ; ****************** * * * XINU OPERATI<1AND LOOP ; ERR201 #PATHERRSET BAD PATH SET ERROR AND RETURN ; ; !^1 FTEMP3GET OFFSET BACK FTEMP2ANY MORE CHARS? ERR201YES, ERROR ^9 ELSE RETURN JSR BLKTOCD ELSEWHERE ; ; ; ;CD: PROCESS TO SET THE CURREZFINDFIL !BC1 ERR201OK, A REAL ERR! QPTRRE-INC QPTR ; ^8 STORTYPEFILE A DIR? #$F0 #$D0 >1NO, CHECK NO MORE CHARS KEYPTRYES, SET UP ITS ZBLKKEYPTR IN ZBLK KEYPTR+1 ZBLK+1 FTEMP3UPDATE OFFSET QPTRAND QPTR PTR START 1 BEHIND QPTR+1 ZFINDFILFIND THE DIR >8FOUND QPTRRE-INC QPTR ZBLKERR, ARE WE AT ROOT ZBLK+1 #$02 ERR201NO, EXIT ZDVCTRY OTHER DRIVE #$80 ZDVC FTEMP1RESET REGS QPTR START 1 BEHIND QPTR+1 ; "^5 #$00A DSC, SET 0 CHARS FTEMP1 #'/'FIND A '/' ^6 FTEMP1  FTEMP2EOF CHARS? >7YES, GET LAST DSC STACK,XA DELIM? <6NO, LOOP SKIP DELIM !^7 FTEMP3SAVE NEW OFFSET FTEMP1GET LENGTH QPTRAND NAME ZBLKNO PARENT? #$06 BQ1 ERR201ERROR, EXIT ; ^3 #'/'SET UP A-REG ^4 MOVE UP PTR FTEMP2EOF CHARS? >9 STACK,XFOUND A DELIM? <4NO, KEEP LOOKING SKIP DELIM QPTR <1AND LOOP BACK BQ2 >9B.O.O.RANGE FTEMP2NO MORE CHARS? BQ2NO, LEAVE STACK,XGET 1ST CHAR #'.'A '.'? >5NO, SKIP STACK+1,X2ND A '.'? >3NO, SKIP QPTRX CLOBBERED DDDWHEN GETTING QPTRHEADER BC1 DIRPNTGET PARENT PTR ZBLK DIRPNT+1 ZBLK+1 ZBUF /SYSBUF ZBUF+1 CDTOBLKSET UP BLK & DVC QPTRSTART WITH 1ST CHAR STACK,XGET 1ST CHAR #'/'A '/'? >1NO, SKIP QPTRYES, SKIP '/' #$02SET BLK TO ROOT ZBLK #$00 ZBLK+1 #$60 ZDVC QPTRGET X BACK ; ^1 SOLUTE) PATH, INCLUDING . AND .. "; X HOLDS THE PTR TO THE START OF ; THE PATHNAME IN THE STACK. ; A-REG HOLDS MAX OFFSET+1. ; GETPATH QPTRSAVE PTR /STACK QPTR+1 FTEMP2SAVE MAX OFFSET #READSET READING ZCMD #SYSBUFSET UP BUF PTR CROUTSEND A CR-LF PRERRPRINT 'ERR' #' 'PRINT A SPACE COUT GET THE ERROR CODE PRBYTEAND PRINT IT CROUTSEND A CR-LF SET SYSERROR <4AND EXIT ; ; ; &;GETPATH:FINDS THE SPECIFIED DIR/FILE ; ALONG THE GIVEN (RELATIVE OR %; ABM <4 "NOERR200#ETXSEND ETX TO OUTPUT COUT SET NO ERRORS ^4 AUXOUTKICK MEM OUT ALLOW INTS AND RETURN ; ^5 QPTR+1RESTORE STACK  ERR200 SAVE ERROR CODE #ETXOUTPUT AN ETX COUT SETERRSET ERROR OUTPUT IMITER ON DIRPNTGET PARENT PTR ZBLK DIRPNT+1 ZBLK+1 <1AND LOOP ^3 QPTRDID WE START #$01AT ROOT? >4NO, SKIP #'/'SEND A DELIM COUT(START OF PATH) ^4 NOW PULL OFF COUTALL CHARS, AND OUTPUT QPTRTHEHEADER? #$02 >3YES, EXIT DDDELSE GET THE HEADER BLK >5ERROR, EXIT BLOCKIDGET BLOCKID #$0FGET NAME LENGTH USE AS OFFSET  QPTRADD TO PATH LENGTH QPTR (^2 DIRNAM-1,XSAVE NAME ON STACK   <2 #'/'PUSH DELSET UP 0 CHARS ZBUFAND LSB OF BUFFER CDTOBLKCONVERT CURDIR TO BLK #READREAD THE BLOCK ZCMD QPTRAND SET QPTR TO 1 #CRSAVE A CR-LF AS LAST CHARACTER /SYSBUFSET UP BUFFER ZBUF+1 ^1 ZBLKARE WE AT THE ZBLK+1VOLUME DONE ; ; ; (;PWD: FINDS THE CURRENT DIRECTORY NAME, (; AND PASSES IT TO THE STANDARD OUTPUT. "; USES ZPG DIRECTORY PTR CURDIR. ; PWD DISABLE INTS IGNORE ANY ARGS QPTR+1SAVE IN CASE OF ERROR AUXINBRUNG IN AUX.MEM AUXIN #$00 SAVE SHIFT BACK ZDVCSAVE DEVICE #$00 NOW GET MSB OF BLOCK  ZBLK+1 DONE ; ; ; ";BLKTOCD: CONVERTS ZBLK & ZDVC TO ; CURDIR ; BLKTOCD ZDVCGET DEVICE ZBLK+1ADD BLK MSB CURDIR+1SAVE ZBLK& COPY LSB CURDIR ;  "map"  00  MAP ; "kill"  00  KILL ; "halt"  00  HALT ; "start"  00  START ; ; ; ";CDTOBLK: CONVERTS CURDIR TO ZBLK ; AND ZDVC ; CDTOBLK CURDIRCOPY OVER LSB ZBLKOF ZBLK CURDIR+1GET DVC & MSB PUSH OUT MSBRR100 RETURN ERROR ; !^1 #$00SET 0 FREE BLOCKS FTEMP1 FTEMP2 #$27COPY 40 BYTES TO ^2 SYSBUF,XTHE BITMAP BITMAP,X !#$08NOW COUNT NO. FREE BLOCKS ^3 SHIFT OUT A BIT >4USED BLOCK, SKIP FTEMP1 >4 FTEMINTO MEMORY. ZDVC HOLDS DEVICE. ; A-REG RETURNS ERROR & CARRY. "; X,Y-REG RETURN NO. FREE BLOCKS. ; "GETMAP #READREAD FROM BLOCK 6 ZCMD  ZBUF ZBLK+1 #$06 ZBLK /SYSBUF ZBUF+1 DDDCALL THE DRIVER >1NO, ERRORS, CONTINUE E; ; ; $;FILE POINTERS: THESE STAY CONSTANT ; THROUGHOUT ANY ASSEMBLY. ; ZGETMAP GETMAP ZFINDFILFINDFIL ZRENAM RENAM ZWRTBAK WRITBAK ZDELFIL DELFIL ZMAKFIL MAKFIL ZREADFILREADFIL ; ; ; ; #;GETMAP: GETS THE BITMAP FROM DISK "; }****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * FILE SYSTEM * * PART 1 * * * ****************** ; ; ; ; ;  $D700  $800    !!! ! ! ! ! !!!!!!!!TX $03END OF TEXT CHARACTER ESC $1BESCAPE CHARACTER ; ; ; ;AVAILABLE MEMORY MAP ; MEMLIST $5F00 ; ; ; ;DOS EQUATES ; "CURDIR $F680CURRENT DIRECTORY ; ; ;  & ABSOLUTES ; %STACK $100BASE ADDRESS OF STACK SBANK2 $C07DBANKSWITCH I/O !HOME $FC58CLEAR THE SCREEN CROUT $FD8EOUTPUT CR-LF $COUT $FDEDMONITOR CHAR OUTPUT #COUT1 $FDF040-COL TEXT OUTPUT ; ; ; ;I/O CONSTANTS &c ; $EEMP POINTER TPTR $FETEMP POINTER ; ; ; ;MEMORY CONSTANTS ; MEMIN $02MEMORY IN BYTE MEMOUT $01MEMORY OUT BYTE AUXIN $C08BAUX.MEMORY IN AUXOUT $C080AUX.MEMORY OUT WRITMEM $C083LANG.CARD WRITE ; ; ; ;MONITOR ROUTINES * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SYSTEM CONFIG * * * ****************** ; ; ; ;ZERO PAGE VARIABLES ; QPTR $FAQUEUE POINTER MPTR $FCT0MAX NO. OF BUFS 'BUFLIST RDYTAIL+5LIST OF OWNER PIDS "INBUF BUFLIST+NBUFINPUT PTRS !OUTBUF INBUF+NBUFOUTPUT PTRS ; BFREE $00BUFFER FREE BLIMBO $FFBUFFER IN LIMBO #BUFBASE $4000BUFFER POOL'S BASE ; ; ; ****************** * ANTS ; 'TIKNO $08NO. IRQ'S BEFORE RESCHED *CLKNO $03NO. RESCHEDS BEFORE CLK INC ; ; ; ;NULL PROCESS INFO ; NULL $E000I.E THE SHELL NULLPID $00PROCESS ID NULLPRIO $01PROCESS PRIORITY ; ; ; ;BUFFER LISTS ETC ; NBUF $10NO. OF SEMAPHORES 'WAITHEAD $5B00+5+NSEM*5HEAD OF SEM Q #WAITTAIL WAITHEAD+5TAIL OF SEM Q (SEMLIST WAITTAIL+5LIST OF SEM STATES *SEMCNT SEMLIST+NSEMLIST OF SEM COUNTS ; SFREE $00 #SUSED $FFSEM STATES-FREE&USED ; ; ; ;CLOCK CONST****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SUPPORT * * ROUTINES * * PART 2 * * * ****************** ; ; ; ; !"" " " " """"""""" DIR FTEMP2GET 2ND S-REG TO KILL ALL ARGS  NOERR202AUXOUTAUX.MEM OUT SET NO ERRORS ENABLE INTS AND RETURN ; ; ^1 FTEMP2KILL ALL ARGS   ERR202 ERR200AND EXIT ; ; ; NT !; DIRECTORY TO THAT GIVEN IN THE ; ARGUMENTS. ; CD DISABLE INTS AUXINBRING IN AUXINAUX.MEM INC 2ND S-REG FTEMP2AND SAVE COPY TO A-REG GET 1ST ARG PTR  GETPATHGET THE PATH >1ERROR, EXIT BLKTOCDSET UP NEW";LS: ROUTINE TO LIST FILES IN THE !; CURRENT DIRECTORY. OPTIONS ARE ; -l: LONG LISTING. ; LS DISABLE INTERRUPTS AUXINBRING IN AUXINAUX.MEMORY !#$00SET SHORT LIST BY DEFAULT FTEMP4 SAVE 2ND S-REG FTEMP2 #$00ANY ARGS? ,XBLOCK USED? ERR103NO, ERROR BITLIST,YSET BLOCK FREE BITMAP,X BITMAP,X RETURN WITH NO ERRORS  ; ; ; ; ; $;REMBLK:DEALLOCATE A BLOCK FROM THE ; DISK BIT MAP. X,Y HOLD BLOCK. ; **N.B MAP ALREADY READ IN ; REMBLK CONVERT BLOCK INTO OFFSET FOR MAP      GOT OFFSET  #$07GET BIT POSN  BITLIST,YGET THE BIT BITMAP ELSE KEEP TRYING <3 ; ^4 #$FFTURN THE BIT OFF BITMAP,XALLOCATE THE BLK BITMAP,X GET BOTTOM 3 BITS FTEMP3GET BLK LSB  FTEMP4AND BLK MSB NOERR103SET NO ERRORS AND RETURN ; ; ; BITLIST 8040201008040201 ; ULL ERR103 ERROR & EXIT  ; "^2 FTEMP2SAVE PART OF MAP GET PART OF BLK    FTEMP3SAVE 5 BITS OF BLK #$00  FTEMP4AND ANOTHER BIT #$00NOW FIND WHICH BIT ^3 BITLIST,YWAS FREE FTEMP2THIS BIT? >4YES FROM THE '; DISK MAP. X,Y RETURN BLOCK ALLOCATED $; **N.B BITMAP SHOULD ALREADY HAVE ; BEEN READ ; ADDBLK #$00START AT BLOCK0 "^1 BITMAP,XANY FREE BLKS? >2YES, USE ONE MOVE UP #$28END OF MAP? <1 #FULERRSET DISK FR102AND EXIT ; "^1 (QPTR),YCOPY OVER NAME (MPTR),Y  <1DONE (MPTR),YNOW SET NEW LENGTH #$F0 FTEMP1 (MPTR),Y !WRITBAK ZCMDNOW WRITE IT BACK DDDAND RETURN ZCMDRESET TO 'READ'  ; ; ; $;ADDBLK: ALLOCATES A BLOCKB: FINDFIL MUST BE CALLED !; IMMEDIATELY BEFOREHAND ; RENAM QPTRSAVE OUR PTR QPTR+1 FTEMP1SAVE LENGTH USE LENGTH AS OFFSET FILACCESGET FILE'S ACCES #$40CAN WE RENAME IT? >1YES, KEEP GOING #RENERRNO, SET ERROR ER DDDGET NEXT BLOCK ERR102ERROR, EXIT #FILETWOSET UP FILE PTR MPTR /FILETWO MPTR+1 <2AND TRY AGAIN ; ; ; %;RENAM: RENAMES THE FILE IN THE MAIN $; FILE DESCRIPTOR. X,Y HOLD PTR TO $; THE NEW NAME. A-REG HOLDS LENGTH. !; ** N.+$200PAST BLK END? <2NO, TRY AGAIN NEXTPTROK, SET UP NEXT PTR ZBLK NEXTPTR+1 ZBLK+1 ZBLKEOF DIRECTORY? >6NO, CONTINUE #FILERR TPTRRESTORE ZBLK ZBLK TPTR+1 ZBLK+1 ERR102 SET FILE NOT FOUND AND RETURN ; ^6TEST ALL CHARS $(MPTR),YNOW TEST IF NAME LENGTHS #$0FARE THE SAME FTEMP1 NOERR100YES, RETURN SUCCESS ; ^5 ADD #$27 ONTO MPTRPTR FOR NEXT FILE #$27 MPTR <2GO BACK & TRY AGAIN MPTR+1ADD 1 TO MSB MPTR+1 /SYSBUFET NO DIR ERR101 SET SYSERR AND RETURN ; "^1 #FILEONESET PTR TO 1ST MPTRFILE DESCRIPTION /FILEONE MPTR+1 !^2 FTEMP1GET NAME LENGTH ^3 (MPTR),YGET A CHAR (QPTR),YSAME AS OURS >5NO, TRY NEXT FILE  <3ZBLKSAVE ZBLK IN CASE TPTROF ERROR ZBLK+1 TPTR+1 #READREAD BLOCK ZCMD  ZBUFTO SYS BUFFER /SYSBUF ZBUF+1 DDDGET BLOCK ERR100ERROR, EXIT BLOCKIDA DIRECTORY BLK? #$E0 #$E0 >1YES, CONTINUE #DIRERRELSE, SSE COPY OVER ^1 (MPTR),YDSC TO MAIN FILDSC,YFILE DESCRIPTOR  <1 NOERR100AND RETURN ; ; ; ;FINDFIL2:MATCHES A FILE, BUT ; DOESN'T COPY OVER THE FILE'S ; DESCRIPTOR. ; FINDFIL2FTEMP1SAVE LENGTH QPTRSAVE PTR QPTR+1 ,Y  <2DONE  ; ; ; %;FINDFIL: MATCHES A FILE DESCRIPTION ); IN DIRECTORY SPECIFIED BY ZBLK & ZDVC. %; X,Y HOLD ADDRESS OF NAME TO MATCH. ; A-REG HOLDS NAME_LENGTH. ; $FINDFIL FINDFIL2MATCH A FILE DSC ERR101NONE, EXIT COPYDSC #$26ELP2 ^4 DO 8 SHIFTS <3 DONE 40 BYTES? <2 FTEMP1GET COUNT IN REGS FTEMP2 NOERR100SET NO ERRORS AND RETURN ; ; ; ";CLRBUF: CLEARS THE SYSTEM BUFFER ; CLRBUF #$00  ^1 SYSBUF,Y  <1 ^2 SYSBUF+$100<3KEEP LOOKING $^4 #SYNERRELSE SYNTAX ERROR ERR204 ERR203AND EXIT ; #^5 PROTABL2,YGET BIT POS'N FTEMP5ADD TO OUR MASK FTEMP5 <2AND GET NEXT BIT ; ; ^6 NOW FIND FILE/DIR FTEMP2 GETPATH ERR204 FTEMP4 I1(A$)' J130(' Q(16336)J' X((1)39)1:Y((1)23)1Y' Y152780o' X:Y:(A$,I,1);' X0:Y0:" ";' X0X:Y0Y' J' 15:I10:(A$,I,1);'" I', X:Y:" ";:23\Z ʽ)\Z ʽ)\Z ʽ)\AUXIN SAVE 2ND S-REG FTEMP2 #$00ANY ARGS? >4NO, ERROR GET PTR TO ARGS  STACK,X #'-'REMOVE ACCESS? >1 #'+'ALLOW ACCESS? >4NO, ERROR #$00SET TO ALLOW  CDSKIP NEXT INST. ^1 #$FFSET TO REMOVE FTEMP4  ' 'SUBDIRECTORY HDR  'CMD'  'BAS'  'REL'  'SYS'  ' 'DENOTES A HEADER I.E . ; ; ; );CHMOD: ROUTINE TO CHANGE THE PROTECTION ; ON A FILE/DIR. SYNTAX IS ; CHMOD {+OR-}{r,w,x,n,d} ; CHMOD DISABLE INTS AUXINBRING IN AUX.MEM ALLOW INTS AND RETURN ; ; !PROTABL 'dnxwrxwr'PROTECTIONS ; ; FTYPE 000104060F75VALID  F0FCFEFF00FILETYPES ; TYPTABL 000306090C0FSTRING  1215181B1EPOINTERS ; !TYPTABL2 '???'FILETYPE STRINGS  'BAD'  'TXT'  'BIN'  'DIR' RGET NEXT BLK ZBLK NEXTPTR+1 ZBLK+1 ZBLKEOF DIRECTORY? NOERR203YES, END GETBLKELSE GET NEXT BLOCK ; "NOERR203#ETXFINISHED, SEND ETX COUT FTEMP2GET 2ND S-REG BACK  KILL ARGS SET NO ERROR AUXOUTAUX.MEM OUT NT A & X ; ;DO DATES LATER ; NEXTFIL CROUTPRINT A CR-LF NEXTFIL2MOVE UP PTR QPTR #$27 QPTR >4FIX MSB TOO !^3 PRTFILELSE PRINT FILE ^4 QPTR+1PAST BLK END? QPTR+1 /SYSBUF+$200 <3NO, PRINT NEXT FILE NEXTPTOOP &^1 TYPTABL,XGET PTR TO STRING #$03 #^2 TYPTABL2,YPRINT 3 CHARS COUT   <2 #$02PRINT 2 BLANKS PRBL2 #'$'PRINT A '$' COUT #$15GET LENGTH LSB (QPTR),Y INTO X-REG NOW MSB (QPTR),Y PRNTAXPRIL,XGET A CHAR FTEMP1PRINT IT? >8YES #'-'NO, PRINT '-' ^8 COUT LOOP 8 TIMES <7 #$02PRINT 2 BLANKS PRBL2 #$10GET FILE TYPE (QPTR),Y !#$0ACHECK AGAINST KNOWN TYPES ^9 FTYPE,X >1FOUND IT  <9ELSE L^6 FTEMP4LONG LISTING? NEXTFILNO, DO NEXT FILE  FTEMP1GET LENGTH BACK !#$0FFILL OUT NAME TO 20 CHARS #$02 OUTPUT BLANKS PRBL2 #$1EGET PROTECTION BYTE (QPTR),Y FTEMP1SAVE #$07PRINT OUT 8 CHARS ^7 PROTAB #$01ELSE SET 1 CHAR FTEMP1FOR NAME #'.'WHICH IS '.' COUTPRINT IT >6AND CONTINUE !^4 FTEMP1GET NAME LENGTH #$0FFINALLY! FTEMP1SAVE FOR LATER USE AS COUNTER ^5 OUTPUT NAME (QPTR),Y COUT  <5DONE F ZBUF+1 QPTR+1AND DSC PTR #FILETWO QPTR DDD ERR203ERROR, EXIT ; PRTFIL #$00GET FILE LENGTH (QPTR),Y FTEMP1SAVE #$F0IS IT DELETED? >3NO NEXTFIL2YES, DO NEXT FILE ^3 #$E0IS A HEADER? >4NO, PRINT NAME A PATH, GET MAX OFFSET GETPATHGET THE PATH >4OK, GO ON ERR203 FTEMP2ELSE KILL ARGS   ERR200AND EXIT ; '^3 CDTOBLKNO ARGS, SET UP ZBLK !^4 #READSET UP DISK READ ZCMD  ZBUFSET UP SYSBUF PTR GETBLK /SYSBUϠŮǍРЮǍР̮ǍРͮǍǮÍ" >3NO, SKIP GET PTR TO ARGS  STACK,X #'-'ANY OPTIONS? >1NO, SKIP GET OPTION STACK,X #'l'A 'l'? >1NO, IGNORE #$01SET UP LONG LIST FLAG FTEMP4 MOVE UP TO ANY PATH  FTEMP2EOF ARGS >3 ,^1 FTEMP2OK,