' +JJJJ ?\>m0M='+l> /+l   d]@ŵLҦ]]LF L}BBL] X  ` 鷎귭෍ᷩ췩緈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 ˆʎõĵL õ ĵµ aµ`` L̦µ_bJLuLz`  ȟ QlXJ̥KlV  ȟ QlV eօ3L e3L &RL &QL d L4 Ne)n `@-eff L f`L . tQLѤ LҦL` OPu d L Ne)noon 8ɍ` ^f\õL ^NR  RΩLҦ)\Z ʽ LHv 3h`0h8` [L NС õ`A@` ŵL^Lõ`  \ 濭0 \  ȟ Q ^\lZl^?cqH şch`fhjõĵ@OAP`u@`@&`QR`E Ls  @DAE@u`8` %@ @A@`@`@A`Mµ ) LЦ`8@AWc@8@-@HAȑ@hHȑ@ȑ@hHȑ@Ȋ@ch8&ȑ@Hȑ@Ah@LHȑ@ȑ@ htphso`hMhL`9V8U897T6S67`INILOASAVRUCHAIDELETLOCUNLOCCLOSREAEXEWRITPOSITIOOPEAPPENRENAMCATALOMONOMOPRINMAXFILEFINBSAVBLOABRUVERIF!pppp p p p p`" t""#x"p0p@p@@@p@!y q q p@  LANGUAGE NOT AVAILABLRANGE ERROWRITE PROTECTEEND OF DATFILE NOT FOUNVOLUME MISMATCI/O ERRODISK FULFILE LOCKESYNTAX ERRONO BUFFERS AVAILABLFILE TYPE MISMATCPROGRAM TOO LARGNOT DIRECT COMMANč$3>L[dmx- ( >  Ϡ-@跻~!Wo*9~~~~ɬƬ~_ j ʪHɪH`Lc (L ܫ㵮赎 ɱ^_ J QL_Ls贩紎 DǴҵԵƴѵӵµȴ 7 ַ :ŵƴѵǴҵȴµ納贍﵎ٵ്ᵭⳍڵL^ѵ-I `  4 ò-յ!  8صٵ紭ﵝ 7L (0+BC  7L HH`LgL{0 HH` õL H hBL BH [ h`Lo õ ڬL B ڬ LʬH hB@ յյ [L (ȴ) ȴ 7L L ( L (ȴL{ƴѵ洩ƴǴҵ 7 ^* B0 HȱBh ӵԵ 8 L8 ݲ` ܫ  / / ED B  ]ƴS0Jȴ ȴ)  紅D贅E B ƴ  / 0L HΝ *`HD٤DEEhiHLGh ` ŵBѵ-` ѵB-` ܫI볩쳢8 DH E𳈈췍Ȍ X0 · JLǵBȵC`,յp` 䯩 R-յյ`յ0` K R-յյ`ɵʵӵԵ` 4 K ( ѵҵLBȱBL8` DBHBH : ַ޵BȭߵBhhӵԵ RBܵmڵ޵ȱBݵm۵ߵ` 䯩LR˵̵ֵ׵`êĪLR E( 8` R` ELRŪƪ`췌 յյI뷭鷭귭ⵍ㵍跬ª 뷰` Lf ݵܵߵ޵ ^`8ܵ i B8` 4L ֵȱB׵ ܯ䵍൭嵍 ` DȑB׵Bֵ  ַ յյ`굎뵎쵬 뵎쵌``õĵBCõĵ`µµ`L õBĵCصص Qƴ0"Bƴ 󮜳` 0۰ϬBƴ8`i#`ЗLw!0>ﵭ` m ﳐ 7i볍 8 ЉLw`H h ݲL~ `浍국䵍뵩嵠Jm赍嵊mjnnn浈ۭm浍浭m䵍䵩m嵍`"L ŵ8ŵH ~(` d ֠z#e original. If they are not identical, then Diversi-COPY beeps and gives a 'Compare Error'. Comparison mode works with 1-drive, 2-drives, formatting and mass production. At the end of a mass production session, we recommend that you compare your originaer 'C' will appear in the lower right corner of the screen. To leave comparison mode, hit 'C' again (the letter 'C' will disappear). While in comparison mode, Diversi-COPY does not write duplicates. Instead it compares an already written duplicate to th12 - Verify error / compressed data NOTE: To copy 40-track disks, hit '*' from the main menu (requires 40-track drives). *** Comparing Disks *** Diversi-Copy can compare 2 disks to see if they are identical. To enter comparison mode, hit 'C'. The lettdrive or motor speed error 2 - Write protected 3 - No address mark (D5 AA 96) 4 - Volume mismatch 5 - Wrong track 6 - Bad address data 7 - No data mark (D5 AA AD) 8 - Data checksum error 9 - No DE trailer 10 - No AA trailer 11 - Verify error / wrong byte 64K Apple II+ with an extra 128K card is just a little short of the 200K needed, but will work for almost all originals if a few sectors are unused. *** Error Numbers *** For the technically oriented, here is a list of possible disk errors: 1 - Empty already have a //e with a 64K extended 80-column card, then buy a 128K card from Titan, Legend, Omega, Prometheus or Abacus. The Abacus 128K card is the most versatile for the hobbyist (313 524-2444), but the other companies are larger and better known. A 192K 'Neptune' extended 80-column card may also be used. If you're buying a new computer for mass production, we suggest that you get a //e without an 80-column card. Then buy the 192K 'Neptune' extended 80-column card from Titan (313 662-8542). If you y full disks, however, you'll need to add extra memory to your computer. You need a total of about 200K to copy any disk. Diversi-COPY automatically recognizes the 64K extended 80-column card in the Apple //e, and all 16K and 128K cards in any slot. Thehe keyboard. While Diversi-COPY is writing to drive #2, put a new disk in drive #1, and vice-versa. *** Extra Memory *** You can mass-produce newly formatted disks on any computer, since Diversi-COPY will compress the unused sectors. To handle completel? @0@4@|@@@@˜ @@@@Ʃ@@z'@7@}Ɯ0LZα˜̜Μ Lz@P`p#ˠ͠ōL?@ALH0L HL,HȽ8HG }FH>ȱH?,+$8}`LIF}>թ}>}F𷍋1˜}@?>>??>Ȋ> PPROC THEN RETURN FROM HERE ^3 #PRSUSPPROCESS READY PSTATE,XSET IT SUSPENDED /RDYHEADSET UP MPTR MPTR+1 MULTFIV,X MPTR DQMEMDEQUEUE IT FROM RDYQ PPRIO,XGET PRIORITY NOERR50SET NO ERR & RETURN ; ; ; #;KILL: KILLS ERR50NO #$01 ERR50NO AGAIN PSTATE,XTEST PROCESS STATE #PRCURRCURRENT, LEGAL >2 #PRREADYREADY, LEGAL >3 ERR50ELSE STATE ILLEGAL "^2 #PRSUSPPROCESS CURRENT PSTATE,XSET IT SUSPENDED $STOPPROCAND RESCHED VIA STO  AND RETURN, ENABLING IRQ'S ; ; ; $;SUSPEND: SUSPENDS A PROCESS EITHER $; RUNNING OR READY.X-REG HOLDS PROC $; ID. IF RUNNING, RESCHED IS CALLED ; SUSPEND DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #NPROCPROCESS ID LEGAL?USP ERR50NO, RETURN ERROR "READYPLACE PROC ON READY QUEUE PPRIO,XGET PRIORITY #NOERR50 #MEMOUTREMOVE PAGED MEM SBANK2 SET NO ERROR ENABLE INTERRUPTS AND RETURN #ERR50 #MEMOUTREMOVE PAGED MEM SBANK2 ERROR, SET SYSERR !; TO READY, AND PLACES IT ON THE "; READY QUEUE.X-REG HOLDS PROC ID ; RESUME DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #NPROCIS PROCESS ID LEGAL? ERR50 #$01 ERR50ILLEGAL, ERROR !PSTATE,XIS PROCESS SUSPENDED? #PRS****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 5 * * * ****************** ; ; ; ; ; ; ";RESUME: SETS A SUSPENDED PROCESS       UMENTED EXTERNALLY! ; VMEMFREEMEMFREE VMEMBLK MEMBLOCK ; ; UWAK WAKEAT USLP SLEEP UTGETC TTYGETC UBSND BSEND UBRD BREAD UBDLT BDELETE UBRST BRESET UBFBUF FINDBUF UBDP BDUMP UBLD BLOAD ;  !;FOLLOWING IS A LIST OF NON-USER ; JUMPS, WHICH SHOULD NOT BE ; DOCPPROC URSUME RESUME USUSP SUSPEND UKILL KILL UCTE CREATE UGETPD GETPID URET USERRET UCHPR CHPRIO UWAIT WAIT USIGN SIGNAL USCRT SCREATE USDLT SDELETE USEND SEND URECV RECEIVE UREVC REVCLRFOLLOWING IS A LIST OF SYSTEM ; POINTERS, WHICH WILL NOT BE ; MOVED BY ANY ASSEMBLY. THIS ; ALLOWS ROUTINES TO BE CALLED ; EVEN IF THEY ARE THEMSELVES ; PHYSICALLY MOVED. ; ; *UBOOT BOOTONLY USED DURING DISK BOOT URDY READY USTP STOB****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * *SYSTEM POINTERS* * * ****************** ; ; ;  $D000FINALLY UPSTAIRS!  $800 ; ; ;   òϠЮϠҮÍРҳÍРҴÍРҵÍРҶÍРҷÍРҸÍɍ̠ծòծñϠұÍРұÍРұÍРұÍР̮ǍРͮǍծ X ^3 <1 >2AND RESCHED ; SAVKEY WRITMEMWRITE TO ROM WRITMEM !#$03BEFORE SAVING INTO BUFFER %^7 OLDKEY,XREPLACE SOME KEYS >8WITH OTHERS NEWKEY,X ^8 <7 BUFCNTNOW BUFCNTSAVE IT IN THE BUF,XKEYBTICKNO, JUST A TICK KYBDSTRBTURN KYBD OFF #$FFA BREAK? SAVKEYNO, SAVE THE KEY &SUSPALL #$0FYES, SUSPEND ALL PROCS ^1 PSTATE,X #PRCURRIF PROC CURRENT >2 #PRREADYOR READY >3 !^2 #PRSUSPTHE SUSPEND IT PSTATE,ER. IT CHECKS %; TO SEE IF A RESCHED IS NEEDED, AND ); ALSO CHECKS IF THERE ARE ANY PROCESSES ; THAT NEED TO BE AWOKEN. ; ; IRQHNDLRACCGET A-REG BACK REGASTORE IN ZPG REGXX-REG TOO #MEMINBRING PAGED SBANK2MEM IN KYBDA KEYPRESS? YLOTO CURRENT HOUR #$18>23, THEN >2 #$18SUBTRACT 24 ^2 RETURN TO Y-REG REGAGET MINS BACK WAKE2AND NOW SLEEP IT ; ; ; $;IRQHNDLR: THIS IS THE ROUTINE THAT (; HANDLES EVERY IRQ. IT POLLS THE KYBD, *; AND SAVES KEYS IN THE BUFF MIN,HRS DELAY TIME ; SLEEP DISABLE INTS REGASAVE MINUTES #MEMINPAGED.MEM IN SBANK2 ADD MINUTES TO REGA CLOCKHICURRENT MINUTES #$3C>59, THEN >1 #$60SUBTRACT 60 ^1 REGASAVE TEMPORARILY NOW ADD HOURS DAYES, STOP THEN ^2 #MEMOUTPAGED MEM OUT SBANK2 SET NO ERRORS SET INTS AND RETURN ; ERR100 #MEMOUTPAGED MEM OUT SBANK2 SET SYSERR  AND RETURN ; ; ; ;SLEEP: PUTS A PROCESS TO SLEEP ; X-REG = PROCESS ID ; A,Y =PSTATE,XGET STATE #PRREADYON READY QUEUE? >1NO, SKIP /RDYHEADSO SET UP MPTR MPTR+1 MULTFIV,X MPTR !DQMEMAND DEQUEUE THAT PROCESS &^1 #PRSLEEPSET PROCESS ASLEEP PSTATE,X CURRPIDIS IT THIS PROCESS >2 STOPPROCREG = PROCESS ID ; A,Y = MIN,HRS TO REAWAKEN ; ; WAKEAT DISABLE INTS REGASAVE A TEMP #MEMIN SBANK2 REGA 'WAKE2 #NPROCCHECK A VALID PROC ID ERR100NO, EXIT #$01 ERR100NO, EXIT PTIML,XOK, NOW STORE TIME  PTIMH,X Y ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 10 * * * ****************** ; ; ; !;WAKEAT: PUTS A PROCESS TO SLEEP ; X-    LIST 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 ; ; ; 4000BUFFER POOL'S BASE ; ; ; NO. 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 $10MAX NO. OF BUFS 'BUFAITHEAD $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 CONSTANTS ; 'TIKNO $08END $302PROCESS 'END' ADDRESS PRIORITY $304PROCESS PRIORITY NAME $305PROCESS NAME NARGS $30DNO. OF ARGUMENTS ; ; ; ;PROCESS NAMES BASE ADDRESS ; NAMELIST $5900 ; ; ; ;WAIT QUEUE CONSTANTS ; NSEM $20NO. OF SEMAPHORES 'WTER BUSY FLAG !SETTXT $FB39SET UP FULL TEXT TABV $FB5BDO A VTAB "SETPWRC $FB6FSET POWER-UP BYTE "SETKBD $FE89SET STDIN AS KYBD %SETVID $FE93SET STDOUT AS SCREEN ; ; ; ;PARAMETERS FOR CREATE ; PROCADDR $300PROCESS ADDRESS %PROCPAGES <1  AND RETURN ; ; ; RELEASE THE PAGES HELD BY THE !; PROCESS WHOSE PID IS IN X-REG. ; MEMCLR QPTRSAVE PID #$00START AT TOP OF MEM %^1 MEMLIST,YPAGE MARKED WITH QPTROUR PID? >2NO, SKIP #$00YES, SET PAGE FREE MEMLIST,Y ^2 LOOP THRU ALL ; #MEMARK PROCADDR+1GET START MSB #$D0A SHELL PROC? >2YES, DON'T MARK A HOLDS PID #^1 MEMLIST,YMARK PAGE USED PROCEND+1MARKED LAST PAGE? >2YES, EXIT ELSE MARK NEXT PAGE <1 ^2 AND RETURN ; ; ; &;MEMCLR:NO, CHECK FOR MORE ERR108 MEMLIST,XFREE PAGE? <1NO, START AGAIN <3ELSE MARK ANOTHER PAGE ; )^4 QPTR+1GET START OF FREE RANGE NOERR108AND RETURN ; ; ; $;MEMARK:MARK THE PAGES INDICATED BY #; PROCADDR & PROCEND. X HOLDS PID.  #$00START ON BOTTOM OF MEM ^1 MEMLIST,XFREE MEM? >2YES, SKIP IELSE LOOP <1 ERR108NO, NONE AVAILABLE ; %^2 QPTR+1SAVE START OF RANGE #$00SET 1 PAGE FREE SO FAR ^3 QPTRENOUGH PAGES? >4YES, RETURN ASE BUF $4000KEYBOARD BUFFER ; ; ; ;MONITOR ROUTINES & ABSOLUTES ; SOFTEV $3F2RESET VECTOR IRQV $3FEIRQ VECTOR KYBD $C000KEYBOARD INPUT KYBDSTRB $C010KEYBOARD STROBE LPROUT $C090PRINTER ADDRESS "LPRBUSY $C1C1PRINMONTH 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 BBUFS 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 DUMMY1+1YEAR BYTE AGS '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       X`_ZXXx }XXHXh_Z0Lx} X %ڰXXX_Z$8}X`x}XXi@oZ$oZ}}}X` RL`x}XX5i@oZoZ}} RL8} ` ϯӠ_Z`8`x }XXi@_Z0oZiZ oZ$8} X`  RL3x}XXi@_ZʹZoZ ZLnڹ_Z0 RLڬXXoZZ_ZLpLpx }XX_Z0}X` Fxéٍ  o֍ X ٩ [}@PX`XXXZU .ѩ[ .ѩXXX`_?_ ٙ Ax} (x}Lڠ ; ;I/O CONSTANTS &c ; $ETX $03END OF TEXT CHARACTER ESC $1BESCAPE CHARACTER ; ; ; ;AVAILABLE MEMORY MAP ; MEMLIST $5F00 ; ; ; ;DOS EQUATES ; "CURDIR $F680CURRENT DIRECTORY ; ; ;  I ; ; ;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 ; ; E 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 ;; ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SYSTEM CONFIG * * * ****************** ; ; ; ;ZERO PAGE VARIABLES ; QPTR $FAQUEULISTS ETC ; NBUF $10MAX 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 ; ; SED ; ; ; ;CLOCK CONSTANTS ; '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 CONSTANTS ; NSEM $20NO. 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&U CREATE ; PROCADDR $300PROCESS ADDRESS %PROCEND $302PROCESS 'END' ADDRESS PRIORITY $304PROCESS PRIORITY NAME $305PROCESS NAME NARGS $30DNO. OF ARGUMENTS ; ; ; ;PROCESS NAMES BASE ADDRESS ; NAMELIST $5900 ; ; ; ;WAIT QUEUE R KYBD $C000KEYBOARD 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;MEMORY CONSTANTS ; ; ; ; ;MISCELLANEOUS ; #NPROC $10MAX NO. OF PROCESSES 'PROCBASE $6000ZPG & STACK STORE BASE BUF $4000KEYBOARD BUFFER ; ; ; ;MONITOR ROUTINES & ABSOLUTES ; SOFTEV $3F2RESET VECTOR IRQV $3FEIRQ VECTO NUMPROC+1TICK COUNTER !CLKCNT 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 ; ; PROC ADDRESSES 'PBUFIN 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 ITIES 'PMSGL PPRIO+NPROCLIST 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+N $1C REGY $1D PC $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 PRIORREE $02SLOT IS FREE PRREADY $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 * ****************** ; ; ; ;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 PRFY AGAIN ; ERR154 SET SYSERR #MEMOUT SBANK2  AND RETURN ; ; ; ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * KERNEL CONFIG * * #$00RESET TO EMPTY INBUF,Y REGXSAVE X-REG #$00 "^1 (MPTR),YOK, LOAD BLOCK #MEMOUT SBANK2 (QPTR),Y #MEMIN SBANK2  <1DONE NOERR154AND EXIT ; WAIT3 QPTRGET REGS BACK QPTR+1 STOPPROC BLOADAND TR TO. ; BLOAD QPTR QPTR+1SET UP PTR #MEMIN SBANK2 CURRPID PBUFOUT,YGET OUT BUFID ERR154FREE, ERROR SAVE BUFID IN YREG  /BUFBASESET UP PTR IN MPTR MPTR+1 #$00 MPTR INBUF,YBUFFER EMPTY? WAIT3YES, WAIT <1DONE NOERR154SET OK REGXGET X-REG BACK #MEMOUT SBANK2  AND RETURN ; WAIT2 QPTRGET REGS BACK QPTR+1 STOPPROC BDUMPAND TRY AGAIN ; ; ; %;BLOAD READ 256-BYTES FROM BUFFER IF *; FULL. A,Y HOLD BASE ADDRESS TO LOADMPTR+1 #$00 MPTR INBUF,YBUFFER EMPTY? WAIT2NO, WAIT THEN #$FFYES, SET IT FULL INBUF,Y REGXSAVE XREG #$00OK, DUMP IT ^1 #MEMOUTMOVE MEM OUT SBANK2YUK, AWFUL AINT IT! (QPTR),Y #MEMIN SBANK2 (MPTR),Y  NTO OUR BUFFER %; IF EMPTY. A,Y HOLD BASE ADDRESS OF ; BLOCK TO DUMP. ; BDUMP QPTRSAVE POINTER QPTR+1 #MEMIN SBANK2 CURRPID PBUFIN,YGET OUT BUFID ERR153FREE, ERROR SAVE BUFID IN Y-REG  /BUFBASESET UP OUTPUT PTR CURRPIDSET SENDING PID PBUFIN,X PUT CURRPID IN A-REG BUFLIST,YSET WE OWN BUFFER REGXGET X-REG BACK NOERR153SET NO ERROR  24SKIP SEC ERR153 SET SYSERR #MEMOUT SBANK2  AND RETURN ; ; ; (;BDUMP: DUMPS 256-BYTES I ; FINDBUF REGXSAVE PROC ID #MEMIN SBANK2 #$01LEGAL PID? ERR153 #NPROC ERR153 $PBUFOUT,XPROC ALREADY RECEIVING? ERR153YES, ERROR GETBUFOK, GET A BUFFER ERR153NONE, ERROR OK SET RECEIVING PROCESS PBUFOUT,X YIS BUFFER USED ERR152FREE, ERROR ERR152LIMBO, EXIT #$00SET A TO 0 BCLEARAND CLEAR ALL PTRS ; ; ; );FINDBUF: USER CALL TO ALLOCATE A BUFFER '; BETWEEN THE CURRENT PROCESS, AND THE '; PROCESS IN THE X-REG. BUFID RETURNED ; IN THE Y-REG.RNED &; TO THE POOL. ALL REGS RETURN INTACT ; BRESET REGASAVE A&Y-REGS REGX #MEMIN SBANK2 CURRPIDGET OUT BUFID PBUFIN,Y SAVE IT #$00SET WE DON'T OWN A BUF PBUFIN,Y GET BUFID BACK USE AS OFFSET TO SEE BUFLIST,,YBUFFER USED? ERR152FREE, EXIT ERR152LIMBO, EXIT #BLIMBOSET BUFFER IN LIMBO BUFLIST,Y !CURRPIDNOW SET WE DONT OWN IT #$00 PBUFIN,Y NOERR152AND EXIT ; ; ; #;BRESET: RESETS THE BUFFER WE OWN. %; THE BUFFER IS IMMEDIATELY RETU PROCESS. THE BUFFER IS RETURNED $; TO THE BUFFER POOL WHEN ALL CHARS &; ARE READ. ALL REGS RETURN UNCHANGED ; BDELETE REGASAVE A-REG REGXAND Y-REG #MEMIN SBANK2 CURRPIDGET OUR BUFID PBUFIN,Y USE AS OFFSET TO SEE IF BUFLIST#$00THIS BUFFER ANYMORE PBUFOUT,Y REGYGET BUFID BCLEAR INBUF,YSET PTRS TO 0 OUTBUF,Y BUFLIST,YAND SET BUFFER FREE ; ; ; %ERR152 ERR151& EXIT WITH NO CHAR NOERR152ERR151 ; ; ; &;BDELETE: DELETES THE BUFFER OWNED BY &; THESAVE CHAR WE NEED X-REG REGYTO INCREMENT OUTBUF,XTHE POINTER RESTORE X NOERR151AND RETURN ; (BEMPTY BUFLIST,YIS BUFFER IN LIMBO? >1 STOPPROCNO, SO WAIT A BIT BREADAND TRY AGAIN ; '^1 CURRPIDOK, SET WE DONT HAVE SET UP PTR TO BUFFER /BUFBASE QPTR+1 #$00 QPTR REGYGET BUFID BUFLIST,YBUFFER FREE ERR151YES,EXIT OUTBUF,YGET BUF PTR INBUF,YIS BUFFER EMPTY? BEMPTYYES, DEAL WITH IT SET UP OFFSET (QPTR),YTO GET CHAR REGA; ; ; $;BREAD: GETS A CHAR FROM THE BUFFER #; WE ARE RECEIVING FROM. SYSERR IF (; BUFFER NOW FREE. REGS RETURNED INTACT ; BREAD REGXSAVE Y-REG #MEMIN SBANK2 CURRPIDGET THE BUFFER WE ARE PBUFOUT,YRECEIVING FROM REGYSAVE BUFIDE PTR UP ONE RESTORE X-REG NOERR151SET NO ERROR  24SKIP SEC ERR151 SET SYSERR #MEMOUT SBANK2 REGAGET A-REG REGXGET Y-REG  AND RETURN ; WAIT1 REGARESET REGS REGY STOPPROCSTOP PROCESS BSENDAND TRY AGAIN ERR151LIMBO, EXIT INBUF,YGET INPUT PTR #$01ADD 1 OUTBUF,YIS BUFFER FULL? WAIT1YES, WAIT USE PTR AS OFFSET RESTORE RIGHT VALUE REGAGET CHAR TO SEND (QPTR),YSTORE CHAR IN BUFFER SAVE X-REG REGYGET BUFID INBUF,XMOVA REGXSAVE Y-REG #MEMIN SBANK2 CURRPIDGET OUR PID PBUFIN,YGET OUR BUFID REGYSAVE IT FOR LATER USE  /BUFBASESET UP PTR TO BUF QPTR+1 #$00 QPTRDONE REGYGET BUFID BUFLIST,YIS BUFFER USED? ERR151FREE, EXIT ROR BUFLIST,YBUFFER FREE? <1NO, LOOP NOERR150SET NO ERRORS AND RETURN ERR150 SET SYSERR AND RETURN ; ; ; %;BSEND: SEND A MESSAGE TO THE BUFFER "; WE OWN, ALL REGS REMAIN INTACT. ; SYSERR IF ILLEGAL BUFFER. ; BSEND REGVER ; (; BUFLIST ;00=FREE, FF=LIMBO, ELSE PID ; INPTR ;LIST OF INPUT PTRS ; OUTPTR ;LIST OF OUTPUT PTRS ; ; %;GETBUF: GETS A BUFFER FROM THE POOL ; RETURNS BUFID IN Y-REG. ; "GETBUF #NBUFSTART AT LIST END ^1 ERR150NO FREE BUFS, ER * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 15 * * * ****************** ; ; ; ;IN PROCESS TABLE: ; *; PBUFIN ;WHICH BUFFER IS HELD BY SENDER +; PBUFOUT ; " " RECEITART AT LEFT END ^5 XT,YGET A CHAR COUTPRINT IT  ONE LESS CHAR <5LOOP CROUTEND WITH CR-LF AND RETURN ; ; ; -XT " Xinu O/S Version 7.1025" ; ; ; ****************** * * * XINU OPERATING *ESS DISABLE INTS AGAIN #MEMINAND BRING IN PAGED MEM SBANK2 READY2MAKE NULL READY  #MEMIN SBANK2 NEWPROCAND START IT UP ; NULNAME "Shell"NULL'S NAME  00PLUS END BYTE ; ; ; $XTITLE XTGET NO. CHARS IN TITLE #$01S NULLPROC#NULLPIDSET NULL PID #NULLPRIOSET PRIORITY PRIORITY #NULLSET UP ADDRESS PROCADDR /NULL PROCADDR+1 #$00 NARGSSET NO ARGUMENTS #$05SET UP THE NAME ^4 NULNAME,Y NAME,Y  <4 CREATE1CREATE THE PROCRITMEMLANG.CARD #$02TO SET CURDIR CURDIRTO ROOYTT #$60 CURDIR+1 AUXOUTPROTECT LANG.CARD MARKMEM #$FFMARK AVAILABLE #$02MEMORY ^5 MEMLIST,Y  #$08PAGES 2-7 <5 #$3FAND TOP 16K ^6 MEMLIST+$C0,Y  <6 CLKCNT "SETQUEUE/RDYHEADSET UP READY Q QPTR+1 #RDYHEAD QPTR NEWQUEUE /WAITHEADSET UP SEM Q QPTR+1 #WAITHEAD QPTR NEWQUEUE SETDATE #$01SET DATE TO DAYHI01-JAN-01 MONTH YEAR SETROOT WRITMEMWRITE ENABLE WOW DO $5800-$5FFF QPTR+1 #$60 ^2 (QPTR),Y  <2 QPTR+1 QPTR+1 <2DONE FREEPROC#PRFREESET ALL PROCS ^3 PSTATE,YFREE  #NPROC <3 SETTICK #TIKNOSET UP TICK TIKCNTCOUNTER #CLKNOAND ALSO CLOCK COUNTER MINNOW CLEAR MEMORY SBANK2 #$00SET OFFSET TO 0 QPTRSET OUR BASE TO $4000 #$40 QPTR+1 #$50AND TOP TO $5000 SET A TO 0 TOO ^1 (QPTR),YCLEAR MEM  <1 QPTR+1MOVE UP A PAGE QPTR+1FINISHED? <1NO, LOOP #$58N VECTOR SOFTEV+1POINTING TO BOOT #BOOT SOFTEV SETPWRCSET POWER-UP BYTE /IRQHNDLRSET UP IRQ VECTOR IRQV+1TO OUR ROUTINE #IRQHNDLR IRQV HOMECLEAR THE SCREEN XTITLEWRITE OUT TITLE #$16DO A VTAB 22 TABV "CLEARMEM#ME******* ; ; ';BOOT: CLEARS THE SYSTEM MEMORY, INITS -; THE RESET & IRQ VECTORS, SET ALL PROCESSES ); FREE, CREATES READY & WAIT QUEUES, AND ; CREATES THE NULL PROCESS. ; BOOT FIRST DISABLE INTS $C381DEPROTECT LANG. CARD /BOOTSET UP RESETO ERRORS  AND RETURN ; LPRSTR2 0D0A0A0A461B ; ; ; ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 13 * * * ***********N LIMBO? >5BUFFER FREE, END! LPR2NO, LOOP BACK ; #^5 #$0CEND, DO A FORM-FEED LPRWRITE !CURRPIDSET WE ARN'T RECEIVING #$00FROM THE BUFFER PBUFOUT,Y REGYSET BUF PTRS TO 0 INBUF,Y OUTBUF,Y #MEMOUT SBANK2 SET NFULL? >4YES, SKIP STOPPROCEMPTY, WAIT  #MEMIN SBANK2 LPR2AND TRY AGAIN ; &^4 REGAGET THE BUFFER ADDRESS LPRDUMPSEND IT TO LPR REGYGET THE BUFID #$00SET THAT WE'VE READ THE INBUF,YBUFFER BUFLIST,YIS BUFFER IHASIS OFF "^2 LPRSTR2,YAND DO 3 LF'S LPRWRITEAND A CR  <2 ; &LPR2 CURRPIDNOW FIND THE BUFFER PBUFOUT,YGET THE BUFID REGYSTORE THE BUFID  /BUFBASESET UP MSB IN REGA REGA ^3 REGYGET BUFID INBUF,YBUFFER #MEMIN SBANK2 GET NO. OF CHARS TO PRINT REGA #ESCSET EMPHASISED CHARS LPRWRITE #'E' LPRWRITE ^1 GET A CHAR LPRWRITEWRITE IT REGADEC NO. OF CHARS <1LOOP BACK  INSTALL PRINT DATE LATER  #$05TURN EMPELSE RETURN ; ; LPRSTR 05064E1B401B ; ; ; (;LPR: A >PROCESS< TO PRINT FILES TO THE ,; PRINTER. PRINTS ITS ARGUMENTS, THEN SKIPS (; A FEW LINES, THEN DUMPS THE RECEIVING *; BUFFER UNTIL IT IS DISUSED. LASTLY DOES ; A FORM-FEED. ; LPR UP A CHAR LOOP7 ^3 SET NO ERRORS AND RETURN ; ; ; &;LPRINIT: USED ONCE TO INITIALISE THE %; PRINTER. ALSO SETS PAGE BREAK SKIP ; LPRINIT LPRSTRGET LENGTH ^1 LPRSTR,YGET A CHAR LPRWRITEAND WRITE IT  <1LOOP BACK ALL #MEMIN SBANK2 LPRDUMPAND TRY AGAIN ; ^1 QPTR+1SET UP POINTER #$00TO BLOCK QPTRAND Y-REG LOOP7 (QPTR),YGET A CHAR #ETXEND OF TEXT? >3YES, OUT ^2 LPRBUSYLPR BUSY? <2 LPROUTNO, WRITE CHAR MOVE; ; ; ';LPRDUMP: DUMPS UP TO A 256-BYTE BLOCK +; TO THE PRINTER, RETURNS IF IT ENCOUNTERS %; AN ETX CHARACTER. Y-REG HOLDS PAGE ; NO. OF BLOCK. ALL REGS LOST! ; LPRDUMP LPRBUSYLPR BUSY? >1NO, SKIP STOPPROCYES, RESCHED SET UP AS A SYS CGET A CHARACTER #MEMOUT SBANK2 REGXGET X-REG BACK SET NO ERRORS  AND RETURN ; ; ; $;LPRWRITE: WRITES 1 CHAR TO THE LPR ; USES X-REG. ; LPRWRITELPRBUSYIS LPR BUSY? LPRWRITEYES, LOOP LPROUTNO, WRITE CHAR AND RETURN SBANK2 CURRPIDGET OUR PID TO KYBDPTR,XGET OUR KYBD PTR BUFCNTANY CHARS IN BUFFER? >1YES, GET ONE REGXNO, SO TRY AGAIN STOPPROC TTYGETC ; $^1 KYBDPTR,XMOVE OUR PTR UP AND SET UP THE OFFSET INTO THE BUFFER BUF,X:****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 12 * * * ****************** ; ; ; TTYGETC REGXSAVE X-REG #MEMIN                        ND LOOP BACK ; ; MONTHEND 00201D201F201F20 201F201F20 ; ; ;  "XINU.SRC2" DOWN ONE <3DONE LIST, EXIT PTIML,XSAME TIME? <5 CLOCKHI PTIMH,XSAME TIME? >7YES! ^6 CLOCKLORESTORE A <5AND CONTINUE ; !^7 PSTATE,XIS IT ASLEEP? #PRSLEEP <6NO, LOOP BACK READYYES, MAKE IT READY <6AMONTHINC MONTH MONTH #$0DCHECK 13 MONTHS? >4 #$01YES, RESET TO 1 NOT 0 MONTH YEAR YEAR #$64CHECK 100 YEARS? >4 YEARYES, RESET YEAR !^4 CLOCKLOLOAD CLOCK LSB ##NPROCSTART AT END OF TIME LIST ^5 MOVE  MONTH #$02IS IT FEB & LEAP? >2YES, GET SPECIAL VALUE !MONTHELSE USE MONTH AS OFFSET MONTHEND,XFOR END OF MONTH  CDSKIP INST ^2 #$1EFEB LEAP VALUE DAYHIENOUGH DAYS? >4 DAYHIYES, RESET DAYS DAYHISET TO DAY 1 INUTES CLOCKHICHECK 60 MINUTES? #$3C >4NO, SKIP CLOCKHIYES, RESET MINUTES DAYLOINC HOURS DAYLOCHECK 24 HOURS? #$18 >4NO, SKIP DAYLORESET HOURS DAYHIINC DAYS YEARBEFORE CHECKING DAY #$03GET MONTH + (YR=LEAP) IKCNT CLKCNTSERVICE CLOCK ROUTINE? CLOCKYES "^3 RESCHEDELSE RESCHEDULE ; CLOCK #CLKNORESET CLOCK CLKCNT CLOCKLOINC SECS CLOCKLOCHECK 60 SECONDS? #$3C >4NO, SKIP #$00YES, RESET SECONDS CLOCKLO CLOCKHIINC MTIKCNTDO A RESCHED? >2YES, SKIP #MEMOUTNO, REMOVE PAGED MEM SBANK2 REGXGET A & X BACK REGA RETURN TO PROCESS ; &^2 REGYSTORE REGS FOR RESCHED  REGP  PC  PC+1  REGS #TIKNORESET TICK COUNTER TREGASTORE IN ZPG REGXX-REG TOO KYBDA KEYPRESS? >1NO, SKIP KYBDSTRBTURN KEYBOARD OFF #MEMINPAGED MEM IN SBANK2 BUFCNTINC BUFFER COUNTER BUFCNTUSE AS OFFSET BUF,XSAVE KEY IN BUFFER ^1 #MEMINPAGED MEM IN SBANK2 THIS IS THE ROUTINE THAT (; HANDLES EVERY IRQ. IT POLLS THE KYBD, *; AND SAVES KEYS IN THE BUFFER. IT CHECKS %; TO SEE IF A RESCHED IS NEEDED, AND ); ALSO CHECKS IF THERE ARE ANY PROCESSES ; THAT NEED TO BE AWOKEN. ; ; IRQHNDLRACCGET A-REG BACK  ; SLEEP DISABLE INTS REGASAVE A TEMP #MEMINPAGED MEM IN SBANK2 REGA START ADDITION CLOCKLOADD CLOCK TIME REGAA TEMP SAVE  CLOCKHINOW ADD HI BYTES  REGAGET A BACK WAKE2AND NOW SLEEP IT ; ; ; $;IRQHNDLR:MOUTPAGED MEM OUT SBANK2 SET NO ERRORS SET INTS AND RETURN ; ERR100 #MEMOUTPAGED MEM OUT SBANK2 SET SYSERR  AND RETURN ; ; ; ;SLEEP: PUTS A PROCESS TO SLEEP ; X-REG = PROCESS ID "; A,Y = L,H DELAY TIME IN SECONDS ;EADYON READY QUEUE? >1NO, SKIP /RDYHEADSO SET UP MPTR MPTR+1 MULTFIV,X MPTR !DQMEMAND DEQUEUE THAT PROCESS &^1 #PRSLEEPSET PROCESS ASLEEP PSTATE,X CURRPIDIS IT THIS PROCESS >2 STOPPROCYES, STOP THEN ^2 #METIME TO REAWAKEN ; ; WAKEAT DISABLE INTS REGASAVE A TEMP #MEMIN SBANK2 REGA 'WAKE2 #NPROCCHECK A VALID PROC ID ERR100NO, EXIT #$01 ERR100NO, EXIT PTIML,XOK, NOW STORE TIME  PTIMH,X PSTATE,XGET STATE #PRR * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 10 * * * ****************** ; ; ; !;WAKEAT: PUTS A PROCESS TO SLEEP ; X-REG = PROCESS ID ; A,Y = L,H MEMINPAGED MEM IN SBANK2 CURRPIDGET PROCESS ID PHASMSGL,XHAVE A MESSAGE? ERR70NO, LEAVE PHASMSGL,XSET NO MESGS PMSGL,XGET MESG #MEMOUTOUT PAGED MEM SBANK2 CLEAR CARRY  AND RETURN ; ; ;  ****************** *GS #PRCURRSET STATE BACK TO PSTATE,XCURRENT PMSGL,XGET THE MESSAGE #MEMOUTOUT PAGED MEM SBANK2  AND RETURN ; ; ; ';REVCLR: CLEAR ANY MESSAGES, RETURNING ); MESG IN A-REG (AND CARRY CLEAR) IF ONE ; REVCLR DISABLE INTS ##MEMINBRING IN PAGED MEM SBANK2 &^1 CURRPIDGET CURRENT PROCESS PHASMSGL,XDO WE HAVE A MESG? >2YES, GET IT #PRRECVELSE WAIT FOR ONE PSTATE,X STOPPROCSTART A NEW PROC RECEIVEAND LOOP BACK ; !^2 PHASMSGL,XSET NO MSNOERR70NO, RETURN OK READYELSE SET PROCESS READY !NOERR70 #MEMOUTELSE RETURN OK SBANK2 SET NO ERROR  AND RETURN ; ; ; $;RECEIVE: SET A PROCESS WAITING FOR "; A MESSAGE, AND RETURN IT IN THE ; A-REG ; RECEIVE SET NO INTS SMSGL,XALREADY GOT A MSG? >2NO, GO ON 'ERR70 #MEMOUTERROR, OUT PAGED MEM SBANK2 SET SYSERR  AND RETURN ^2 REGAGET MESSAGE BACK PMSGL,XAND STORE IT PHASMSGL,XSET A MESG SENT PSTATE,XPROCESS RECEIVING? #PRRECV E, X-REG HOLDS ; PROCESS ID. ; SEND SET NO INTS REGASTORE MSG TEMORARILY #MEMINPAGED MEM IN SBANK2 #$00PROCESS ID TOO SMALL? ERR70 #NPROCPID TOO BIG? ERR70 PSTATE,XIS PROCESS FREE? #PRFREE ERR70YES, ERROR PHA * * BY W.TOOMEY * * * * CHAPTER 7 * * * ****************** ; ; ; ; !;SEND: SENDS A 1-BYTE MESSAGE TO !; ANOTHER PROCESS, PUTTING IT ON &; THE READY QUEUE IF IT IS RECEIVING. #; A-REG HOLDS MESSAGMULTFIV,YSET UP MPTR AGAIN MPTR /WAITHEAD MPTR+1 <3AND TRY NEXT NODE ^6 #MEMOUTOUT PAGED MEM SBANK2 SET NO ERRORS  AND RETURN ; ; ; ****************** * * * XINU OPERATING * * SYSTEM * * S, OUT ELSE LOOP <4 <3ERROR, DO NEXT NODE ^5 REGXSAVE X&Y-REGS REGY DQMEMDEQUEUE NODE REGYGET PROCESS ID READYAND PUT IT ON READYQ #MEMINBRING PAGED MEM IN SBANK2READY PUTS IT OUT REGXGET REGS BACK REGY NE ^3 #$01GET NEXT NODE (MPTR),Y #WAITTAIL EOF QUEUE? >6YES, FINISHED MPTR GET SEMAPHORE ID  (MPTR),YIS IT OURS? <3NO, DO NEXT NODE CALCPID3MPTRCALC PROCESS ID #NPROC #^4 MULTFIV,YRIGHT PROCESS? >5YER61 #NSEMTOO BIG? ERR61 SEMLIST,XIS IT FREE? >2NO, GO ON ERR61 #MEMOUT SBANK2PAGED MEM OUT SET SYSERR  AND RETURN ^2 #SFREESET SEM FREE SEMLIST,X /WAITHEADSET UP WAIT HEAD MPTR+1 #WAITHEAD MPTRDO NO ERRORS  AND RETURN ; ; ; #;SDELETE: DELETES A SEMAPHORE, AND #; RELEASES ALL PROCS WAITING ON IT !; TO THE READY STATE.X-REG HOLDS ; SEMAPHORE ID ; SDELETE DISABLE INTS #MEMINPAGED MEM IN SBANK2 #$00SEMAPHORE TOO SMALL? ER#NSEMFIND A SEMAPHORE ^1 SEMLIST,XIS IT FREE? >3YES  <1ELSE LOOP ERR61ERROR, RETURN $^3 #SUSEDSET SEMAPHORE USED SEMLIST,X  SEMCNT,XSET UP COUNT #MEMOUTPAGED MEM OUT SBANK2 GET SEM ID IN A-REG SETORS ; ; ; %;SCREATE: FINDS, IF POSSIBLE, A FREE &; SEMAPHORE, AND MAKES IT USED. Y-REG $; HOLDS INITIAL COUNT OF SEM. A-REG ; RETURNS WITH SEMAPHORE ID ; SCREATE DISABLE INTS #MEMINPAGED MEM IN SBANK2 #$00COUNT <0? ERR61YES, ERROR ,YRIGHT PROCESS? >5YES, OUT  <4ELSE LOOP ERR60ERROR, LEAVE #^5 REGYSUCCESS, SAVE Y-REG DQMEMDEQUEUE NODE REGYGET PROCESS ID IN X-REG READYRETURN IT TO RDYQ #STOPPROCAND RUN ANOTHER PROCESS NOERR60AND RETURN NO ERRPTR+1 #WAITHEAD MPTR ^3 #$01GET NEXT NODE (MPTR),Y #WAITTAILEOF QUEUE? ERR60YES, ERROR MPTR GET SEMAPHORE ID IS IT OUR SEM? (MPTR),Y <3NO, DO NEXT NODE CALCPID2MPTRCALC PROCESS ID #NPROC #^4 MULTFIVNBRING IN PAGED MEM SBANK2 #$00SEMAPHORE ID TOO SMALL? ERR60 #NSEMTOO BIG? ERR60 SEMLIST,XIS IT FREE? ERR60YES, ERROR %^1 SEMCNT,XINCREMENT THE SEM >2 NOERR60 >0 RETURN OK &^2 /WAITHEADSET UP WAITQ HEAD M THE SEM, ; IF IT IS STILL NEGATIVE $; **NB - SINCE WE DON'T HAVE QUEUES &; FOR EACH SEM, WE MUST SEARCH %; THRU THE WAIT Q FOR THE 1ST $; PROCESS WAITING ON THE SEM ; X-REG HOLDS THE SEMAPHORE ID ; SIGNAL DISABLE INTS #MEMI0PLACE SEM ID IN NODE  (MPTR),Y ENQUEUEADD NODE TO THE TAIL STOPPROCAND RUN ANOTHER PROC #NOERR60 #MEMOUTREMOVE PAGED MEM SBANK2 SET NO ERRORS   ; ; ; ';SIGNAL: SIGNAL A SEMAPHORE, RELEASING (; THE FIRST PROCESS WAITING ONSEMCNT,XDEC SEM COUNT NOERR60 IF >=0 RETURN !CURRPIDELSE MAKE PROCESS WAIT #PRWAIT PSTATE,YSET ITS STATE $/WAITTAILSET UP QPTR TO WAITTAI; QPTR+1NODE MPTR+1 #WAITTAIL QPTRDONE MULTFIV,YSET UP NODE IN MPTR MPTR #$0ISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #$00IS SEM TOO SMALL? ERR60 #NSEMTOO BIG? ERR60 SEMLIST,XSEMAPHORE FREE? >2NO, GO AHEAD #ERR60 #MEMOUTREMOVE PAGED MEM SBANK2 SET ERROR  AND RETURN !^2 * * BY W.TOOMEY * * * * CHAPTER 6 * * * ****************** ; ; ; ; &;WAIT -MAKES THE CURRENT PROCESS WAIT &; ON A SEMAPHORE I.E PLACES IT ON THE $; WAITING QUEUE. X-REG HOLDS SEM ID ; WAIT DNK2 PUT OLDPRIO IN A-REG SET NO ERRORS ENABLE INTS AND RETURN ; ; ; MULTFIV 00050A0F*5 TABLE 191E23282D 32373C4146  4B50555A5F64 ; ; ; ****************** * * * XINU OPERATING * * SYSTEM * * PSTATE,XPROCESS STATE LEGAL? #PRREADYREADY, GIVE ERROR <1 #PRCURRCURRENT, GIVE ERROR !<1ELSE WE CAN CHANGE PRIORITY #MEMINBRING IN PAGED MEM SBANK2 PPRIO,XGET OLD PRIORITY PPRIO,XSAVE NEW ONE #MEMOUTREMOVE PAGED MEM SBAREG HOLDS NEW PRIORITY. ; X-REG HOLDS PROCESS ID ; CHPRIO DISABLE INTERRUPTS #NPROCIS BAD PROCESS ID? >1YES #$00 >1BAD AGAIN #$01PRIORITY <=0 ? >2NO, CONTINUE ^1 SET SYSERROR ENABLE INTS AND RETURN (^2 RRPID #MEMOUTREMOVE PAGED MEM SBANK2 AND RETURN ; ; ; $;USERRET: ALL PROCESSES RETURN HERE !; WHEN THEY FINISH, TO KILL THEM ; $USERRET GETPIDGET THE PROCESS ID KILLAND KILL IT ; ; ; ";CHPRIO: CHANGE THE PRIORITY OF A $; PROCESS.A-D #NPROC-1SET X TO TOP PID $^2 PSTATE,XIS PROCESS FREE? #PRFREE <1YES, RETURN  <2 ELSE SET SYSERR RETURN ; ; ; ";GETPID: GETS THE CURRENT PROCESS ; ID IN THE X-REG ; $GETPID #MEMINBRING IN PAGED MEM SBANK2 CU, ERROR #$B8>#$B8 >2YES, ERROR ^1 SET NO ERROR AND RETURN ^2 SET SYSERR AND RETURN ; ; ; ";NEWPID: FINDS A FREE PROCESS ID, "; AND RETURNS IT IN THE X-REG. IF ; NONE AVAILABLE, SETS SYSERR ; BEFORE RETURNING ; $NEWPIREGAGET PID BACK IN X-REG #MEMOUTREMOVE PAGED MEM SBANK2 ENABLE INTERRUPTS  ; %;ISODD: CHECKS WHETHER PROCESS-TO-BE $; HAS A VALID BASE ADDRESS.RANGE IS ; (FOR NOW) $300-$B800 ; "ISODD PROCADDR+1GET ADDR MSB #$03<#$03 >2YESEGAGET BACK PID*2 NOW COPY ZERO PAGE /PROCBASE MPTR+1SET UP MPTR #$00 MPTR ^5 $0000,Y (MPTR),Y  <5DONE, NOW SWAP STACKS MPTR+1 ^6 $0100,Y  (MPTR),Y $0100,Y  (MPTR),Y  <6DONE, NOW RETURN RE ARGS REGXINTO REGX NARGSGET NO. OF ARGUMENTS REGYSAVE INTO REGY >4NONE, SKIP ^3 NARGS,XGET ARGUMENT AND PUSH ON TO STACK  <3AND LOOP $^4 STACK SET UP, SAVE S-REG REGS TPTRGET OUT STACK PTR BACK  RACK PTR TPTRIN TPTR (TEMP) #$FFSET STACK ALL FREE  #$30SET UP REGP REGP PROCADDRAND RTI ADDRESS PC PROCADDR+1 PC+1 !/USERRETSET UP RETURN ADDRESS FOR EXIT &#USERRET-1THIS MUST PT TO USERRET!  STORE S-REG BEFO #$07ONLY 8 CHARS! >9 NAME,YGET CHARS (QPTR),Y <1IF CHAR=0 THEN END &^9 SAVE OUR STACK, AS WE WILL BE MODIFYING IT /PROCBASE+$100 MPTR+1 #$00 MPTR ^2 $0100,Y (MPTR),Y  <2DONE STORE THE STSET UP PRIORITY PPRIO,X PROCADDRSET UP ADDRESS PADDRL,X PROCADDR+1 PADDRH,X NARGS PARGS,XSET UP # OF ARGS SET UP PTR TO NAME  X HOLDS PID*2  MULT BY 8 QPTR /NAMELIST QPTR+1DONE #$FFNOW MOVE NAME ^1 LID WAS BCS ERR51  PRIORITYIF PRIORITY=0 ERR51THEN ERROR NEWPIDGET A NEW PROC ID ERR51NONE, ERROR & RETURN *CREATE1 NUMPROCADD 1 TO # OF PROCESSES REGASTORE PID IN REGA #PRSUSPSET PROCESS SUSPENDED PSTATE,X PRIORITYE PLACED IN PROCADDR, ; PRIORITY, NAME & NARGS, PLUS ; ARGUMENTS. !; WHEN PROC STARTS, A-REG = PID, ; Y-REG = # ARGS, X-REG = S-REG ; BEFORE ANY ARGS. ; CREATE DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 ISODDCHECK IF ADDRESS VA^5 #PRFREEPROCESS READY PSTATE,XSET PROCESS FREE /RDYHEADDEQUEUE THE NODE MPTR+1 MULTFIV,X MPTR DQMEM NOERR51SET NO ERRS & RETURN ; ; ; ; ; #;CREATE: CREATES A NEW PROCESS, IF !; A FREE PROCESS ID.PROCESS INFO ; MUST BAND RETURN #ERR51 #MEMOUTREMOVE PAGED MEM SBANK2 SET SYSERR ENABLE INTERRUPTS AND RETURN %^3 #PRFREEPROCESS IS CURRENT PSTATE,XFREE PROCESS !STORPAGRESCHEDULE VIA STORPAG &^4 DONT KNOW WHAT TO PUT HERE YET! PSTATE,XWHAT'S PROCS STATE? #PRCURRCURRENT >3 #PRWAITWAITING FOR SEMAPHORE >4 #PRREADYREADY >5 ##PRFREEELSE JUST SET STATE=FREE PSTATE,X #NOERR51 #MEMOUTREMOVE PAGED MEM SBANK2 SET NO ERROR ENABLE INTERRUPTS LDS ; PROCESS ID. ; KILL DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #NPROCBAD PROCESS ID? ERR51 #$01 ERR51BAD AGAIN !PSTATE,XPROCESS ALREADY DEAD? #PRFREE ERR51YES #NUMPROCLEGAL,DEC # OF PROCESSES '^1 OCESS READY PSTATE,XSET IT SUSPENDED /RDYHEADSET UP MPTR MPTR+1 MULTFIV,X MPTR DQMEMDEQUEUE IT FROM RDYQ PPRIO,XGET PRIORITY NOERR50SET NO ERR & RETURN ; ; ; #;KILL: KILLS A PROCESS AND REMOVES !; IT FROM THE SYSTEM.X-REG HOST PROCESS STATE #PRCURRCURRENT, LEGAL >2 #PRREADYREADY, LEGAL >3 ERR50ELSE STATE ILLEGAL "^2 #PRSUSPPROCESS CURRENT PSTATE,XSET IT SUSPENDED $STOPPROCAND RESCHED VIA STOPPROC THEN RETURN FROM HERE ^3 #PRSUSPPRD: SUSPENDS A PROCESS EITHER $; RUNNING OR READY.X-REG HOLDS PROC $; ID. IF RUNNING, RESCHED IS CALLED ; SUSPEND DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #NPROCPROCESS ID LEGAL? ERR50NO #$01 ERR50NO AGAIN PSTATE,XTEREADY QUEUE PPRIO,XGET PRIORITY #NOERR50 #MEMOUTREMOVE PAGED MEM SBANK2 SET NO ERROR ENABLE INTERRUPTS AND RETURN #ERR50 #MEMOUTREMOVE PAGED MEM SBANK2 ERROR, SET SYSERR  AND RETURN, ENABLING IRQ'S ; ; ; $;SUSPENEG HOLDS PROC ID ; RESUME DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #NPROCIS PROCESS ID LEGAL? ERR50 #$01 ERR50ILLEGAL, ERROR !PSTATE,XIS PROCESS SUSPENDED? #PRSUSP ERR50NO, RETURN ERROR "READYPLACE PROC ON PERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 5 * * * ****************** ; ; ; ; ; ; ";RESUME: SETS A SUSPENDED PROCESS !; TO READY, AND PLACES IT ON THE "; READY QUEUE.X-R01ADDRESS TO REFLECT PCTHE DIFFERENCE BETWEEN A 'JSR' ADDRESS AND AN #$00INTERRUPT ADDRESS PC+1 REGXSTORE X-REG REGYSTORE Y-REG STORE STACK POINTER REGS RESCHED ; ; ; ; ****************** * * * XINU OEW ; PROCESS. IF IT IS CALLED BY A ; 'JSR NEWPROC', THEN EXECUTION ; OF THAT PROCESS WILL CONTINUE ; AFTER THE 'JSR' INSTRUCTION. ; STOPPROCPUSH PROCESSOR DISABLE INTERRUPTS REGASTORE A-REG  REGP  NOW INCREMENT THE SAVED #$INSERTAND INSERT #MEMOUTPAGED MEM OUT SBANK2 SET NO ERRORS ENABLE INTS ^2 '^3 #MEMOUTERROR, PAGED MEM OUT SBANK2 SET SYSERR  AND RETURN ; ; ; !;STOPPROC: SAVES CURRENT PROCESS ; REGS, AND RESCHEDULES A N MEM IN SBANK2 #NPROCILLEGAL PROCESS ID? >3YES #$00 >3YES, ERROR READY2 #PRREADY PSTATE,XSET PROCESS READY /RDYHEADAND SET UP QPTR QPTR+1 MPTR+1AND MPTR #RDYHEAD QPTR MULTFIV,X MPTR PPRIO,XGET PRIORITY AND PROCESS REGISTER PCONTO THE STACK  REGP  REGAALL REGS NOW BACK ENABLE INTERRUPTS RETURN TO PROCESS ; ; ;READY: PLACES A PROCESS ON THE #; READY QUEUE; X-REG HOLDS PROC ID ; READY DISABLE INTERRUPTS #MEMINPAGEDMPTR),YGET ZPG MEMORY BACK $0000,Y  #$FC LOOP5 #$00 MPTR+1NOW RESTORE STACK LOOP6 (MPTR),Y $0100,Y  LOOP6DONE #MEMOUTRESET MEMORY SBANK2 ; "GETREGS REGSGET REGISTERS BACK  REGX REGY PC+1RESTORE PC PPRIO,YAND STORE IT #PRCURRSET PROCESS RUNNING PSTATE,Y ; ; %LOADPAG GET NEW PROCS ZPG & STACK GET PROCESS IN A-REG SHIFT FOR CORRECT ADDRESSING %/PROCBASEGET CORRECT BASE ADDRESS MPTR+1 #PROCBASE MPTRDONE 'LOOP5 (TR /RDYHEAD QPTR+1 GETLASTA-REG HOLDS PRIORITY TEMP STORE PPRIO CALCPID MPTRCALC PROCESS ID #NPROC #LOOP4 MULTFIV,YRIGHT PROCESS? >1YES,OUT ELSE BRANCH BACK LOOP4 %^1 CURRPIDSTORE CURRPID DOWN GET BACK PPRIOE SET IT TO READY STATE PSTATE,X /RDYHEADINSERT IT INTO RDY Q QPTR+1 MPTR+1 MULTFIV,XSET UP NODE MPTR #RDYHEAD QPTRRDYHEAD SET UP PPRIO,XGET PRIORITY IN AREG INSERTDONE ; +NEWPROC #RDYHEADNOW GET HIGHEST PROCESS QPP2 $0000,YMOVE ZPG MEMORY (MPTR),Y  LOOP2DONE MPTR+1INCREMENT BASE LOOP3 $0100,YNOW DO STACK (MPTR),Y  %LOOP3DONE, NOW ITS AN OLD PROCESS $PSTATE,XWAS OLD PROCESS RUNNING? #PRCURR NEWPROCNO, BRANCH %#PRREADYTHYQ !PPRIO,XTAIL KEY0 IF NOT EMPTY ; ; $;FIRSTKEY: QPTR HOLDS HEAD OF QUEUE ; FIRSTKEY#$01GET 'NEXT'* XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 3 * * * ****************** ; ; ; ; ; ;ISEMPTY: TESTS IF A QUEUE IS ;EMPTY OR NOT. QPTR HOLDS HEAD ;OF THE QUEUE ; ) UWAK WAKEAT USLP SLEEP UTGETC TTYGETC UBSND BSEND UBRD BREAD UBDLT BDELETE UBRST BRESET UBFBUF FINDBUF UBDP BDUMP UBLD BLOAD ;       ; ; ; ****************** * * PPROC URSUME RESUME USUSP SUSPEND UKILL KILL UCTE CREATE UGETPD GETPID URET USERRET UCHPR CHPRIO UWAIT WAIT USIGN SIGNAL USCRT SCREATE USDLT SDELETE USEND SEND URECV RECEIVE UREVC REVCLRFOLLOWING IS A LIST OF SYSTEM ; POINTERS, WHICH WILL NOT BE ; MOVED BY ANY ASSEMBLY. THIS ; ALLOWS ROUTINES TO BE CALLED ; EVEN IF THEY ARE THEMSELVES ; PHYSICALLY MOVED. ; ; *UBOOT BOOTONLY USED DURING DISK BOOT URDY READY USTP STOSZ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * *SYSTEM POINTERS* * * ****************** ; ; ;  $D000FINALLY UPSTAIRS!  $800 ; ; ;                                                  "XINU.SRC1" tem 10/10/87"  "XINU.SRC1" A FF WOW LETS KEEP GOING FOR A BIT LONGER THEN ?????? STOP PLEASE !!!!! OK STOP ENOWF ݩX `HELLO THIS TIME I WONT DO ANY NASTY CARRIAGE RETURNS TO STUFF UP THE PRINTER, AND SOON THE PROGRAM WILL STOP AND YOUU WILL MISS THE END OF A SENTENCE SOA. NOT YET! GOOD SO LETS RAVE ON AND ON NOW THATS WHAT I CALL A DEAD PARROT !!! STILL MORE STU  @,* WT # ( ! ) ) (` !x} )@ )}X` # &   " " !3 ( ) ) (` j) j)`, ( ' ' (` A( L `OAAC 8%AA ` v% L B L$`' ɠš  O $@ACB@ $AA `@C V$B L$`' ɠš ( i$H(H)H$()X  JX  JX  JX  JX X  JX X h)h(h$`L !Lz# @Ųà Ҳ Ԡ Юծñ\ ծò< ծʠ!Ҹà   ͠ Ǡ ƠƲͱ٠Ҡ  ҷà  ұàұà ұà ! ұà"ŮàŠ  ̮ǠͮǠ ҮàҳàҴàҵà Ҷàֲ ͮŮ2 ͮŮ ԠР̠͊͠ :,6)2(.+*-&;" */|^& =#8``HHHJ eeffff㥨hhh`HHH&&&8呪咐樈㥨hhh` ȹ  a)ߝ `LLLL L8`Ӄ&͊`8`U͊b͊l͊~͊͊hhhhLЅv vȹv , 8`0:a{)AG`8`A[ a{)8``ȹ ,ڐ ȹ ,ڐȹ ' # SILLEGAL IMMEDIATE HEX DATAhhL8`ȹ # SILLEGAL IMMEDIATE ASCII DATALLխDLL 8` ݐ ` 1  8`hh SCOMMENT NOT ALLOWED HERELLٹ ,ڐ'ȹ ,ڰ SNOT ENOUGH DIGITS.hhL   SILLEGAL HEX DIGIT.hhL8` SILLEGAL OPERAND / INSTRUCTION TYPEhhLй'" SILLEGAL STRING, (ȹ f(`L`8``L f֐,ȹL,ع'" f֐ȹ,пL? LOع hh SMISSING OPERANDL# fֹL/ fL'" L fֹ,ȹL 0 ȹLhh SEXTRA STUFF IN OPERAND FIELDL8`Cȹ';ȩyLr"ȹ $ȹ"ȩyLr;y L`8`yȹ Jڙ ܐ SLABEL TOO LONG`+- fְ`*/&|^=#), ;`8`  08 ِ7ݰ3 f`  8` f `8` fְ`,)`Lȹ)X$Y+hh SONLY "X" OR "Y" ALLOWEDLЙLՙLթy* ȩyLr$yȹ ,ڰLr`><ȹ LAȹLr!-Ȣyȹ Lr`%yȹ01Lr` JڰS'ȹ OL IN OPERAND FIELDLЩ fְ`L fְ`){,%hh SMISSING ",X)", "),Y", OR ")"Lȹ)X!hh SONLY "(,X)" ALLOWEDLЙȹ)hh SMISSING ")"LЩLȹ , `8`ȹ)Yhh SONLY (),Y ALLOWEDLЙȹ ԩ ȹRrLӭɾ.ȹ ,ڰ"hh SILLEGAL SWEET-16 REGISTERLLȩ ,ڰL"ȹ,` fֈLչ ;Lԩ8` fְ`Lչ#L/L(L# L` JڐL*L$L'L"L!L%L<>Lhh SILLEGAL SYMB  L+ӥxt8`xrirsLҤt` uɖLɲLɿL԰LذLjLL&'# `L׹ !;hh SOPERAND NOT ALLOWEDLЩ8`R)r%@)hh SILLEGAL SWEET-16 OPERANDLЩLLҭrs Ґ /Ӱ SILLEGAL OPERAND.L ڰ SILLEGAL ADDRESSING MODE.LИH ;* + SILLEGAL BLANK IN OPERAND FIELDhLЩhH uh   t  `txtr=a)r : SBAD LOCAL LABELLЍ^Lj Jڰ SBAD CHARACTER IN LABELLй Jڙ=#  ܐ:Ź: LLј  : `  JڰV.=E SILLEGAL MNEMONIC.LйD/ ( SLABEL NOT ALLOWED HERELЩ0LLGLLLNݬi( SMEMORY FULL`e` ^ **ERROR: ` Q 8``   L Q  `*; Ȍ `^<                  Lz{|ߦ X0 Ǡpd Le L|LĠͮŮİĠͮŮİ L`ӠĠͮŬ` i`LЭLЭ'( o 1 o 2 L 쭀 Э` **END OF PASS `@ `󅯩L8e |MISSING 'END'LȱL!;*à L! &eheh`I0  eI0`HHH hhh`HHHLhhh`Yh" $pLTҥLҥ ALLL|LL뭀 ` 2H7 hLh ɰ, fhh` d' { 0`:0`` G [ i LQ ``HHH  fL~) B 2 4 " fƩ/ f b L| Lꥇ fL L fL bhhh`H&H&( )? (`@#05餆`޼άݍ``L麥` G [ iLQ f L` G [ i LQ`Hȱh` G [ i LQ G JLQHH8M ACUM  ADDR  IMMD  INDJ  INDX  INDY  IDXX  IDXY ;: ;: IDXY 0D1 IXY5 #$CE IXY6 IXY1 ;: LwLuLgL,LBL LrLLfLKLLL[Li鄅H ɓ)I(Lɛ  L H(h)h` IAIA `$N 2.5D -- 64K L/B@fm BLOAD ,A$ ZL BAD FILENAME ` LHH 8 hhL8@> BSAVE ,A$ Z ,L$ ` 88 1 1 L L!;: ACCh aɻ e 1`8 a L;fj a Ld ة-Vʩ/V X LAZER SYSTEM'S INTERACTIVE SYMBOLIC ASSEMBLER (C) 1981 LAZER SYSTEMS VERSIODREQUORGOBJEPZSTRDCMASCICLENDLSTNLSHEXBYTHBYPAUDFSDCIPAGINVBLKDBYTTLSBCLET.IF.EL.FI= PHSDPH.DAGENNOGUSRLȱ0M*;L00 H :hL : Lh:L a aL )H hemmH BCCBCSBPLBNEBEQBVSBVCBSBBNMBM1BNZBIZBIMBIPBICBNCBRABTRBFLBRKBKSCLVCLCCLDCLIDEXDEYINXINYNOPPHAPLAPHPPLPRTSRTIRSBRTNSECSEISEDTAXTAYTSXTXATXSTYAADDCPRDCRINRSUBLDDPOPPPDSTDSTPLDRSTOSETADCANDORABITCMPCPXCPYDECEORINCJMPJSRLDALDXLDYSTASTXSTYXORLSRRORROLASLA  `iiL9L9 ,ɠ,ɃL/ H k s`` `H h` h , ` s  8  `ei 8  `H hH zh ]`BGEBLTBMIhh```````HH (eihh` 8 `    ᭈ s  L8 8` BAD # ` > ` ,AR? )YLn` H ! OPEN hH WRITE,  INS ( k sLS CLOSEhL !  `a)_ L   ` (#e 1L`HH O00 LnL/L,LLLkL8LHL>LQ ` pt^! >fm̍م3vua)_ݞ4)_ݯ* WHAT? L;BLLSAIDLANMWF ROEAP L;led]z t,L L CLEGENFLG ; 08 LOCC+$01 CODE+$01 LSAV+$01 ;: 00 LOCC CODE LSAV CDSP LNUM+$01 #!40 LINCNT ;: 01 LNUM PRTR ;: 00 #' ' STRLP TTL,Y  #$20 STRLP ; ; #$0 P301 ;: P3P3 PRLN ;: P3h`L ީ'(ȱvȱHHŴ嵐fv 8㥶ȱřȱ嚰,深셹셸L3ȱřȱ嚰L3ޱ셒셑Lޥhhh8`L|hhh`Lr!-Ȣyȹ Lr`%yȹ01Lr` @ RUNINT Fȱ" FOUND AT LINE # eзL`H>L<Lޱ ;+7-3,/)+ɻ'*#/|&^=# H H쥕4#L8셑ȱ셒Li Lhh`ɠɍZɊZɈ$!$$"% %% e (`I(ii,i\$%H $ hi#ʥ"%$$%%#%"H $(*)+!hi# H $(*0 $(!`8Hh`BC<>=?<=`K i! Ȉ2 ,`H h*:` `: V:8 J8L Lӭpd`HVTQ PS 6" (!#%L" PJ TuVTvP` P&Q&R&S8RTSURSP`/T P 8/`HJ) )h)i( ((`ɇ@ 0`$($$!fi#bZH&bTDThDt(ntJrtttrDh2"&&rr&HDD h,h-<:B/ Y`EL\lY@5)I:< ?L<EhH 0l( Lh:h; LehHh:h;/ V; THH::;:-H,H E@A  J 0,*i H/.  `0 .: VȘ L `8/;e:` T0 "T3  T3  T; "D3 D"D3 D"D3 "D3 &1!YMJؤ#]#)i#$S#$S[[i$$)|mi)S4*J G(i.&E0%.Q&&` , iH h-`/'-'0 (`HJ) 'h)i& &&`0i)0 00`J G&(JJJJ)`:; H:J jɢ )Jb y.)/) JJJ Ȉ` H:  J/Ȑh,--&hEhEL=,HH hőhŒhLhL#LHH hőhŒ i`L,L ` **ERROR AT LINE :  C)ONTINUE OR A)BORT? )AL`L`;" ) ILHh+HH hehe `-HH 8h呅h咅 `*$HH hh Э `/$HH hh Э `|HH hhL&HH h%h%ĩL^HH !I%L'L"L = |** DAMAGE ** ILLEGAL CHARACTER IN OPERAND`ȱ-L[ y怒 8呅咅L 勒LȱꅑȱLȱ L8ȱLH i h`hLȱ 5A8L𤓈 |STY ABS,X NOT ALLOWEDLL7F 2LL7񤓈 |ABS,Y IS NOT ALLOWED.LL7 L7L o o,Lȱ'" o,L Lȱꅝȱŝȱŝ oL`$L< >A[L*L ` L8eȱ`% $pL񥙅LeeLJȱ ?,ȱ# o Lu/ o Lu'" Lu o o LuLLL )LȱLLL5 FORWARD REFERENCE.L |EQU W/O LABELLLLLLLLLLLLL6L2 L L |UNMATCHED IF/EL/FI` |NESTED IF'S NOT ALLOWEDL L $p |UNDEF SYMBOLL陋 o oL ɾ* oLLԐذȱ o o oLLȱ 5 oLKL oL  LL\ L $PQL& $P5eeeeL5 $P L |ILLEGAL ;*^  :L iLt1  ȥL |DUPLICATE LABELL L陵 L :a^& |LOCAL LABELS MAY NOT BE EQUATEDL $P L |UNDEF. SYMBOL/ILLEGAL ADDRESSL陵 ɖ +HH hehe `-HH 8h呅h咅 ` i; |SYMBOL WAS NOT PREVIOUSLY DEFINED IN AN EPZ STATEMENT.`LȢ L|H ᅒh`ȩ1 0&&L8&&L`L8eȱL 褓 BLOAD "'  ,A$ >fm`@>fm`$RA[L6!3%7 L |ILLEGAL OPERAND IN ADDRESS FIELD` yL Lȱ 5A8) ILɻ |VALUE > $FF` L LL\ LL0 : AG`8`&&&&`#Z[ 쥐`  y BLOAD TEMP. @ Lm L y]  BSAVE TEMP.,A$ ,L$HH hh8` $P L[L L[_ȱ"' <۱, L[# $P LM/ $P LM $P ڥ LM  L[ L[  ) L[ 1ܩ t ***** END OF ASSEMBLY ` 륙ƚƙ`hhh Lp6  LET W/O LABELL[Р ڠȥ L[C.L ۥL[ UNMATCHED IF/EL/FIL[ ٥ݩL[Х NESTED IF'S NOT ALLOWEDL L[ $p L ۥ `8eH hȱL[+ȱꅝȱŝ L L[8ȱ * &ɻ"A) ȱA) L6 L[, FLOATING POINT NOT YET IMPLIMENTEDL[  L[ L[2مvu  ȱꅝȱŝ Lة L[HHH $pLҥ, ڄƻƺL eeee L[ $pLҥ L[ L[ȥ쥚  Lȩ < L[4ȩ <ۤIƜƛI L[? < L[?@ < " $pLҥ ڥ ڱ, L[ $pLҥ ڱ, L[:ȱ"' <۱, $pLҥ ڱ, L[  L[ L[ PAUSE ENCOUNTEREDL[" $pLҥ L[_ $pLұ,- Lq1QQ $pLTҥLҥ L[h L $pLҥ ڥ L[ LEH $phLҥ'h8鿪 LPm- ,MMNn.h8鿪 ڥ L[e%$EEFf&" $pLҥ ڥ ڱ, L[ȱ#/, $pLҥ L[ $pLҥ L[' ȱ L["ȱ L[0 ȱ A)ȱ ܰLA) L[i) IIl h $pLҥ ڥ L[h8鿪 La!AAh8鿪 UNDEFINED SYMBOLL[Х ڥ L[y9YYh" $pLTҥLҥ L[8H ڥ9$phLh ڥ ڥ L[}=]]^~>$phLTh ڥ L[u5UUVv6h8Ԫ L[Jj* h8鿪 ڥ L[Р`pHȱ +҅+҅l;Ӯ<;h>Lҩ $pA UNDEFINED SYMBOL-MUST BE ZPAGE.L[Є $PȥK ڥ7 ADDRESSING MODE REQUIRES ZPAGE VARIABLE.L[Х L[Ф8鿪# $p" ED SYMBOLL[8噅嚅ƚƙ&( BRANCH OUT OF RANGEL[Х0 L[а0pP ɼ+8鲪Hȱ@ȱA8)h L[ɾ.ɽȱ@ HLѩ@HLȱ@0HLȩPHLȱA8)  $pLҥ LLLQLLLLݩ멀vم􅢅򅡠 Lp ۠8e륙ȱ0 ;*Ӡ ؐLɲ LwLɖL8閪 L[ XʈHh(`@ 8x8逪a $p UNDEFIN    Yl  . $ ; &?1?=A>?I i`HH11`쩻듧ƙɾ5Ö+]̵h5`4ɺл1>@@A`41`>BD`8>6>) `LL u ?l:L4 uLCL@ 'A=?<) < `JJJ>Ie:~E:~>N>%%%`KUe%%%%%%%%%`UK`K@HKU`K`abababababababababIIabIIabIIabmn{{ G G G G G G G Tk T G T G5 G Tk T G T G5 G G G G G G G G G G G G GCaCaCa%%%%%`UK%%L70`LL0`L/L5  c c c( L?``Lq`L~ lL?`LxLt   L tLu SET FORM SKIP8"TURN PRINTER ON & ";A$I(4);"PR#1"]((27);"N";(6)n2(4);"PR#0"t<E L % i 晥ś圐ԥśŜi 日ś圐J#6  ȱ 来 i 无LK `hh` @uL[ Hh`80`8`јȱ`i L;8 ` 1 L`  Ly  L̠ŠĠٍ̠ŠĠ٠Ӎ   ɻ Lݩ: ɻ L ީ: ɮ L ɍ 詍 h`HHH$) %&$) hhh` hhhhhh` `LLޅȹLr!-Ȣyȹ Lr`%yȹ01Lr` @ 嵐 SYM TABLE FULLLȥȩ`H phi쥵퐯8ƵȱȥȥL,ݠ쥕i Lz`HH pݥ ȥȩhh` `H LISA 2.5 I Ģ L۩ ` t`HH0;*  hh` 륒 ॑LYܥHH  hh`0 : AG`8`쥕^:&#L, DUPLICATE LABELL,i LܠŴLބ暤梤`ꅝȱŝȱŝ`ꅝȱŝȱŝ" % LA`,0`ɠ,Ƀ,L,`櫥 ݩ`` ` 1ܠ} Ģ 섘 ti9Ģ3 1ܹH****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * SYSTEM CONFIG * * * ****************** ; ; ; ;ZERO PAGE VARIABLES ; QPTR $FAQUE  LDKEY,XWITH OTHERS >3 NEWKEY,XSEE TABLE BELOW ^3 <2 >5AND EXIT ; ^4 INCREMENT PTR WRITMEMBUT MUST ALLOW WRITMEMWRITING TO ROM KYBDPTR,XDONE AUXOUTRE-PROTECT ROM KYBDPTR,XGET NEW OFFSET #MEMINNOW BRIE X-REG GETPIDGET OUR PID )^1 KYBDPTR,XANY CHARS IN BUFFER? BUFCNT >4YES, GET A CHAR KYBDELSE CHECK KEYBOARD <1NO, LOOP #$FFA BREAK? <1LET IRQ HANDLE IT KYBDSTRBTURN KEYBOARD OFF #$03REPLACE SOME KEYS ^2 O ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 12 * * * ****************** ; ; ; TTYGETC FIRST ALLOW INTS STACK+1SAV  READYSET IT READY <5AND LOOP ; ; MONTHEND 00201D201F201F20 201F201F20 ; ; ; "^5 CLOCKHIGET MINUTE BYTE END OF LIST? <3YES, RESCHED PTIML,XSAME MINUTE IN LIST? <5NO, LOOP DAYLONOW CHECK HOUR BYTE PTIMH,XSAME IN LIST <5NO, LOOP ; PSTATE,XGET PROC'S STATE #PRSLEEPASLEEP? <5NO, LOOP 4 DAYHIYES, RESET DAYS DAYHISET TO DAY 1 MONTHINC MONTH MONTH #$0DCHECK 13 MONTHS? >4 #$01YES, RESET TO 1 NOT 0 MONTH YEAR YEAR #$64CHECK 100 YEARS? >4 YEARYES, RESET YEAR %^4 #NPROCSCAN THRU TIME LIST RE CHECKING DAY #$03GET MONTH + (YR=LEAP)   MONTH #$02IS IT FEB & LEAP? >2YES, GET SPECIAL VALUE !MONTHELSE USE MONTH AS OFFSET MONTHEND,XFOR END OF MONTH  CDSKIP INST ^2 #$1EFEB LEAP VALUE DAYHIENOUGH DAYS? >00YES, RESET SECONDS CLOCKLO CLOCKHIINC MINUTES CLOCKHICHECK 60 MINUTES? #$3C >4NO, SKIP CLOCKHIYES, RESET MINUTES DAYLOINC HOURS DAYLOCHECK 24 HOURS? #$18 >4NO, SKIP DAYLORESET HOURS DAYHIINC DAYS YEARBEFOC+1  REGS #TIKNORESET TICK COUNTER TIKCNT CLKCNTSERVICE CLOCK ROUTINE? CLOCKYES "^3 RESCHEDELSE RESCHEDULE ; CLOCK #CLKNORESET CLOCK CLKCNT CLOCKLOINC SECS CLOCKLOCHECK 60 SECONDS? #$3C >4NO, SKIP #$OARD BUFFER AUXOUTAND RE-PROTECT ROM TICK TIKCNTDO A RESCHED? >2YES, SKIP #MEMOUTNO, REMOVE PAGED MEM SBANK2 REGXGET A & X BACK REGA RETURN TO PROCESS ; &^2 REGYSTORE REGS FOR RESCHED  REGP  PC  PRR51YES #NUMPROCLEGAL,DEC # OF PROCESSES MEMCLRFREE PID'S MEM PAGES '^1 PSTATE,XWHAT'S PROCS STATE? #PRCURRCURRENT >3 #PRWAITWAITING FOR SEMAPHORE >4 #PRREADYREADY >5 ##PRFREEELSE JUST SET STATE=FREE PSTATE,X #NOE A PROCESS AND REMOVES !; IT FROM THE SYSTEM.X-REG HOLDS ; PROCESS ID. ; KILL DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #NPROCBAD PROCESS ID? ERR51 #$01 ERR51BAD AGAIN !PSTATE,XPROCESS ALREADY DEAD? #PRFREE Ec]Ov}v}v]v   }vvi]XOF?;(1TR),Y TPTRAND SAVE IN TPTR QPTR+1 TPTR+1 #$00SET OFFSET FOR KEY !(TPTR),YA-REG HOLDS KEY-VALUE  ; ; $;FIRSTID: GETS THE PTR VALUE OF THE %; FIRST NODE IN MPTR.QPTR HOLDS HEAD ; FIRSTID #$01 (QPTR),Y MPTRSTORE IN MPTR QPTS HEAD OF QUEUE ; FIRSTKEY#$01GET 'NEXT' PTR (QPTR),Y TPTRAND SAVE IN TPTR QPTR+1 TPTR+1 SET OFFSET FOR KEY VALUE (TPTR),Y A-REG HOLDS KEY-VALUE ; ; #;LASTKEY: QPTR HOLDS TAIL OF QUEUE ; LASTKEY #$03GET 'PREV' PTR (QPY OR NOT. QPTR HOLDS HEAD ;OF THE QUEUE ; )ISEMPTY #$01SET OFFSET FOR 'NEXT' PTR SET UP SUBTRACTION !(QPTR),YGET LSB OF 'NEXT' PTR QPTRSUBTRACT HEAD PTR #$05POINTING TO TAIL? !=0 IF EMPTY, <>0 IF NOT EMPTY ; ; $;FIRSTKEY: QPTR HOLD ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 3 * * * ****************** ; ; ; ; ; ;ISEMPTY: TESTS IF A QUEUE IS ;EMPT     SED #PRSUSPSET PROCESS SUSPENDED PSTATE,X PRIORITYSET UP PRIORITY PPRIO,X PROCADDRSET UP ADDRESS PADDRL,X PROCADDR+1 PADDRH,X NARGS PARGS,XSET UP # OF ARGS SET UP PTR TO NAME  X HOLDS PID*2  MULT BY 8 SABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 PRIORITYIF PRIORITY=0 ERR51THEN ERROR NEWPIDGET A NEW PROC ID ERR51NONE, ERROR & RETURN *CREATE1 NUMPROCADD 1 TO # OF PROCESSES REGASTORE PID IN REGA MEMARKMARK THE MEMORY U; ; #;CREATE: CREATES A NEW PROCESS, IF !; A FREE PROCESS ID.PROCESS INFO ; MUST BE PLACED IN PROCADDR, ; PRIORITY, NAME & NARGS, PLUS ; ARGUMENTS. !; WHEN PROC STARTS, A-REG = PID, ; Y-REG = # ARGS, X-REG = S-REG ; BEFORE ANY ARGS. ; CREATE DI !STORPAGRESCHEDULE VIA STORPAG &^4 DONT KNOW WHAT TO PUT HERE YET! ^5 #PRFREEPROCESS READY PSTATE,XSET PROCESS FREE /RDYHEADDEQUEUE THE NODE MPTR+1 MULTFIV,X MPTR DQMEM NOERR51SET NO ERRS & RETURN ; ; ; RR51 #MEMOUTREMOVE PAGED MEM SBANK2 SET NO ERROR ENABLE INTERRUPTS AND RETURN #ERR51 #MEMOUTREMOVE PAGED MEM SBANK2 SET SYSERR ENABLE INTERRUPTS AND RETURN %^3 #PRFREEPROCESS IS CURRENT PSTATE,XFREE PROCESSE LPR ; USES X-REG. ; LPRWRITELPRBUSYIS LPR BUSY? LPRWRITEYES, LOOP LPROUTNO, WRITE CHAR AND RETURN ; ; ; ';LPRDUMP: DUMPS UP TO A 256-BYTE BLOCK +; TO THE PRINTER, RETURNS IF IT ENCOUNTERS %; AN ETX CHARACTER. Y-REG HOLDS PAGE ; NO. NG IN BUFFER SBANK2  BUF,XGET A CHARACTER #MEMOUT SBANK2 !^5 STACK+1GET X-REG BACK SET NO ERRORS  AND RETURN ; #OLDKEY 82899194^B^I^Q^T BECOME NEWKEY "\|`~" \ | ` ~ ; ; ; ; ; $;LPRWRITE: WRITES 1 CHAR TO TH $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 CT ADDRESSING MPTR+1 #PROCBASE MPTRDONE "LOOP2 $0000,YMOVE ZPG MEMORY (MPTR),Y  LOOP2DONE MPTR+1INCREMENT BASE LOOP3 $0100,YNOW DO STACK (MPTR),Y  %LOOP3DONE, NOW ITS AN OLD PROCESS $PSTATE,XWAS OLD PROCESS RU/RDYTAIL QPTR+1 %LASTKEYGET HIGHEST PRIO FROM RDYQ !PPRIO,XTAIL KEY9 NAME,YGET CHARS (QPTR),Y <1IF CHAR=0 THEN END &^9 SAVE OUR STACK, AS WE WILL BE MODIFYING IT /PROCBASE+$100 MPTR+1 #$00 MPTR  STORE STACK POINTER REGS RESCHED ; ; ; ;  SH PROCESSOR DISABLE INTERRUPTS REGASTORE A-REG  REGP  NOW INCREMENT THE SAVED #$01ADDRESS TO REFLECT PCTHE DIFFERENCE BETWEEN A 'JSR' ADDRESS AND AN #$00INTERRUPT ADDRESS PC+1 REGXSTORE X-REG REGYSTORE Y-REG INSERTAND INSERT ^2 ; ; ; !;STOPPROC: SAVES CURRENT PROCESS ; REGS, AND RESCHEDULES A NEW ; PROCESS. IF IT IS CALLED BY A ; 'JSR NEWPROC', THEN EXECUTION ; OF THAT PROCESS WILL CONTINUE ; AFTER THE 'JSR' INSTRUCTION. ; STOPPROCPU SBANK2 #$14ILLEGAL PROCESS ID? >1NO, SKIP YES, SET SYSERR AND RETURN ^1 #PRREADY PSTATE,XSET PROCESS READY #RDYQAND SET UP QPTR QPTR+1 MPTR+1AND MPTR #RDYHEAD QPTR MULTFIV,X MPTR PPRIO,XGET PRIORITY; ; ; PROCESS REGISTER PCONTO THE STACK  REGP  REGAALL REGS NOW BACK ENABLE INTERRUPTS RETURN TO PROCESS ; ; ;READY: PLACES A PROCESS ON THE #; READY QUEUE; X-REG HOLDS PROC ID ; $READY #MEMINBRING PAGED MEM IN -REG  REGP  NOW INCREMENT THE SAVED #$01ADDRESS TO REFLECT PCTHE DIFFERENCE BETWEEN A 'JSR' ADDRESS AND AN #$00INTERRUPT ADDRESS PC+1 REGXSTORE X-REG REGYSTORE Y-REG STORE STACK POINTER REGS RESCHED ; ; OC: SAVES CURRENT PROCESS ; REGS, AND RESCHEDULES A NEW ; PROCESS. IF IT IS CALLED BY A ; 'JSR NEWPROC', THEN EXECUTION ; OF THAT PROCESS WILL CONTINUE ; AFTER THE 'JSR' INSTRUCTION. ; STOPPROCPUSH PROCESSOR DISABLE INTERRUPTS REGASTORE AQPTR MULTFIV,X MPTR PPRIO,XGET PRIORITY INSERTAND INSERT #MEMOUTPAGED MEM OUT SBANK2 SET NO ERRORS ENABLE INTS ^2 '^3 #MEMOUTERROR, PAGED MEM OUT SBANK2 SET SYSERR  AND RETURN ; ; ; !;STOPPRC ID ; READY DISABLE INTERRUPTS #MEMINPAGED MEM IN SBANK2 #NPROCILLEGAL PROCESS ID? >3YES #$00 >3YES, ERROR READY2 #PRREADY PSTATE,XSET PROCESS READY /RDYHEADAND SET UP QPTR QPTR+1 MPTR+1AND MPTR #RDYHEAD REGISTERS BACK  REGX REGY PC+1RESTORE PC AND PROCESS REGISTER PCONTO THE STACK  REGP  REGAALL REGS NOW BACK ENABLE INTERRUPTS RETURN TO PROCESS ; ; ;READY: PLACES A PROCESS ON THE #; READY QUEUE; X-REG HOLDS PRODRESS MPTR+1 #PROCBASE MPTRDONE 'LOOP5 (MPTR),YGET ZPG MEMORY BACK $0000,Y  #$FC LOOP5 #$00 MPTR+1NOW RESTORE STACK LOOP6 (MPTR),Y $0100,Y  LOOP6DONE #MEMOUTRESET MEMORY SBANK2 ; "GETREGS REGSGET 1 CURRPIDSTORE CURRPID DOWN GET BACK PPRIO PPRIO,YAND STORE IT #PRCURRSET PROCESS RUNNING PSTATE,Y ; ; %LOADPAG GET NEW PROCS ZPG & STACK GET PROCESS IN A-REG SHIFT FOR CORRECT ADDRESSING %/PROCBASEGET CORRECT BASE ADE ; +NEWPROC #RDYHEADNOW GET HIGHEST PROCESS QPTR /RDYHEAD QPTR+1 GETLASTA-REG HOLDS PRIORITY TEMP STORE PPRIO CALCPID MPTRCALC PROCESS ID #NPROC #LOOP4 MULTFIV,YRIGHT PROCESS? >1YES,OUT ELSE BRANCH BACK LOOP4 %^NNING? #PRCURR NEWPROCNO, BRANCH %#PRREADYTHE SET IT TO READY STATE PSTATE,X /RDYHEADINSERT IT INTO RDY Q QPTR+1 MPTR+1 MULTFIV,XSET UP NODE MPTR #RDYHEAD QPTRRDYHEAD SET UP PPRIO,XGET PRIORITY IN AREG INSERTDON SET NO ERRORS AND RETURN ; ; ;  IN A-REG ENABLE INTERRUPTS SET NO ERRORS AND RETURN ; ; ;  ROR !<1ELSE WE CAN CHANGE PRIORITY #MEMINBRING IN PAGED MEM SBANK2 PPRIO,XGET OLD PRIORITY PPRIO,XSAVE NEW ONE #MEMOUTREMOVE PAGED MEM SBANK2 PUT OLDPRIO IN A-REG ENABLE INTERRUPTS SET NO ERRORS AND RETURN ; ; ; INTERRUPTS #$14IS BAD PROCESS ID? >1YES #$01PRIORITY <=0 ? >2NO, CONTINUE ^1 ENABLE INTERRUPTS SET SYSERR AND RETURN (^2 PSTATE,XPROCESS STATE LEGAL? #PRREADYREADY, GIVE ERROR <1 #PRCURRCURRENT, GIVE ERERRET: ALL PROCESSES RETURN HERE !; WHEN THEY FINISH, TO KILL THEM ; $USERRET GETPIDGET THE PROCESS ID KILLAND KILL IT ; ; ; ";CHPRIO: CHANGE THE PRIORITY OF A $; PROCESS.A-REG HOLDS NEW PRIORITY. ; X-REG HOLDS PROCESS ID ; CHPRIO DISABLEPRFREE <1YES, RETURN  <2 ELSE SET SYSERR RETURN ; ; ; ";GETPID: GETS THE CURRENT PROCESS ; ID IN THE X-REG ; $GETPID #MEMINBRING IN PAGED MEM SBANK2 CURRPID #MEMOUTREMOVE PAGED MEM SBANK2 AND RETURN ; ; ; $;USAND RETURN ^2 SET SYSERR AND RETURN ; ; ; ";NEWPID: FINDS A FREE PROCESS ID, "; AND RETURNS IT IN THE X-REG. IF ; NONE AVAILABLE, SETS SYSERR ; BEFORE RETURNING ; NEWPID #$14SET X=20 DECIMAL $^2 PSTATE,XIS PROCESS FREE? #46  4B50555A5F64 ; ; ; IN A-REG SET NO ERRORS ENABLE INTS AND RETURN ; ; ; MULTFIV 00050A0F*5 TABLE 191E23282D 32373C4146  4B50555A5F64 ; ; ; S, ERROR #$B8>#$B8 >2YES, ERROR ^1 SET NO ERROR TY PPRIO,XSAVE NEW ONE #MEMOUTREMOVE PAGED MEM SBANK2 PUT OLDPRIO IN A-REG SET NO ERRORS ENABLE INTS AND RETURN ; ; ; MULTFIV 00050A0F*5 TABLE 191E23282D 32373C4146  4B50555A5F64 ; ; ; B50555A5F64 ; ; ; 1 SET SYSERROR ENABLE INTS AND RETURN (^2 PSTATE,XPROCESS STATE LEGAL? #PRREADYREADY, GIVE ERROR <1 #PRCURRCURRENT, GIVE ERROR !<1ELSE WE CAN CHANGE PRIORITY #MEMINBRING IN PAGED MEM SBANK2 PPRIO,XGET OLD PRIORI IT ; ; ; ";CHPRIO: CHANGE THE PRIORITY OF A $; PROCESS.A-REG HOLDS NEW PRIORITY. ; X-REG HOLDS PROCESS ID ; CHPRIO DISABLE INTERRUPTS #NPROCIS BAD PROCESS ID? >1YES #$00 >1BAD AGAIN #$01PRIORITY <=0 ? >2NO, CONTINUE ^1 X-REG ; $GETPID #MEMINBRING IN PAGED MEM SBANK2 CURRPID #MEMOUTREMOVE PAGED MEM SBANK2 AND RETURN ; ; ; $;USERRET: ALL PROCESSES RETURN HERE !; WHEN THEY FINISH, TO KILL THEM ; $USERRET GETPIDGET THE PROCESS ID KILLAND KILL ; NONE AVAILABLE, SETS SYSERR ; BEFORE RETURNING ; $NEWPID #NPROC-1SET X TO TOP PID $^2 PSTATE,XIS PROCESS FREE? #PRFREE <1YES, RETURN  <2 ELSE SET SYSERR RETURN ; ; ; ";GETPID: GETS THE CURRENT PROCESS ; ID IN THE ; "ISODD PROCADDR+1GET ADDR MSB #$03<#$03 >2YES, ERROR #$B8>#$B8 >2YES, ERROR ^1 SET NO ERROR AND RETURN ^2 SET SYSERR AND RETURN ; ; ; ";NEWPID: FINDS A FREE PROCESS ID, "; AND RETURNS IT IN THE X-REG. IFTR),Y $0100,Y  (MPTR),Y  <6DONE, NOW RETURN REGAGET PID BACK IN X-REG #MEMOUTREMOVE PAGED MEM SBANK2 ENABLE INTERRUPTS  ; %;ISODD: CHECKS WHETHER PROCESS-TO-BE $; HAS A VALID BASE ADDRESS.RANGE IS ; (FOR NOW) $300-$B800 P, SAVE S-REG REGS TPTRGET OUT STACK PTR BACK  REGAGET BACK PID*2 NOW COPY ZERO PAGE /PROCBASE MPTR+1SET UP MPTR #$00 MPTR ^5 $0000,Y (MPTR),Y  <5DONE, NOW SWAP STACKS MPTR+1 ^6 $0100,Y  (MP#USERRET-1THIS MUST PT TO USERRET!  STORE S-REG BEFORE ARGS REGXINTO REGX NARGSGET NO. OF ARGUMENTS REGYSAVE INTO REGY >4NONE, SKIP ^3 NARGS,XGET ARGUMENT AND PUSH ON TO STACK  <3AND LOOP $^4 STACK SET U****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 6 * * * ****************** ; ; ; ; &;WAIT -MAKES THE CURRENT PROCESS WAIT &     EAK SKIP ; LPRINIT LPRSTRGET LENGTH ^1 LPRSTR,YGET A CHAR LPRWRITEAND WRITE IT  <1LOOP BACK ELSE RETURN ; ; LPRSTR 05064E1B401B ; ; ; (;LPR: A >PROCESS< TO PRINT FILES TO THE ,; PRINTER. PRINTS ITS ARGUMENTS, THEN SKIP,YGET A CHAR #ETXEND OF TEXT? >3YES, OUT ^2 LPRBUSYLPR BUSY? <2 LPROUTNO, WRITE CHAR MOVE UP A CHAR LOOP7 ^3 SET NO ERRORS AND RETURN ; ; ; &;LPRINIT: USED ONCE TO INITIALISE THE %; PRINTER. ALSO SETS PAGE BROF BLOCK. ALL REGS LOST! ; LPRDUMP LPRBUSYLPR BUSY? >1NO, SKIP STOPPROCYES, RESCHED SET UP AS A SYS CALL #MEMIN SBANK2 LPRDUMPAND TRY AGAIN ; ^1 QPTR+1SET UP POINTER #$00TO BLOCK QPTRAND Y-REG LOOP7 (QPTR)ONE LESS CHAR <5LOOP CROUTEND WITH CR-LF AND RETURN ; ; ; -XT " Xinu O/S Version 7.1025" ; ; ; ; ; 2 READY2MAKE NULL READY  #MEMIN SBANK2 NEWPROCAND START IT UP ; NULNAME "Shell"NULL'S NAME  00PLUS END BYTE ; ; ; $XTITLE XTGET NO. CHARS IN TITLE #$01START AT LEFT END ^5 XT,YGET A CHAR COUTPRINT IT  ITY #NULLSET UP ADDRESS PROCADDR /NULL PROCADDR+1 #$00 NARGSSET NO ARGUMENTS #$05SET UP THE NAME ^4 NULNAME,Y NAME,Y  <4 CREATE1CREATE THE PROCESS DISABLE INTS AGAIN #MEMINAND BRING IN PAGED MEM SBANK#$60 CURDIR+1 AUXOUTPROTECT LANG.CARD MARKMEM #$FFMARK AVAILABLE #$07MEMORY ^5 MEMLIST,Y  <5PAGES 0-7 #$3FAND TOP 16K ^6 MEMLIST+$C0,Y  <6 NULLPROC#NULLPIDSET NULL PID #NULLPRIOSET PRIORITY PRIORDYHEAD QPTR NEWQUEUE /WAITHEADSET UP SEM Q QPTR+1 #WAITHEAD QPTR NEWQUEUE SETDATE #$01SET DATE TO DAYHI01-JAN-01 MONTH YEAR SETROOT WRITMEMWRITE ENABLE WRITMEMLANG.CARD #$02TO SET CURDIR CURDIRTO ROOYTT <2 QPTR+1 QPTR+1 <2DONE FREEPROC#PRFREESET ALL PROCS ^3 PSTATE,YFREE  #NPROC <3 SETTICK #TIKNOSET UP TICK TIKCNTCOUNTER #CLKNOAND ALSO CLOCK COUNTER CLKCNT "SETQUEUE/RDYHEADSET UP READY Q QPTR+1 #RTRSET OUR BASE TO $4000 #$40 QPTR+1 #$50AND TOP TO $5000 SET A TO 0 TOO ^1 (QPTR),YCLEAR MEM  <1 QPTR+1MOVE UP A PAGE QPTR+1FINISHED? <1NO, LOOP #$58NOW DO $5800-$5FFF QPTR+1 #$60 ^2 (QPTR),Y  ETPWRCSET POWER-UP BYTE /IRQHNDLRSET UP IRQ VECTOR IRQV+1TO OUR ROUTINE #IRQHNDLR IRQV HOMECLEAR THE SCREEN XTITLEWRITE OUT TITLE #$16DO A VTAB 22 TABV "CLEARMEM#MEMINNOW CLEAR MEMORY SBANK2 #$00SET OFFSET TO 0 QP RESET & IRQ VECTORS, SET ALL PROCESSES ); FREE, CREATES READY & WAIT QUEUES, AND ; CREATES THE NULL PROCESS. ; BOOT FIRST DISABLE INTS $C381DEPROTECT LANG. CARD /BOOTSET UP RESET VECTOR SOFTEV+1POINTING TO BOOT #BOOT SOFTEV S ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 13 * * * ****************** ; ; ';BOOT: CLEARS THE SYSTEM MEMORY, INITS -; THE     1GET NEXT NODE (MPTR),Y #WAITTAIL EOF QUEUE? >6YES, FINISHED MPTR GET SEMAPHORE ID  (MPTR),YIS IT OURS? <3NO, DO NEXT NODE CALCPID3MPTRCALC PROCESS ID #$14 #^4 MULTFIV,YRIGHT PROCESS? >5YES, OUT ELSE LOO ; ; ;ERR61 SEMLIST,XIS IT FREE? >2NO, GO ON ERR61 #MEMOUT SBANK2PAGED MEM OUT SET SYSERR  AND RETURN ^2 #SFREESET SEM FREE SEMLIST,X #WAITQSET UP WAIT HEAD MPTR+1 #WAITHEAD MPTRDONE ^3 #$0 #MEMINBRING PAGED MEM IN SBANK2READY PUTS IT OUT REGXGET REGS BACK REGY MULTFIV,YSET UP MPTR AGAIN MPTR /WAITHEAD MPTR+1 <3AND TRY NEXT NODE ^6 #MEMOUTOUT PAGED MEM SBANK2 SET NO ERRORS  AND RETURN ;NODE CALCPID3MPTRCALC PROCESS ID #NPROC #^4 MULTFIV,YRIGHT PROCESS? >5YES, OUT ELSE LOOP <4 <3ERROR, DO NEXT NODE ^5 REGXSAVE X&Y-REGS REGY DQMEMDEQUEUE NODE REGYGET PROCESS ID READYAND PUT IT ON READYQESET SEM FREE SEMLIST,X /WAITHEADSET UP WAIT HEAD MPTR+1 #WAITHEAD MPTRDONE ^3 #$01GET NEXT NODE (MPTR),Y #WAITTAIL EOF QUEUE? >6YES, FINISHED MPTR GET SEMAPHORE ID  (MPTR),YIS IT OURS? <3NO, DO NEXT SDELETE DISABLE INTS #MEMINPAGED MEM IN SBANK2 #$00SEMAPHORE TOO SMALL? ERR61 #NSEMTOO BIG? ERR61 SEMLIST,XIS IT FREE? >2NO, GO ON ERR61 #MEMOUT SBANK2PAGED MEM OUT SET SYSERR  AND RETURN ^2 #SFRESEMCNT,XSET UP COUNT #MEMOUTPAGED MEM OUT SBANK2 GET SEM ID IN A-REG SET NO ERRORS  AND RETURN ; ; ; #;SDELETE: DELETES A SEMAPHORE, AND #; RELEASES ALL PROCS WAITING ON IT !; TO THE READY STATE.X-REG HOLDS ; SEMAPHORE ID ; TE DISABLE INTS #MEMINPAGED MEM IN SBANK2 #$00COUNT <0? ERR61YES, ERROR #NSEMFIND A SEMAPHORE ^1 SEMLIST,XIS IT FREE? >3YES  <1ELSE LOOP ERR61ERROR, RETURN $^3 #SUSEDSET SEMAPHORE USED SEMLIST,X  READYRETURN IT TO RDYQ #STOPPROCAND RUN ANOTHER PROCESS NOERR60AND RETURN NO ERRORS ; ; ; %;SCREATE: FINDS, IF POSSIBLE, A FREE &; SEMAPHORE, AND MAKES IT USED. Y-REG $; HOLDS INITIAL COUNT OF SEM. A-REG ; RETURNS WITH SEMAPHORE ID ; SCREAMPTR),Y <3NO, DO NEXT NODE CALCPID2MPTRCALC PROCESS ID #NPROC #^4 MULTFIV,YRIGHT PROCESS? >5YES, OUT  <4ELSE LOOP ERR60ERROR, LEAVE #^5 REGYSUCCESS, SAVE Y-REG DQMEMDEQUEUE NODE REGYGET PROCESS ID IN X-REG NCREMENT THE SEM >2 NOERR60 >0 RETURN OK &^2 /WAITHEADSET UP WAITQ HEAD MPTR+1 #WAITHEAD MPTR ^3 #$01GET NEXT NODE (MPTR),Y #WAITTAILEOF QUEUE? ERR60YES, ERROR MPTR GET SEMAPHORE ID IS IT OUR SEM? (ESS WAITING ON THE SEM ; X-REG HOLDS THE SEMAPHORE ID ; SIGNAL DISABLE INTS #MEMINBRING IN PAGED MEM SBANK2 #$00SEMAPHORE ID TOO SMALL? ERR60 #NSEMTOO BIG? ERR60 SEMLIST,XIS IT FREE? ERR60YES, ERROR %^1 SEMCNT,XIRS   ; ; ; ';SIGNAL: SIGNAL A SEMAPHORE, RELEASING (; THE FIRST PROCESS WAITING ON THE SEM, ; IF IT IS STILL NEGATIVE $; **NB - SINCE WE DON'T HAVE QUEUES &; FOR EACH SEM, WE MUST SEARCH %; THRU THE WAIT Q FOR THE 1ST $; PROC+1NODE MPTR+1 #WAITTAIL QPTRDONE MULTFIV,YSET UP NODE IN MPTR MPTR #$00PLACE SEM ID IN NODE  (MPTR),Y ENQUEUEADD NODE TO THE TAIL STOPPROCAND RUN ANOTHER PROC #NOERR60 #MEMOUTREMOVE PAGED MEM SBANK2 SET NO ERROD #ERR60 #MEMOUTREMOVE PAGED MEM SBANK2 SET ERROR  AND RETURN !^2 SEMCNT,XDEC SEM COUNT NOERR60 IF >=0 RETURN !CURRPIDELSE MAKE PROCESS WAIT #PRWAIT PSTATE,YSET ITS STATE $/WAITTAILSET UP QPTR TO WAITTAI; QPTR; ON A SEMAPHORE I.E PLACES IT ON THE $; WAITING QUEUE. X-REG HOLDS SEM ID ; WAIT DISABLE INTERRUPTS #MEMINBRING IN PAGED MEM SBANK2 #$00IS SEM TOO SMALL? ERR60 #NSEMTOO BIG? ERR60 SEMLIST,XSEMAPHORE FREE? >2NO, GO AHEA BUFID REGYSTORE THE BUFID  /BUFBASESET UP MSB IN REGA REGA ^3 REGYGET BUFID INBUF,YBUFFER FULL? >4YES, SKIP STOPPROCEMPTY, WAIT  #MEMIN SBANK2 LPR2AND TRY AGAIN ; &^4 REGAGET THE BUFFER ADDRESS LAR LPRWRITEWRITE IT REGADEC NO. OF CHARS <1LOOP BACK  INSTALL PRINT DATE LATER  #$05TURN EMPHASIS OFF "^2 LPRSTR2,YAND DO 3 LF'S LPRWRITEAND A CR  <2 ; &LPR2 CURRPIDNOW FIND THE BUFFER PBUFOUT,YGET THES (; A FEW LINES, THEN DUMPS THE RECEIVING *; BUFFER UNTIL IT IS DISUSED. LASTLY DOES ; A FORM-FEED. ; LPR #MEMIN SBANK2 GET NO. OF CHARS TO PRINT REGA #ESCSET EMPHASISED CHARS LPRWRITE #'E' LPRWRITE ^1 GET A CHTOUT PAGED MEM SBANK2 CLEAR CARRY  AND RETURN ^1 #MEMOUTOUT PAGED MEM SBANK2 SET NO MESSAGE  AND RETURN ; ; ;  ANY MESSAGES, RETURNING ); MESG IN A-REG (AND CARRY CLEAR) IF ONE ; REVCLR DISABLE INTS #MEMINPAGED MEM IN SBANK2 CURRPIDGET PROCESS ID PHASMSGL,XHAVE A MESSAGE? >1NO, LEAVE PHASMSGL,XSET NO MESGS PMSGL,XGET MESG #MEMOUGED MEM SBANK2 CLEAR CARRY  AND RETURN ; ; ; ; ; CSTART A NEW PROC <1AND LOOP BACK ; !^2 PHASMSGL,XSET NO MSGS PMSGL,XGET THE MESSAGE #MEMOUTOUT PAGED MEM SBANK2  AND RETURN ; ; ; ';REVCLR: CLEARES, RETURNING ); MESG IN A-REG (AND CARRY CLEAR) IF ONE ; REVCLR DISABLE INTS #MEMINPAGED MEM IN SBANK2 CURRPIDGET PROCESS ID PHASMSGL,XHAVE A MESSAGE? ERR70NO, LEAVE PHASMSGL,XSET NO MESGS PMSGL,XGET MESG #MEMOUTOUT PASTOPPROCSTART A NEW PROC RECEIVEAND LOOP BACK ; !^2 PHASMSGL,XSET NO MSGS #PRCURRSET STATE BACK TO PSTATE,XCURRENT PMSGL,XGET THE MESSAGE #MEMOUTOUT PAGED MEM SBANK2  AND RETURN ; ; ; ';REVCLR: CLEAR ANY MESSAGSS WAITING FOR "; A MESSAGE, AND RETURN IT IN THE ; A-REG ; RECEIVE SET NO INTS #MEMINBRING IN PAGED MEM SBANK2 &^1 CURRPIDGET CURRENT PROCESS PHASMSGL,XDO WE HAVE A MESG? >2YES, GET IT #PRRECVELSE WAIT FOR ONE PSTATE,X ,XAND STORE IT PHASMSGL,XSET A MESG SENT PSTATE,XPROCESS RECEIVING? #PRRECV NOERR70NO, RETURN OK READYELSE SET PROCESS READY !NOERR70 #MEMOUTELSE RETURN OK SBANK2 SET NO ERROR  AND RETURN ; ; ; $;RECEIVE: SET A PROCEPID TOO BIG? ERR70 PSTATE,XIS PROCESS FREE? #PRFREE ERR70YES, ERROR PHASMSGL,XALREADY GOT A MSG? >2NO, GO ON 'ERR70 #MEMOUTERROR, OUT PAGED MEM SBANK2 SET SYSERR  AND RETURN ^2 REGAGET MESSAGE BACK PMSGLTHER PROCESS, PUTTING IT ON &; THE READY QUEUE IF IT IS RECEIVING. #; A-REG HOLDS MESSAGE, X-REG HOLDS ; PROCESS ID. ; SEND SET NO INTS REGASTORE MSG TEMORARILY #MEMINPAGED MEM IN SBANK2 #$00PROCESS ID TOO SMALL? ERR70 #NPROC<****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 7 * * * ****************** ; ; ; ; !;SEND: SENDS A 1-BYTE MESSAGE TO !; ANO    ODE ^6 #MEMOUTOUT PAGED MEM SBANK2 SET NO ERRORS  AND RETURN ; ; ;  ETURN ; ; ;  BANK2 SET NO ERRORS  AND RETURN ; ; ;  P <4 <3ERROR, DO NEXT NODE ^5 REGXSAVE X&Y-REGS REGY DQMEMDEQUEUE NODE REGYGET PROCESS ID READYAND PUT IT ON READYQ REGXGET REGS BACK REGY MULTFIV,YSET UP MPTR AGAIN MPTR #WAITQ MPTR+1 <3AND TRY NEXT NAND Y-REG LOOP7 (QPTR),YGET A CHAR #ETXEND OF TEXT? >3YES, OUT ^2 LPRBUSYLPR BUSY? <2 LPROUTNO, WRITE CHAR MOVE UP A CHAR LOOP7 ^3 SET NO ERRORS AND RETURN ; ; ; &;LPRINIT: USED ONCE TO INITIALISE THE TER. Y-REG HOLDS PAGE ; NO. OF BLOCK. ALL REGS LOST! ; LPRDUMP LPRBUSYLPR BUSY? >1NO, SKIP STOPPROCYES, RESCHED SET UP AS A SYS CALL #MEMIN SBANK2 LPRDUMPAND TRY AGAIN ; ^1 QPTR+1SET UP POINTER #$00TO BLOCK QPTR Xinu O/S Version 7.1211" ; ; ; AME "Shell"NULL'S NAME  00PLUS END BYTE ; ; ; $XTITLE XTGET NO. CHARS IN TITLE #$01START AT LEFT END ^5 XT,YGET A CHAR COUTPRINT IT  ONE LESS CHAR <5LOOP CROUTEND WITH CR-LF AND RETURN ; ; ; -XT " ARGUMENTS #$05SET UP THE NAME ^4 NULNAME,Y NAME,Y  <4 CREATE1CREATE THE PROCESS DISABLE INTS AGAIN #MEMINAND BRING IN PAGED MEM SBANK2 READY2MAKE NULL READY  #MEMIN SBANK2 NEWPROCAND START IT UP ; NULNEMORY ^5 MEMLIST,Y  <5PAGES 0-7 #$3FAND TOP 16K ^6 MEMLIST+$C0,Y  <6 NULLPROC#NULLPIDSET NULL PID #NULLPRIOSET PRIORITY PRIORITY #NULLSET UP ADDRESS PROCADDR /NULL PROCADDR+1 #$00 NARGSSET NO TMEMLANG.CARD #$02TO SET CURDIR CURDIRTO ROOYTT #$60 CURDIR+1 SETKPTR #$00SET ALL KYBD #$0FPOINTERS TO 0 ^1 KYBDPTR,X  <1 BUFCNTAND BUFFER POINTER AUXOUTPROTECT LANG.CARD MARKMEM #$FFMARK AVAILABLE #$07MCLKCNT "SETQUEUE/RDYHEADSET UP READY Q QPTR+1 #RDYHEAD QPTR NEWQUEUE /WAITHEADSET UP SEM Q QPTR+1 #WAITHEAD QPTR NEWQUEUE SETDATE #$01SET DATE TO DAYHI01-JAN-01 MONTH YEAR SETROOT WRITMEMWRITE ENABLE WRI DO $5800-$5FFF QPTR+1 #$60 ^2 (QPTR),Y  <2 QPTR+1 QPTR+1 <2DONE FREEPROC#PRFREESET ALL PROCS ^3 PSTATE,YFREE  #NPROC <3 SETTICK #TIKNOSET UP TICK TIKCNTCOUNTER #CLKNOAND ALSO CLOCK COUNTER NNOW CLEAR MEMORY SBANK2 #$00SET OFFSET TO 0 QPTRSET OUR BASE TO $4000 #$40 QPTR+1 #$50AND TOP TO $5000 SET A TO 0 TOO ^1 (QPTR),YCLEAR MEM  <1 QPTR+1MOVE UP A PAGE QPTR+1FINISHED? <1NO, LOOP #$58NOWETPWRCSET POWER-UP BYTE SETKBDSET UP STDIN, STDOUT SETVIDAS KYBD & SCREEN /IRQHNDLRSET UP IRQ VECTOR IRQV+1TO OUR ROUTINE #IRQHNDLR IRQV HOMECLEAR THE SCREEN XTITLEWRITE OUT TITLE #$16DO A VTAB 22 TABV "CLEARMEM#MEMI RESET & IRQ VECTORS, SET ALL PROCESSES ); FREE, CREATES READY & WAIT QUEUES, AND ; CREATES THE NULL PROCESS. ; BOOT FIRST DISABLE INTS $C381DEPROTECT LANG. CARD /BOOTSET UP RESET VECTOR SOFTEV+1POINTING TO BOOT #BOOT SOFTEV S( ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 13 * * * ****************** ; ; ';BOOT: CLEARS THE SYSTEM MEMORY, INITS -; THE    G #$00FROM THE BUFFER PBUFOUT,Y REGYSET BUF PTRS TO 0 INBUF,Y OUTBUF,Y #MEMOUT SBANK2 SET NO ERRORS  AND RETURN ; LPRSTR2 0D0A0A0A461B ; ; ; PRDUMPSEND IT TO LPR REGYGET THE BUFID #$00SET THAT WE'VE READ THE INBUF,YBUFFER BUFLIST,YIS BUFFER IN LIMBO? >5BUFFER FREE, END! LPR2NO, LOOP BACK ; #^5 #$0CEND, DO A FORM-FEED LPRWRITE !CURRPIDSET WE ARN'T RECEIVIN     X ԽPO 0xPP}@}X`0` Rx}LM؄ 0`ع D؈`N@x}h  DةE Dh D  D؈XXi@ oZ Rx}Lؤ MؤoZ_Zͩ DجXXoZZ }0ɚXX!OO@X } @hhhXXLaѩXXX<`XXX5BUFFER FREE, END! LPR2NO, LOOP BACK ; #^5 #$0CEND, DO A FORM-FEED LPRWRITE !E BUFFER PBUFOUT,YGET THE BUFID REGYSTORE THE BUFID  /BUFBASESET UP MSB IN REGA REGA ^3 REGYGET BUFID INBUF,YBUFFER FULL? >4YES, SKIP STOPPROCEMPTY, WAIT  #MEMIN SBANK2 LPR2AND TRY AGAIN ; &^4 REGLPRWRITE ^1 GET A CHAR LPRWRITEWRITE IT REGADEC NO. OF CHARS <1LOOP BACK  INSTALL PRINT DATE LATER  #$05TURN EMPHASIS OFF "^2 LPRSTR2,YAND DO 3 LF'S LPRWRITEAND A CR  <2 ; &LPR2 CURRPIDNOW FIND THINTS ITS ARGUMENTS, THEN SKIPS (; A FEW LINES, THEN DUMPS THE RECEIVING *; BUFFER UNTIL IT IS DISUSED. LASTLY DOES ; A FORM-FEED. ; LPR #MEMIN SBANK2 GET NO. OF CHARS TO PRINT REGA #ESCSET EMPHASISED CHARS LPRWRITE #'E' %; PRINTER. ALSO SETS PAGE BREAK SKIP ; LPRINIT LPRSTRGET LENGTH ^1 LPRSTR,YGET A CHAR LPRWRITEAND WRITE IT  <1LOOP BACK ELSE RETURN ; ; LPRSTR 05064E1B401B ; ; ; (;LPR: A >PROCESS< TO PRINT FILES TO THE ,; PRINTER. PRDEAL WITH IT SET UP OFFSET (QPTR),YTO GET CHAR REGASAVE CHAR WE NEED X-REG REGYTO INCREMENT OUTBUF,XTHE POINTER RESTORE X NOERR151AND RETURN ; (BEMPTY BUFLIST,YIS BUFFER IN LIMBO? >1 STOPPROCNO, SO WAIT A BIT HE BUFFER WE ARE PBUFOUT,YRECEIVING FROM REGYSAVE BUFID SET UP PTR TO BUFFER /BUFBASE QPTR+1 #$00 QPTR REGYGET BUFID BUFLIST,YBUFFER FREE ERR151YES,EXIT OUTBUF,YGET BUF PTR INBUF,YIS BUFFER EMPTY? BEMPTYYES, T REGS REGY STOPPROCSTOP PROCESS BSENDAND TRY AGAIN ; ; ; $;BREAD: GETS A CHAR FROM THE BUFFER #; WE ARE RECEIVING FROM. SYSERR IF (; BUFFER NOW FREE. REGS RETURNED INTACT ; BREAD REGXSAVE Y-REG #MEMIN SBANK2 CURRPIDGET T CHAR IN BUFFER SAVE X-REG REGYGET BUFID INBUF,XMOVE PTR UP ONE RESTORE X-REG NOERR151SET NO ERROR  24SKIP SEC ERR151 SET SYSERR #MEMOUT SBANK2 REGAGET A-REG REGXGET Y-REG  AND RETURN ; WAIT1 REGARESEGET BUFID BUFLIST,YIS BUFFER USED? ERR151FREE, EXIT ERR151LIMBO, EXIT INBUF,YGET INPUT PTR #$01ADD 1 OUTBUF,YIS BUFFER FULL? WAIT1YES, WAIT USE PTR AS OFFSET RESTORE RIGHT VALUE REGAGET CHAR TO SEND (QPTR),YSTOREMAIN INTACT. ; SYSERR IF ILLEGAL BUFFER. ; BSEND REGA REGXSAVE Y-REG #MEMIN SBANK2 CURRPIDGET OUR PID PBUFIN,YGET OUR BUFID REGYSAVE IT FOR LATER USE  /BUFBASESET UP PTR TO BUF QPTR+1 #$00 QPTRDONE REGY#NBUFSTART AT LIST END ^1 ERR150NO FREE BUFS, ERROR BUFLIST,YBUFFER FREE? <1NO, LOOP NOERR150SET NO ERRORS AND RETURN ERR150 SET SYSERR AND RETURN ; ; ; %;BSEND: SEND A MESSAGE TO THE BUFFER "; WE OWN, ALL REGS REFFER IS HELD BY SENDER +; PBUFOUT ; " " RECEIVER ; (; BUFLIST ;00=FREE, FF=LIMBO, ELSE PID ; INPTR ;LIST OF INPUT PTRS ; OUTPTR ;LIST OF OUTPUT PTRS ; ; %;GETBUF: GETS A BUFFER FROM THE POOL ; RETURNS BUFID IN Y-REG. ; "GETBUF ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 15 * * * ****************** ; ; ; ;IN PROCESS TABLE: ; *; PBUFIN ;WHICH BU!!!!!!!!!""" " " " " """"""UTKICK MEM OUT SBANK2 AND ALLOW INTS  ; ; ; %;MEMBLOCK:FINDS A BLOCK OF MEMORY OF "; LENGTH X, RETURNS SYSERR IF ONE "; UNAVAILABLE, ELSE X=PAGE START. ; MEMBLOCKDISABLE INTS #MEMINBRING MEMLIST IN SBANK2 QPTRSAVE RANGE LENGTH QPTR PROCADDR+1GET START IN X-REG #$D0IS IT A SHELL PROC NOERR108YES, NO ERROR ^1 MEMLIST,XPAGE FREE? ERR108NO, RETURN ERROR PAST EOF RANGE? QPTR <1NO NOERR108NO ERRORS  A9SKIP INST. ERR108 ERROR #MEMOLY $; BY O/S, WITH INTERRUPTS DISABLED. ; ; $;MEMFREE:CHECKS TO SEE IF ANY PAGES "; IN PROCADDR-PROCEND ARE ALREADY $; ALLOCATED, RETURN SYSERR IF TRUE. ; MEMFREE DISABLE INTS #MEMINBRING IN MEMLIST SBANK2 PROCEND+1GET END PAGE PLUS 1 %; PAGES OF USER MEMORY. EACH PAGE IS ; MARKED AS FOLLOWS- ; '; #$FF - USED BY O/S, AND UNAVAILABLE ; #$00 - FREE TO BE ALLOCATED ); #$0x - USED BY PROCESS x, UNAVAILABLE ; %; THE ROUTINES MEMARK AND MEMCLR ARE '; SYSTEM ROUTINES, & TO BE CALLED ON& ****************** * * * XINU OPERATING * * SYSTEM * * * * BY W.TOOMEY * * * * CHAPTER 8 * * * ****************** ; ; ; ; ; %;MEMLIST HOLDS THE STATUS OF ALL 256!! ! ! ! DDA #$03 $F94A DAYHI $FDDA DAYLO $FDDA #$01 $F94A CLOCKHI $FDDA CLOCKLO $FDDA  $29  $28  $24  RESCHED **RESCHED $2109 $24STORE X,Y POSN  $28  $29  #$00 $24SET UP OUR OWN $28 #$04 $29 CURRPIDPRINT PID $FDDA #$01 $F94A NUMPROC $FDDA #$03 $F94A TIKCNT $FDDA #$01 $F94A CLKCNT $F""T3 QPTRGET REGS BACK QPTR+1 STOPPROC BLOADAND TRY AGAIN ; ERR154 SET SYSERR #MEMOUT SBANK2  AND RETURN ; ; ; ; ; ; N ; ; ; R+1 #$00 MPTR INBUF,YBUFFER EMPTY? WAIT3YES, WAIT #$00RESET TO EMPTY INBUF,Y REGXSAVE X-REG #$00 "^1 (MPTR),YOK, LOAD BLOCK #MEMOUT SBANK2 (QPTR),Y #MEMIN SBANK2  <1DONE NOERR154AND EXIT ; WAI256-BYTES FROM BUFFER IF *; FULL. A,Y HOLD BASE ADDRESS TO LOAD TO. ; BLOAD QPTR QPTR+1SET UP PTR #MEMIN SBANK2 CURRPID PBUFOUT,YGET OUT BUFID ERR154FREE, ERROR SAVE BUFID IN YREG  /BUFBASESET UP PTR IN MPTR MPTAWFUL AINT IT! (QPTR),Y #MEMIN SBANK2 (MPTR),Y  <1DONE NOERR154SET OK REGXGET X-REG BACK #MEMOUT SBANK2  AND RETURN ; WAIT2 QPTRGET REGS BACK QPTR+1 STOPPROC BDUMPAND TRY AGAIN ; ; ; %;BLOAD READ OR SAVE BUFID IN Y-REG  /BUFBASESET UP OUTPUT PTR MPTR+1 #$00 MPTR INBUF,YBUFFER EMPTY? WAIT2NO, WAIT THEN #$FFYES, SET IT FULL INBUF,Y REGXSAVE XREG #$00OK, DUMP IT ^1 #MEMOUTMOVE MEM OUT SBANK2YUK, SBANK2  AND RETURN ; ; ; (;BDUMP: DUMPS 256-BYTES INTO OUR BUFFER %; IF EMPTY. A,Y HOLD BASE ADDRESS OF ; BLOCK TO DUMP. ; BDUMP QPTRSAVE POINTER QPTR+1 #MEMIN SBANK2 CURRPID PBUFIN,YGET OUT BUFID ERR153FREE, ERRERR153NONE, ERROR OK SET RECEIVING PROCESS PBUFOUT,X CURRPIDSET SENDING PID PBUFIN,X PUT CURRPID IN A-REG BUFLIST,YSET WE OWN BUFFER REGXGET X-REG BACK NOERR153SET NO ERROR  24SKIP SEC ERR153 SET SYSERR #MEMOUT ND THE '; PROCESS IN THE X-REG. BUFID RETURNED ; IN THE Y-REG. ; FINDBUF REGXSAVE PROC ID #MEMIN SBANK2 #$01LEGAL PID? ERR153 #NPROC ERR153 $PBUFOUT,XPROC ALREADY RECEIVING? ERR153YES, ERROR GETBUFOK, GET A BUFFER BUFIN,Y GET BUFID BACK USE AS OFFSET TO SEE BUFLIST,YIS BUFFER USED ERR152FREE, ERROR ERR152LIMBO, EXIT #$00SET A TO 0 BCLEARAND CLEAR ALL PTRS ; ; ; );FINDBUF: USER CALL TO ALLOCATE A BUFFER '; BETWEEN THE CURRENT PROCESS, AET: RESETS THE BUFFER WE OWN. %; THE BUFFER IS IMMEDIATELY RETURNED &; TO THE POOL. ALL REGS RETURN INTACT ; BRESET REGASAVE A&Y-REGS REGX #MEMIN SBANK2 CURRPIDGET OUT BUFID PBUFIN,Y SAVE IT #$00SET WE DON'T OWN A BUF PET OUR BUFID PBUFIN,Y USE AS OFFSET TO SEE IF BUFLIST,YBUFFER USED? ERR152FREE, EXIT ERR152LIMBO, EXIT #BLIMBOSET BUFFER IN LIMBO BUFLIST,Y !CURRPIDNOW SET WE DONT OWN IT #$00 PBUFIN,Y NOERR152AND EXIT ; ; ; #;BRESERR151 ; ; ; &;BDELETE: DELETES THE BUFFER OWNED BY &; THE PROCESS. THE BUFFER IS RETURNED $; TO THE BUFFER POOL WHEN ALL CHARS &; ARE READ. ALL REGS RETURN UNCHANGED ; BDELETE REGASAVE A-REG REGXAND Y-REG #MEMIN SBANK2 CURRPIDGBREADAND TRY AGAIN ; '^1 CURRPIDOK, SET WE DONT HAVE #$00THIS BUFFER ANYMORE PBUFOUT,Y REGYGET BUFID BCLEAR INBUF,YSET PTRS TO 0 OUTBUF,Y BUFLIST,YAND SET BUFFER FREE ; ; ; %ERR152 ERR151& EXIT WITH NO CHAR NOERR152