/ u0 -- unix cold = 0 orig = 0 . / orig = 0. relocatable rkda = 177412 / disk address reg rk03/rk11 rkds = 177400 / driv status reg rk03/rk11 rkcs = 177404 / control status reg rk03/rk11 rcsr = 174000 / receiver status reg dc-11 rcbr = 174002 / receiver buffer reg dc-11 tcsr = 174004 / xmtr status reg dc-11 tcbr = 174006 / xmtr buffer reg dc-11 tcst = 177340 / dec tape control status tc11/tu56 tccm = 177342 / dec tape command reg tc11/tu56 tcwc = 177344 / word count tc11/tu56 tcba = 177346 / bus addr tc11/tu56 tcdt = 177350 / data reg tc11/tu56 dcs = 177460 / drum control status rf11/rs11 dae = 177470 / drum address extension rf11/rs11 lks = 177546 / clock status reg kw11-l prs = 177550 / papertape reader status pc11 prb = 177552 / buffer pc11 pps = 177554 / punch status pc11 ppb = 177556 / punch buffer pc11 /lps = 177514 line printer status (future) /lpb = 177516 line printer buffer (future) tks = 177560 / console read status asr-33 tkb = 177562 / read buffer asr-33 tps = 177564 / punch status asr-33 tpb = 177566 / punch buffer asr-33 ps = 177776 / processor status fpsym = 0 / define fpsym even though we cannot use it .. = 0 . / ensure a.out starts at location 0, not 040000 halt = 0 wait = 1 rti = 2 nproc = 16. / number of processes nfiles = 50. ntty = 8+1 nbuf = 6 .if cold / ignored if cold = 0 nbuf = 2 .endif core = orig+40000 / specifies beginning of user's core ecore = core+40000 / specifies end of user's core (4096 words) / 4;4 init by copy / unkni;0 " error / fpsym;0 " illg in tr unkni;0 / trace and trap (see Sec. B.1 page ) unkni;0 / trap panic;0 / pwr rtssym;0 / emt sysent;0 / sys . = orig+60 ttyi;240 / interrupt vector tty in ; processor level 5 ttyo;240 / interrupt vector tty out ppti;240 / punch papertape in ppto;240 / punch papertape out clock;340 / clock interrupt vector ; processor level 7 . = orig+200 / lpto; 240 line printer interrupt ; processor level 5 (future) . = orig+204 drum;300 / drum interrupt ; processor level 6 . = orig+214 tape;300 / dec tape interrupt disk;300 / rk03 interrupt . = orig+300 0*4+trcv; 240; 0*4+txmt; 240 / dc11 input,output interrupt vectors 1*4+trcv; 240; 1*4+txmt; 240 2*4+trcv; 240; 2*4+txmt; 240 3*4+trcv; 240; 3*4+txmt; 240 4*4+trcv; 240; 4*4+txmt; 240 5*4+trcv; 240; 5*4+txmt; 240 6*4+trcv; 240; 6*4+txmt; 240 7*4+trcv; 240; 7*4+txmt; 240 . = orig+400 / copy in transfer vectors mov $ecore,sp / put pointer to ecore in the stack pointer jsr r0,copyz; 0; 14 / clear locations 0 to 14 in core mov $4,r0 clr r1 mov r0,(r1)+ / put value of 4 into location 0 mov r0,(r1)+ / put value of 4 into location 2 mov $unkni,(r1)+ / put value of unkni into location 4; / time out, bus error clr (r1)+ / put value of 0 into location 6 mov $fpsym,(r1)+ / put value of fpsym into location 10 clr (r1)+ / put value of 0 into location 12 / clear core .if cold / ignored if cold = 0 halt / halt before initializing rf file system; user has / last chance to reconsider .endif jsr r0,copyz; systm; ecore / clear locations systm to ecore mov $s.chrgt+2,clockp / intialize clockp / allocate tty buffers; see H.0 for description mov $buffer,r0 mov $tty+6,r1 1: mov r0,(r1) add $140.,r0 / tty buffers are 140. bytes long add $8,r1 cmp r1,$tty+[ntty*8] / has a buffer been assigned for each tty blo 1b / allocate disk buffers; see H.0 for description mov $bufp,r1 1: mov r0,(r1)+ add $8,r0 mov r0,-2(r0) / bus address mov $-256.,-4(r0) / word count add $512.,r0 / buffer space cmp r1,$bufp+nbuf+nbuf blo 1b mov $sb0,(r1)+ / I/O queue entry drum mov $sb1,(r1)+ / I/O queue entry disk (mounted device) mov $swp,(r1)+ / I/O queue entry core image being swapped mov $[systm-inode]\/2,sb0+4 / sets up initial buffers per / format given in mov $systm,sb0+6 / memory map mov $-512.,sb1+4 mov $_mount,sb1+6 mov $user,swp+6 / set devices to interrupt mov $100,*$lks / put 100 into clock status register; / enables clock interrupt / set up time out subroutines mov $touts,r0 mov $startty,(r0)+ / if toutt = 0 call startty mov $pptito,(r0)+ / if toutt+1 = 0 call pptito tst (r0)+ / add 2 to r0 mov $ntty-1,r1 1 : mov $xmtto,(r0)+ / if toutt+2 thru toutt+2+ntty=0 call xmtto dec r1 bne 1b / free all character blocks; see H.0 for description mov $510.,r2 mov $-1,r1 1: jsr r0,put sub $2,r2 bgt 1b / set up drum swap addresses; see H.0 for description mov $1024.-64.,r1 / highest drum address; high 64 blks allocated / to UNIX mov $p.dska,r2 / p.dska contains disk addresses for processes 1 : sub $33.,r1 / 33 blocks per process, allows 16K per process mov r1,(r2)+ cmp r2,$p.dska+nproc+nproc bne 1b / free rest of drum .if cold mov $128.,systm / initialize word 1 of drum superblock image; / number of bytes in free storage map=128. mov $64.,systm+2+128. / init. wd 66. of superblock image; # of / bytes in i-node map=64. 1: dec r1 / r1=687.,...,34. jsr r0,free / free block 'r1', i.e., set bit 'r1' in free / storage map in core cmp r1,$34. / first drum address not in i list bgt 1b / if block 34 has been freed, zero i list / zero i list 1: dec r1 / r1=33.,...,1 jsr r0,clear / zero block 'r1' on fixed head disk tst r1 bgt 1b / if blocks 33,...,1 have all been zeroed, done. .endif / make current program a user mov $41.,r0 / rootdir set to 41 and never changed mov r0,rootdir / rootdir is i-number of root directory mov r0,u.cdir / u.cdir is i-number of process current directory mov $1,r0 movb r0,u.uno / set process table index for this process to 1 mov r0,mpid / initialize mpid to 1 mov r0,p.pid / p.pid identifies process movb r0,p.stat / process status = 1 i.e., active / = 0 free .if cold / = 2 waiting for a child to die / = 3 terminated but not yet waited / for / initialize inodes for special files (inodes 1 to 40.) mov $40.,r1 / set r1=i-node-number 40. 1: jsr r0,iget / read i-node 'r1' from disk into inode area of / core and write modified inode out (if any) mov $100017,i.flgs / set flags in core image of inode to indi- / cate allocated, read (owner, non-owner), / write (owner, non-owner) movb $1,i.nlks / set no. of links = 1 movb $1,i.uid / set user id of owner = 1 jsr r0,setimod / set imod=1 to indicate i-node modified, also / stuff time of modification into i-node dec r1 / next i-node no. = present i-node no.-1 bgt 1b / has i-node 1 been initialized; no, branch / initialize i-nodes r1.,...,47. and write the root device, binary, etc., / directories onto fixed head disk. user temporary, initialization prog. mov $idata,r0 / r0=base addr. of assembled directories. mov $u.off,u.fofp / pointer to u.off in u.fofp (holds file / offset) 1: mov (r0)+,r1/r1=41.,...,47; "0" in the assembled directory / header signals last beq 1f / assembled directory has been written onto drum jsr r0,imap / locate the inode map bit for i-node 'r1' bisb mq,(r2) / set the bit to indicate the i-node is not / available jsr r0,iget / read inode 'r1' from disk into inode area of / core and write modified i-node on drum (if any) mov (r0)+,i.flgs / set flags in core image of inode from / assembled directories header movb (r0)+,i.nlks / set no. of links from header movb (r0)+,i.uid / set user id of owner from header jsr r0,setimod / set imod=1 to indicate inode modified; also, / stuff time of modification into i-node mov (r0)+,u.count / set byte count for write call equal to / size of directory mov r0,u.base / set buffer address for write to top of directory clr u.off / clear file offset used in 'seek' and 'tell' add u.count,r0 / r0 points to the header of the next directory jsr r0,writei / write the directory and i-node onto drum br 1b / do next directory .endif / next 2 instructions not executed during cold boot. bis $2000,sb0 / sb0 I/O queue entry for superblock on drum; / set bit 10 to 1 jsr r0,ppoke / read drum superblock 1: tstb sb0+1 / has I/O request been honored (for drum)? bne 1b / no, continue to idle. 1: decb sysflg / mormally sysflag=0, indicates executing in system sys exec; 2f; 1f / generates trap interrupt; trap vector = / sysent; 0 br panic / execute file/etc/init 1: 2f;0 2: / UNIX looks for strings term, noted by nul\0 panic: clr ps 1: dec $0 bne 1b dec $5 bne 1b jmp *$173700 / rom loader address rtssym: mov r0,-(sp) mov r1,-(sp) mov 4(sp),r0 mov -(r0),r0 bic $!7,r0 asl r0 jmp *1f(r0) 1: 0f;1f;2f;3f;4f;5f;badrts;7f 0: mov 2(sp),r0 br 1f 2: mov r2,r1 br 1f 3: mov r3,r1 br 1f 4: mov r4,r1 br 1f 5: mov r5,r1 br 1f 7: mov 8.(sp),r1 1: cmp r1,$core blo badrts cmp r1,$ecore bhis badrts bit $1,r1 bne badrts tst (r1) beq badrts add $1f,r0 mov r0,4(sp) mov (sp)+,r1 mov (sp)+,r0 rti 1: rts r0 rts r1 rts r2 rts r3 rts r4 rts r5 rts sp rts pc badrts: mov (sp)+,r1 mov (sp)+,r0 rpsym: jmp unkni .if cold idata: / root 41. 140016 .byte 7,1 9f-.-2 41. <..\0\0\0\0\0\0> 41. <.\0\0\0\0\0\0\0> 42. 43. 44. 45. 46. 9: / device directory 42. 140016 .byte 2,1 9f-.-2 41. <..\0\0\0\0\0\0> 42. <.\0\0\0\0\0\0\0> 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 01. / really tty 9: / binary directory 43. 140016 .byte 2,3 9f-.-2 41. <..\0\0\0\0\0\0> 43. <.\0\0\0\0\0\0\0> 9: / etcetra directory 44. 140016 .byte 2,3 9f-.-2 41. <..\0\0\0\0\0\0> 44. <.\0\0\0\0\0\0\0> 47. 9: / user directory 45. 140016 .byte 2,1 9f-.-2 41. <..\0\0\0\0\0\0> 45. <.\0\0\0\0\0\0\0> 9: / temporary directory 46. 140017 .byte 2,1 9f-.-2 41. <..\0\0\0\0\0\0> 46. <.\0\0\0\0\0\0\0> 9: / initialization program 47. 100036 .byte 1,3 9f-.-2 8: sys break; 0 sys open; 6f-8b+core; 0 mov r0,r1 sys seek; 65.; 0 1: mov r1,r0 sys read; 9f-8b+core; 512. mov 9f,r5 / size beq 1f sys creat; 9f-8b+core+4; 0 mov r0,r2 movb 9f+2,0f sys chmod; 9f-8b+core+4; 0:.. movb 9f+3,0f sys chown; 9f-8b+core+4; 0:.. 2: tst r5 beq 2f mov r1,r0 sys read; 9f-8b+core; 512. mov $512.,0f cmp r5,$512. bhi 3f mov r5,0f 3: mov r2,r0 sys write; 9f-8b+core; 0:.. sub r0,r5 br 2b 2: mov r2,r0 sys close br 1b 1: mov r1,r0 sys close sys exec; 5f-8b+core; 4f-8b+core sys exit 4: 5f-8b+core; 0 5: 6: .even 9: / end of initialization data 0 .endif