"** 01-s1.pdf page 62 " sop dac = 0040000 " MEM: deposit AC 040000 jms = 0100000 " MEM: jump to subroutine 100000 dzm = 0140000 " MEM: deposit zero to memory 140000 lac = 0200000 " MEM: load AC 200000 xor = 0240000 " MEM: XOR with AC 240000 add = 0300000 " MEM: one's complement add 300000 tad = 0340000 " MEM: two's complement add 340000 xct = 0400000 " MEM: execute 400000 isz = 0440000 " MEM: increment and skip if zero 440000 and = 0500000 " MEM: AND 500000 sad = 0540000 " MEM: skip if AC different 540000 jmp = 0600000 " MEM: jump 600000 nop = 0740000 " OPR: no-op 740000 i = 020000 " indirect 020000 law = 0760000 " OPR: load accumulator with (instr) 760000 cma = 0740001 " OPR: complement AC 740001 las = 0750004 " OPR: load AC from switches 750004 ral = 0740010 " OPR: rotate AC left 740010 rar = 0740020 " OPR: rotate AC right 740020 hlt = 0740040 " OPR: halt 740040 sma = 0740100 " OPR: skip on minus AC 740100 sza = 0740200 " OPR: skip on zero AC 740200 snl = 0740400 " OPR: skip on non-zero link 740400 skp = 0741000 " OPR: skip unconditionally 741000 spa = 0741100 " OPR: skip on positive AC 741100 sna = 0741200 " OPR: skip on non-zero AC 741200 szl = 0741400 " OPR: skip on zero link 741400 rtl = 0742010 " OPR: rotate two left 742010 rtr = 0742020 " OPR: rotate two right 742020 cll = 0744000 " OPR: clear link 744000 rcl = 0744010 " OPR: clear link, rotate left 744010 rcr = 0744020 " OPR: clear link, rotate right 744020 cla = 0750000 " OPR: clear AC 750000 lrs = 0640500 " EAE: long right shift 640500 lrss = 0660500 " EAE: long right shift, signed 660500 lls = 0640600 " EAE: long left shift 640600 llss = 0660600 " EAE: long left shift, signed 660600 als = 0640700 " EAE: AC left shift 640700 alss = 0660700 " EAE: AC left shift, signed 660700 mul = 0653122 " EAE: multiply 653122 idiv = 0653323 " EAE: integer divide 653323 lacq = 0641002 " EAE: load AC with MQ 641002 clq = 0650000 " EAE: clear MQ 650000 omq = 0640002 " EAE: OR MQ into AC 640002 cmq = 0650004 " EAE: complement MQ 650004 lmq = 0652000 " EAE: load MQ from AC 652000 dscs = 0707141 " DSK: clear status register 707141 dslw = 0707124 " DSK: clear and load WC from AC 707124 dslm = 0707142 " DSK: clear and load MAC from AC 707142 dsld = 0707104 " DSK: clear and load TA and SA from AC 707104 dsls = 0707144 " DSK: load status 707144 dssf = 0707121 " DSK: skip on flags 707121 dsrs = 0707132 " DSK: read status register 707132 iof = 0700002 " PIC: interrupts off 700002 ion = 0700042 " PIC: interrupts on 700042 caf = 0703302 " CPU: clear all flags 703302 clon = 0700044 " CLK: clear flag, enable 700044 clsf = 0700001 " CLK: skip if overflow 700001 "** 01-s1.pdf page 63 clof = 0700004 " CLK: clear flag, disable 700004 ksf = 0700301 " KBD: skip if flag set 700301 krb = 0700312 " KBD: read buffer 700312 tsf = 0700401 " TTY: skip if flag set 700401 tcf = 0700402 " TTY: clear flag 700402 tls = 0700406 " TTY: load buffer, select 700406 sck = 0704301 " G-2: skip on console keyboard 704301 cck = 0704304 " G-2: clear console keyboard 704304 lck = 0704312 " G-2: load console keyboard 704312 rsf = 0700101 " PTR: skip if flag set 700101 rsa = 0700104 " PTR: select alphanumeric mode 700104 rrb = 0700112 " PTR: clear flag, or read buffer 700112 psf = 0700201 " PTP: skip if flag set 700201 pcf = 0700202 " PTP: clear flag 700202 psa = 0700204 " PTP: alphanumeric mode 700204 cdf = 0700501 " G-2: clear display flags 700501 lds = 0701052 " G-2: load display status 701052 lda = 0701012 " G-2: load display address 701012 wcga = 0704206 " G-2: ??? 704206 raef = 0700742 " G-2: resume after edges flag 700742 rlpd = 0700723 " G-2: resume after light pen stop, disabled 700723 beg = 0700547 " G-2: begin 700547 spb = 0704401 " G-2: skip on push button flag 704401 cpb = 0704404 " G-2: clear push button flag 704404 lpb = 0704412 " G-2: load push buttons 704412 wbl = 0704424 " G-2: write button lights 704424 dprs = 0704752 " dataphone: read status 704752 dpsf = 0704741 " dataphone: skip on flag 704741 dpcf = 0704761 " dataphone: clear flag 704761 dprc = 0704712 " dataphone: read character 704712 crsf = 0706701 " CDR: skip if ready 706701 crrb = 0706712 " CDR: read buffer 706712 " S1 .. = 0 000000 t = 0 000000 orig: hlt " overwritten with interrupt return addr 000000: 740040 jmp pibreak " dispatch to interrupt processing 000001: 603407 . = orig+7 1000007 -1 " only ever set (to -1): never read?! 000007: 777777 . = orig+020 " syscall (CAL) and user "interrupt" processing 1000020 1f " addr for "CAL I": store return here on "CAL" 000020: 000032 iof " interrupts off 000021: 700002 dac u.ac " save user AC 000022: 045631 lac 020 " save user return addr 000023: 200020 dac 1f " save as if "CAL I" 000024: 040032 lac 1f-1 000025: 200031 dac 020 " restore location 20 000026: 040020 lac u.ac " restore user AC 000027: 205631 jmp 1f+1 " join "CAL I" processing 000030: 600033 1f " literal to restore location 20 000031: 000032 1: 0 " "CAL I" PC stored here 000032: 000000 iof " interrupts off 000033: 700002 dac u.ac " save user AC 000034: 045631 lacq 000035: 641002 dac u.mq " save user MQ 000036: 045632 lac 8 000037: 200010 dac u.rq " save user auto-index location 8 000040: 045633 lac 9 000041: 200011 dac u.rq+1 " save user auto-index location 9 000042: 045634 jms copy; 10; u.rq+2; 6 " save user auto-index locations 10-15 000043: 101667 000044: 000012 000045: 005635 000046: 000006 lac 1b " load user PC after system call 000047: 200032 dac u.rq+8 " save user PC 000050: 045643 -1 " load -1 000051: 777777 dac .savblk " set "save" flag (cleared by disk I/O?) 000052: 044072 dac .insys " set "in system" flag 000053: 044066 lac uquant " load user quantum count 000054: 205474 jms betwen; d0; maxquant " check if between 0 & maxquant?? 000055: 101643 000056: 004116 000057: 004100 jms swap " no: swap processes 000060: 100136 ion " interrupts on 000061: 700042 -1 000062: 777777 tad u.rq+8 " get address of system call 000063: 345643 jms laci " load AC indirect?? 000064: 101635 jms betwen; o20001; swn " range check 000065: 101643 000066: 004161 000067: 000256 jmp badcal " bad system call 000070: 601146 tad swp " add system call table base 000071: 340220 dac .+1 " save as next instruction 000072: 040073 jmp .. i " dispatch system call 000073: 620000 . = orig+0100 1000100 jmp coldentry " here to start kernel 000100: 604507 jms halt 000101: 102254 okexit: dzm u.ac " 'OK' system call exit: clear user AC 000102: 145631 sysexit: " common system call exit code ion " enable interrupts 000103: 700042 lac .savblk " load "save" flag 000104: 204072 sza " is zero (cleared by disk I/O)? 000105: 740200 jmp 1f " no: no disk I/O done? 000106: 600116 jms copy; sysdata; dskbuf; 64 " copy system data to disk buffer 000107: 101667 000110: 005542 000111: 007700 000112: 000100 cla 000113: 750000 jms dskio; 07000 " save to disk? 000114: 102162 000115: 007000 1: dzm .insys " clear "in system call" flag 000116: 144066 jms chkint " pending user interrupt? 000117: 100320 skp " no 000120: 741000 jmp .save " yes: dump core 000121: 601151 jms copy; u.rq+2; 10; 6 " restore auto-index locations 10-15 000122: 101667 000123: 005635 000124: 000012 000125: 000006 lac u.rq+1 " restore auto-index location 9 000126: 205634 dac 9 000127: 040011 lac u.rq " restore auto-index location 8 000130: 205633 dac 8 000131: 040010 lac u.mq " restore MQ register 000132: 205632 lmq 000133: 652000 lac u.ac " restore AC register 000134: 205631 jmp u.rq+8 i " return to user 000135: 625643 " scheduler / idle loop swap: 0 000136: 000000 ion 000137: 700042 1: jms lookfor; 3 " out/ready 000140: 101066 000141: 000003 jmp 1f 000142: 600151 jms lookfor; 1 " in/ready 000143: 101066 000144: 000001 skp 000145: 741000 jmp 1b " loop until a process becomes ready 000146: 600140 dzm maxquant " in/ready (self?): come back next tick! 000147: 144100 jmp 3f 000150: 600215 1: " here with out/ready process dac 9f+t " save process pointer (swapped out) in t0 000151: 044205 jms lookfor; 2 " in/notready " find a swapped in process to swap out? 000152: 101066 000153: 000002 jmp 1f 000154: 600161 jms lookfor; 1 " in/ready 000155: 101066 000156: 000001 jmp 1f 000157: 600161 jmp 2f 000160: 600177 1: lac swap 000161: 200136 dac u.swapret " return to caller when swapped back 000162: 045650 iof 000163: 700002 lac o200000 " change status to swapped out 000164: 204170 tad u.ulistp i 000165: 365647 dac u.ulistp i 000166: 065647 ion 000167: 700042 jms dskswap; 07000 " swap process out 000170: 102267 000171: 007000 lac u.dspbuf 000172: 205712 sna " process using display?? 000173: 741200 jmp 2f " no 000174: 600177 law dspbuf " reset to default display buffer 000175: 764446 jms movdsp 000176: 102615 2: iof " disable interrupts 000177: 700002 lac o600000 " change status (1->7???] 000200: 204176 tad 9f+t i 000201: 364205 dac 9f+t i 000202: 064205 ion " enable interrupts 000203: 700042 jms dskswap; 06000 " read process in? 000204: 102267 000205: 006000 lac u.swapret " set our return addr 000206: 205650 dac swap " to saved return addr 000207: 040136 lac o20 " reset maxquant to 16 ticks 000210: 204134 dac maxquant 000211: 044100 lac u.dspbuf 000212: 205712 sza " using display? 000213: 740200 "** 01-s1.pdf page 4 jms movdsp " yes. switch to user display bufferx 000214: 102615 3: dzm uquant " no. reset process tick count 000215: 145474 iof 000216: 700002 jmp swap i " return 000217: 620136 t = t+1 000001 swp: " system call dispatch table jmp . " base instruction 000220: 600220 .save; .getuid; .open; .read; .write; .creat; .seek; .tell 000221: 001151 000222: 000426 000223: 000626 000224: 000724 000225: 000773 000226: 000660 000227: 000431 000230: 000461 .close; .link; .unlink; .setuid; .rename; .exit; .time; .intrp 000231: 000720 000232: 000467 000233: 000542 000234: 000561 000235: 000567 000236: 001163 000237: 000610 000240: 000257 .chdir; .chmod; .chown; badcal; .sysloc; badcal; .capt; .rele 000241: 000615 000242: 000407 000243: 000421 000244: 001146 000245: 000262 000246: 001146 000247: 000377 000250: 000403 .status; badcal; .smes; .rmes; .fork 000251: 000352 000252: 001146 000253: 001225 000254: 001177 000255: 001111 swn: .-swp-1 i " count of system calls, plus indirect! 000256: 020035 " AC/ new value for intflg (non-zero to ignore interrupt char) " sys intrp .intrp: lac u.ac 000257: 205631 dac u.intflg 000260: 045713 jmp okexit 000261: 600102 " syscall to retrieve system addresses (data & routines!!) " AC/ index (1..17) " sys sysloc " AC/ address (or -1 on bad index) .sysloc: lac u.ac 000262: 205631 and o17777 000263: 504160 jms betwen; d1; locn 000264: 101643 000265: 004117 000266: 000317 jms error 000267: 101531 tad locsw 000270: 340275 dac .+1 000271: 040272 lac .. 000272: 200000 dac u.ac 000273: 045631 jmp sysexit 000274: 600103 locsw: " table of system addresses for sysloc lac . 000275: 200275 iget; inode; userdata; sysdata; copy; copyz; betwen; dskrd 000276: 003017 000277: 005732 000300: 005631 000301: 005542 000302: 001667 000303: 001712 000304: 001643 000305: 002116 dskwr; dskbuf; dpdata; namei; pbsflgs; alloc; free; dspdata 000306: 002146 000307: 007700 000310: 005532 000311: 002737 000312: 005476 000313: 001545 000314: 001604 000315: 005536 crdata 000316: 005540 locn: .-locsw-1 000317: 000021 " check if "interrupt" for current process " checks .int1 and .int2 (contain i-number of interrupt source) " compared against process stdin " " call: " .insys/ 0 " jms chkint " no: no interrupt, or intflg set (discards interrupt) " yes: PI off, .insys set chkint: 0 000320: 000000 lac .insys 000321: 204066 sza " in system? 000322: 740200 jmp chkint i " yes: return 000323: 620320 lac .int1 " get inumber of interrupt1 source? 000324: 204067 sna " zero? 000325: 741200 jmp 1f " yes: skip stdin check 000326: 600331 sad u.ofiles+2 " non-zero: compare to stdin inumber 000327: 545656 jmp 2f " same 000330: 600341 1: lac .int2 " get inum of interrupt 2 source? 000331: 204070 sna " zero? 000332: 741200 jmp chkint i " yes: return 000333: 620320 sad u.ofiles+2 " non-zero: compare to stdin inumber 000334: 545656 skp " match! 000335: 741000 jmp chkint i " no match: return 000336: 620320 dzm .int2 " clear int2 source 000337: 144070 jmp 1f 000340: 600342 2: dzm .int1 " clear int1 source 000341: 144067 1: "** 01-s1.pdf page 5 lac u.intflg " get user intflg 000342: 205713 sza " zero? 000343: 740200 jmp chkint i " no: ignore 000344: 620320 -1 000345: 777777 dac .insys " set "in system" flag 000346: 044066 ion " enable interrupts 000347: 700042 isz chkint " give skip return 000350: 440320 jmp chkint i 000351: 620320 "** 01-s1.pdf page 7 " s2 " file status (stat) system call " AC/ pointer to status (inode) buffer + i-num (13 words) " sys status; dir_name_ptr; file_name_ptr " NO_DD version: sys status; file_name_ptr .status: jms arg " fetch file name pointer 000352: 102625 dac .+3 000353: 040356 lac u.cdir " get current working directory 000354: 205646 jms namei; .. " look up file 000355: 102737 000356: 000000 jms error " not found: return error 000357: 101531 jms iget " read file inode 000360: 103017 lac u.ac " get user buffer pointer 000361: 205631 and o17777 " truncate to 13 bits 000362: 504160 jms betwen; o10000; o17762 " is user memory (but not last 14 wds)? 000363: 101643 000364: 004156 000365: 004157 jms error " no: error 000366: 101531 dac .+3 " save as copy destination 000367: 040372 jms copy; inode; ..; 12 " copy inode to user buffer 000370: 101667 000371: 005732 000372: 000000 000373: 000014 lac d.i " copy i-num from last dnode read ?? 000374: 205747 dac 9 i " save thru index 9 (pre-increment) ?? 000375: 060011 jmp okexit 000376: 600102 " capture display? .capt: lac u.ac " get user AC 000377: 205631 dac u.dspbuf " save as user display buffer 000400: 045712 jms movdsp " switch to user display buffer 000401: 102615 jmp sysexit 000402: 600103 " release display? .rele: dzm u.dspbuf " clear user display buffer pointer 000403: 145712 law dspbuf " get default display buffer 000404: 764446 jms movdsp " change to it 000405: 102615 jmp sysexit 000406: 600103 .chmod: jms isown " check if user owns file arg 000407: 102664 lac u.ac " get new permissions 000410: 205631 and o17 " mask to read/write bits 000411: 504133 lmq " save in MQ 000412: 652000 lac i.flags " get file flags 000413: 205732 and o777760 " clear permissions 000414: 504202 omq " or in new permissions from MQ 000415: 640002 dac i.flags " save in inode 000416: 045732 jms iput " write inode back 000417: 103046 jmp okexit 000420: 600102 .chown: jms isown " check if user owns file arg 000421: 102664 lac u.ac " get new owner 000422: 205631 dac i.uid " save in inode 000423: 045742 jms iput " write inode back 000424: 103046 jmp okexit 000425: 600102 .getuid: " getuid system call lac u.uid 000426: 205644 dac u.ac " return u.uid in user AC 000427: 045631 jmp sysexit 000430: 600103 .seek: jms seektell 000431: 102645 tad u.base 000432: 345651 "** 01-s1.pdf page 8 spa 000433: 741100 jms error 000434: 101531 lmq 000435: 652000 lac f.flags 000436: 205757 and d1 000437: 504117 sna 000440: 741200 jms 1f 000441: 100450 lacq 000442: 641002 jms betwen; d0; i.size 000443: 101643 000444: 004116 000445: 005744 jms dacisize 000446: 103402 jmp 2f 000447: 600455 1: lacq 000450: 641002 jms betwen; d0; i.size 000451: 101643 000452: 004116 000453: 005744 lac i.size 000454: 205744 2: dac f.badd 000455: 045760 dac u.ac 000456: 045631 jms fput 000457: 102402 jmp sysexit 000460: 600103 .tell: jms seektell 000461: 102645 cma 000462: 740001 tad d1 000463: 344117 tad u.base 000464: 345651 dac u.ac 000465: 045631 jmp sysexit 000466: 600103 .link: jms arg " Save the argument pointers in 000467: 102625 dac 0f "0f, 1f and 2f 000470: 040477 jms arg 000471: 102625 dac 1f 000472: 040502 jms arg 000473: 102625 dac 2f 000474: 040506 lac u.cdir " Search the current directory 000475: 205646 jms namei; 0:0 " for the first argument 000476: 102737 000477: 000000 jms error " Didn't find it 000500: 101531 jms namei; 1:0 " In the i-num found by 1st namei, 000501: 102737 000502: 000000 jms error " search for 2nd argument, err not found 000503: 101531 dac u.base " save in user data 000504: 045651 jms copy; 2:0; name; 4 000505: 101667 000506: 000000 000507: 005504 000510: 000004 lac u.cdir " Search the process' current directory 000511: 205646 jms namei; name " for the third argument 000512: 102737 000513: 005504 skp 000514: 741000 jms error " Error if it already exists 000515: 101531 lac d1 000516: 204117 dac mode " Save mode bits for access 000517: 045500 jms access " check access (or return error to user) 000520: 102312 jms dslot " allocate directory slot 000521: 102463 lac u.base " get source file i-number 000522: 205651 jms iget " read inode in 000523: 103017 lac ii " get the i-num 000524: 205731 dac d.i " Save the i-num in the directory entry 000525: 045747 jms copy; name; d.name; 4 " Copy the new link name into the directory entry 000526: 101667 000527: 005504 000530: 005750 000531: 000004 lac i.uniq " Copy the i-node unique number into 000532: 205745 dac d.uniq " the directory entry 000533: 045754 -1 000534: 777777 tad i.nlks " Decrement link count, i.e. one more link 000535: 345743 dac i.nlks 000536: 045743 "** 01-s1.pdf page 9 jms iput " Save the i-node and directory entry for 000537: 103046 jms dput " the new link 000540: 103136 jmp okexit " and return OK 000541: 600102 .unlink: jms argname " fetch filename, inode 000542: 102631 dac u.base " save i-number 000543: 045651 lac d1 " write mode bit 000544: 204117 dac mode " save for access call 000545: 045500 jms access " check access or return error (reads inode) 000546: 102312 dzm d.i " clear directory i-num 000547: 145747 jms dput " write directory entry back 000550: 103136 lac u.base " get i-number back 000551: 205651 jms iget " read inode back 000552: 103017 isz i.nlks " increment link count (kept as negative count) 000553: 445743 jmp 1f " not zero 000554: 600557 jms itrunc " zero links: free blocks 000555: 102675 dzm i.flags " clear status (free inode) 000556: 145732 1: jms iput " write inode back to disk 000557: 103046 jmp sysexit 000560: 600103 .setuid: " setuid system call lac u.uid " load current user id 000561: 205644 sma " negative (super user) 000562: 740100 jms error " no: error!! 000563: 101531 lac u.ac " load user AC 000564: 205631 dac u.uid " save as new uid 000565: 045644 jmp sysexit 000566: 600103 " rename system call: " sys rename; old_name_ptr; new_name_ptr " Questions: " when is directory entry read?? " is access check on directory or src file?? " check for existing file with new name?? " when is directory entry written back?? .rename: jms arg " fetch first arg (old name pointer) 000567: 102625 dac 0f " save for namei 000570: 040575 jms arg " fetch second arg (new name pointer) 000571: 102625 dac 1f " save for copy 000572: 040603 lac u.cdir " get CWD 000573: 205646 jms namei; 0:0 " search for (old) name 000574: 102737 000575: 000000 jms error " not found: return error 000576: 101531 lac d1 " get write mode bit 000577: 204117 dac mode " save for access call 000600: 045500 jms access " access OK? (or return error to user) 000601: 102312 jms copy; 1:0; d.name; 4 " copy new name into directory entry 000602: 101667 000603: 000000 000604: 005750 000605: 000004 jms dput " and write it to disk 000606: 103136 jmp okexit 000607: 600102 " time system call returns line (mains) frequency ticks " high order bits returned in AC, low order in MQ " s.tim is located in "system" block (written to disk) " so this is a running count of uptime since first boot! " at 60Hz, 36 bits would last 36+ years! .time: lac s.tim " load high order bits 000610: 205557 dac u.ac " return in AC 000611: 045631 lac s.tim+1 " load low order bits 000612: 205560 dac u.mq " return in MQ 000613: 045632 jmp sysexit 000614: 600103 .chdir: jms argname " fetch argument as filename 000615: 102631 jms iget " (re)read inode(?] 000616: 103017 lac i.flags " get flags 000617: 205732 and o20 " get directory bit 000620: 504134 sna " is a directory? 000621: 741200 jms error " no: return error to user 000622: 101531 lac ii " yes: get i-number 000623: 205731 dac u.cdir " save as current working directory 000624: 045646 "** 01-s1.pdf page 10 jmp okexit 000625: 600102 " open system call " sys open; filename_ptr; flags (0 for read, 1 for write) " returns w/ "fd" in AC (or -1 if not found) .open: jms arg " get filename 000626: 102625 dac 0f " save for namei 000627: 040640 jms arg " get flags 000630: 102625 sza " zero (read) 000631: 740200 lac d1 " no: get write mode bit 000632: 204117 sna " non-zero (write)? 000633: 741200 lac d2 " no: get read mode bot 000634: 204120 dac mode " save for access call 000635: 045500 lac u.cdir " get current working directory 000636: 205646 jms namei; 0:0 " search for file 000637: 102737 000640: 000000 jms error " error: return -1 000641: 101531 jms iget " load inode 000642: 103017 jms access " check access (may return w/ error to user) 000643: 102312 lac i.flags " get file flags 000644: 205732 and o20 " get directory bit 000645: 504134 sna " is directory? 000646: 741200 jmp open1 " no, join common code 000647: 600715 lac mode " get access mode 000650: 205500 and d1 " get write bit 000651: 504117 sna " write access? 000652: 741200 jmp open1 " no, continue 000653: 600715 lac u.uid " yes: get uid? 000654: 205644 sma " negative? (-1 is superuser) 000655: 740100 jms error " no: return error 000656: 101531 jmp open1 " yes: join common code 000657: 600715 .creat: lac d1 " mode bit 1 (write) 000660: 204117 dac mode " save for access call 000661: 045500 jms arg " get name pointer 000662: 102625 dac .+2 " save for copy 000663: 040665 jms copy; ..; name; 4 " copy filename to "name" 000664: 101667 000665: 000000 000666: 005504 000667: 000004 lac u.cdir 000670: 205646 jms namei; name " look up in current working directory 000671: 102737 000672: 005504 jmp 1f " not found 000673: 600711 jms iget " file exists: read inode 000674: 103017 jms access " check access (or return error to user) 000675: 102312 lac i.flags " get flags 000676: 205732 and o20 " get directory bit 000677: 504134 sna " is a directory? 000700: 741200 jmp .+4 " no: skip to truncate 000701: 600705 lac u.uid " get user 000702: 205644 sma " is super user? 000703: 740100 jms error " no: error 000704: 101531 jms itrunc " yes: truncate 000705: 102675 cla 000706: 750000 jms dacisize " clear i.size 000707: 103402 jmp open1 000710: 600715 1: jms access " here if not found 000711: 102312 lac u.ac " get access bits from user AC (zero for lock!) 000712: 205631 and o17 " mask to permissions 000713: 504133 jms icreat 000714: 102475 open1: " common exit for open/creat jms fassign " assign fd slot 000715: 102327 jms error " none free, return -1 000716: 101531 jmp sysexit 000717: 600103 "** 01-s1.pdf page 11 .close: jms finac " get fnode (open file) for fd in user AC 000720: 103370 dzm f.flags " clear flags 000721: 145757 jms fput " write fnode back to u.ofiles 000722: 102402 jmp sysexit 000723: 600103 .read: jms arg " get argument 000724: 102625 and o17777 " mask to address 000725: 504160 dac u.base " save as I/O base 000726: 045651 jms arg " get second argument 000727: 102625 dac u.count " save as count 000730: 045652 lac u.base " get base 000731: 205651 jms betwen; o10000; o17777 " end inside user memory? 000732: 101643 000733: 004156 000734: 004160 jms error " no: error 000735: 101531 tad u.count " get end of buffer 000736: 345652 jms betwen; u.base; o17777 " inside buffer/user memory? 000737: 101643 000740: 005651 000741: 004160 jms error " no: error 000742: 101531 dac u.limit " yes: save as I/O limit 000743: 045653 1: jms finac " get fnode for fd in user AC 000744: 103370 lac f.flags " get open file flags 000745: 205757 and d1 " get write bit 000746: 504117 sza " open for write? 000747: 740200 jms error " yes: error 000750: 101531 lac i.flags " get inode flags 000751: 205732 and o40 " get special file bit 000752: 504136 sna " special? 000753: 741200 jmp 1f " no 000754: 600762 iof " yes: disable interrupts 000755: 700002 lac ii " get i number 000756: 205731 tad swr " add to base instruction 000757: 341324 dac .+1 000760: 040761 jmp .. i " dispatch to read routine 000761: 620000 1: lac u.base " get user base 000762: 205651 dac 1f+1 " save as iread base 000763: 040770 lac u.count " get user count 000764: 205652 dac 1f+2 " save as iread count 000765: 040771 lac f.badd " get file offset 000766: 205760 1: jms iread; ..; .. 000767: 103266 000770: 000000 000771: 000000 jmp exitrw 000772: 601034 " write system call: " AC/ fd " sys write; buffer; count " AC/ count or -1 on error .write: jms arg " pick up buffer 000773: 102625 and o17777 " mask to addr 000774: 504160 dac u.base " save as I/O base 000775: 045651 jms arg " pick up count 000776: 102625 dac u.count " save as count 000777: 045652 tad u.base " add base (get limit) 001000: 345651 jms betwen; u.base; o17777 " check between base and end of memory 001001: 101643 001002: 005651 001003: 004160 jms error " no: error 001004: 101531 dac u.limit " yes: save as limit 001005: 045653 jms finac " get fnode with fd from user AC 001006: 103370 lac f.flags " get open file table flags 001007: 205757 and d1 " open for write? 001010: 504117 sna " if yes, skip 001011: 741200 jms error " no: error 001012: 101531 lac i.flags " get inode flags 001013: 205732 and o40 " get device bit 001014: 504136 "** 01-s1.pdf page 12 sna " special? 001015: 741200 jmp 1f " no 001016: 601024 iof " yes, special: turn interrupts off 001017: 700002 lac ii " get i number 001020: 205731 tad sww " get write routine entry addr 001021: 341324 dac .+1 001022: 041023 jmp .. i " dispatch to write routine 001023: 620000 1: " here with regular file lac u.base " get base 001024: 205651 dac 1f+1 " save as iwrite arg 1 001025: 041032 lac u.count " get count 001026: 205652 dac 1f+2 " save as iwrite 2 001027: 041033 lac f.badd " get fd offset 001030: 205760 1: jms iwrite; ..; .. " write to file 001031: 103257 001032: 000000 001033: 000000 exitrw: " common exit for read/write system calls dac u.ac " save return in user AC 001034: 045631 tad f.badd 001035: 345760 dac f.badd " update file offset 001036: 045760 jms iput " release inode 001037: 103046 jms fput " release fnode 001040: 102402 jmp sysexit " return to user 001041: 600103 "** 01-s1.pdf page 14 " s3 " search for user (process) table entry " call: " jms searchu; worker_routine_addr " worker called with copy of a process table entry in "lu" " can return directly (from caller of searchu) " index location 8 points to next process table entry searchu: 0 001042: 000000 lac searchu i " fetch argument 001043: 221042 dac 9f+t+1 " in t1 001044: 044207 -mnproc " loop counter 001045: 777766 dac 9f+t " in t0 001046: 044206 law ulist-1 " ulist ptr 001047: 765560 dac 8 " in index 8 001050: 040010 1: lac 8 i " copy ulist entry to lu 001051: 220010 dac lu 001052: 045514 lac 8 i 001053: 220010 dac lu+1 001054: 045515 lac 8 i 001055: 220010 dac lu+2 001056: 045516 lac 8 i 001057: 220010 dac lu+3 001060: 045517 jms 9f+t+1 i " call argument as subroutine 001061: 124207 isz 9f+t " returned: loop done? 001062: 444206 jmp 1b " no, do it again 001063: 601051 isz searchu " skip argument 001064: 441042 jmp searchu i 001065: 621042 t = t+2 000003 " look for a process with matching status " jms lookfor; status " found: ulist ptr in AC " not found lookfor: 0 001066: 000000 jms searchu; 1f 001067: 101042 001070: 001074 isz lookfor " skip argument 001071: 441066 isz lookfor " give skip return 001072: 441066 jmp lookfor i 001073: 621066 1: 0 " worker called by searchu 001074: 000000 lac lu 001075: 205514 rtl; rtl; and o7 " bits 0:2 of lu 001076: 742010 001077: 742010 001100: 504125 sad lookfor i " match argument? 001101: 561066 skp " yes 001102: 741000 jmp 1b i " no, return, keep going 001103: 621074 -3 001104: 777775 tad 8 " roll index 8 back to this entry 001105: 340010 and o17777 001106: 504160 isz lookfor " skip lookfor argument 001107: 441066 jmp lookfor i " non-skip return 001110: 621066 " fork system call: " sys fork " return at +1 in parent, child pid in AC " return at +2 in child, parent pid in AC .fork: jms lookfor; 0 " not-used " find an unused process slot 001111: 101066 001112: 000000 skp 001113: 741000 jms error " none found- return error 001114: 101531 dac 9f+t " save ulist ptr in t0 001115: 044210 isz uniqpid " generate new pid 001116: 445513 lac uniqpid 001117: 205513 dac u.ac " return in child pid in AC 001120: 045631 law sysexit 001121: 760103 dac u.swapret " return from system call when swapped back in 001122: 045650 lac o200000 " change process status to out/ready (1->3) 001123: 204170 tad u.ulistp i 001124: 365647 dac u.ulistp i 001125: 065647 jms dskswap; 07000 " swap parent out 001126: 102267 001127: 007000 lac 9f+t " get unused ulist slot back 001130: 204210 dac u.ulistp " set ulist pointer 001131: 045647 lac o100000 " mark child in/notready? (3->2) 001132: 204166 xor u.ulistp i 001133: 265647 dac u.ulistp i 001134: 065647 lac u.pid " get old (parent) pid 001135: 205645 "** 01-s1.pdf page 15 dac u.ac " return parent pid in AC 001136: 045631 lac uniqpid 001137: 205513 dac u.pid " set child pid 001140: 045645 isz 9f+t " advance to second word in process table 001141: 444210 dac 9f+t i " set pid in process table 001142: 064210 isz u.rq+8 " give skip return 001143: 445643 dzm u.intflg " clear int flag 001144: 145713 jmp sysexit " return in child process 001145: 600103 t= t+1 000004 badcal: " bad (unimplemented) system call clon " clear any pending clock interrupt? 001146: 700044 -1 001147: 777777 dac 7 " set location 7 to -1?! 001150: 040007 " fall into "save" system call " Ken says save files could be resumed, and used for checkpointing! .save: " "sys save" system call lac d1 " get inode 1 (core file?) 001151: 204117 jms iget 001152: 103017 cla 001153: 750000 jms iwrite; 4096; 4096 " dump core 001154: 103257 001155: 010000 001156: 010000 jms iwrite; userdata; 64 " and user area 001157: 103257 001160: 005631 001161: 000100 jms iput 001162: 103046 .exit: lac u.dspbuf 001163: 205712 sna " process using display? 001164: 741200 jmp .+3 " no 001165: 601170 law dspbuf " yes: get default display buffer 001166: 764446 jms movdsp " move display 001167: 102615 jms awake 001170: 101304 lac u.ulistp i 001171: 225647 and o77777 " mark process table entry free 001172: 504165 dac u.ulistp i 001173: 065647 isz u.ulistp 001174: 445647 dzm u.ulistp i " clear pid in process table 001175: 165647 jms swap " find a new process to run 001176: 100136 " exit falls into "rmes" !!! " rmes system call " sys smes " returns with message delivered, or error if process does not exit " AC/ sending pid " MQ/ message .rmes: jms awake 001177: 101304 lac o100000 " mark this process "not ready" 001200: 204166 tad u.ulistp i " by incrementing status 001201: 365647 dac u.ulistp i 001202: 065647 law 2 001203: 760002 tad u.ulistp 001204: 345647 dac 9f+t " pointer to msg status in proc table 001205: 044211 -1 001206: 777777 dac 9f+t i " set to -1 (waiting for message) 001207: 064211 jms swap " switch processes 001210: 100136 law 2 001211: 760002 tad u.ulistp 001212: 345647 dac 9f+t 001213: 044211 lac 9f+t i " get msg status word 001214: 224211 cma " complement (get sender pid) 001215: 740001 dac u.ac " return in user AC 001216: 045631 dzm 9f+t i " clear status word 001217: 164211 isz 9f+t 001220: 444211 lac 9f+t i " get message 001221: 224211 dac u.mq " return in user MQ 001222: 045632 dzm 9f+t i " clear message 001223: 164211 jmp sysexit 001224: 600103 t = t+1 000005 "** 01-s1.pdf page 16 " smes system call " AC/ pid " MQ/ message " sys smes " returns with message delivered, or error if process does not exit .smes: lac u.ac " get pid from user AC 001225: 205631 sna spa " >0? 001226: 741300 jms error " no: error 001227: 101531 jms searchu; 1f " search for process 001230: 101042 001231: 001237 law 2 001232: 760002 tad u.ulistp 001233: 345647 dac 9f+t 001234: 044212 dzm 9f+t i 001235: 164212 jms error 001236: 101531 1: 0 " worker for searchu 001237: 000000 lac lu+1 " get pid 001240: 205515 sad u.ac " match? 001241: 545631 skp " yes 001242: 741000 jmp 1b i " no 001243: 621237 lac lu+2 " get mailbox status 001244: 205516 sad dm1 " -1? 001245: 544204 jmp 1f " yes 001246: 601265 lac o100000 " no: bump our process status (to notready?) 001247: 204166 tad u.ulistp i 001250: 365647 dac u.ulistp i 001251: 065647 law 2 001252: 760002 tad u.ulistp 001253: 345647 dac 9f+t 001254: 044212 lac u.ac 001255: 205631 dac 9f+t i 001256: 064212 jms swap 001257: 100136 law 2 001260: 760002 tad u.ulistp 001261: 345647 dac 9f+t 001262: 044212 dzm 9f+t i 001263: 164212 jmp .smes 001264: 601225 1: -3 001265: 777775 tad 8 001266: 340010 dac 9f+t " pointer to dest process ulist entry 001267: 044212 lac o700000 " complement process status? marks ready?? 001270: 204200 tad 9f+t i 001271: 364212 dac 9f+t i 001272: 064212 isz 9f+t 001273: 444212 isz 9f+t " point to mailbox word? 001274: 444212 lac u.pid " get our pid 001275: 205645 cma " complement 001276: 740001 dac 9f+t i " store in mailbox?? 001277: 064212 isz 9f+t " advance to next word 001300: 444212 lac u.mq " get user MQ 001301: 205632 dac 9f+t i " save as message 001302: 064212 jmp okexit 001303: 600102 t = t+1 000006 " wake up process hanging on rmes for current process?? awake: 0 001304: 000000 jms searchu; 1f 001305: 101042 001306: 001310 jmp awake i 001307: 621304 1: 0 " searchu worker 001310: 000000 lac u.pid " get caller pid 001311: 205645 sad lu+2 " match mailbox status? 001312: 545516 skp " yes 001313: 741000 jmp 1b i " no, return 001314: 621310 -3 001315: 777775 tad 8 " get pointer to process table entry 001316: 340010 dac 9f+t " save in t0 001317: 044213 "** 01-s1.pdf page 17 lac o700000 001320: 204200 tad 9f+t i " complement process status (mark ready)?? 001321: 364213 dac 9f+t i 001322: 064213 jmp 1b i " return from worker 001323: 621310 t = t+1 000007 swr: sww: jmp .-4 i 001324: 621320 .halt; rttyi; rkbdi; rppti; .halt 001325: 001336 001326: 001337 001327: 001410 001330: 001461 001331: 001336 .halt; wttyo; wdspo; wppto 001332: 001336 001333: 001357 001334: 001451 001335: 001475 .halt: jms halt 001336: 102254 " read routine for ttyin special file rttyi: jms chkint1 001337: 101535 lac d1 " ** written d3 ttyin2 001340: 204117 jms getchar 001341: 101745 jmp 1f 001342: 601353 and o177 001343: 504147 jms betwen; o101; o132 " upper case? 001344: 101643 001345: 004141 001346: 004143 skp " no 001347: 741000 tad o40 " yes: convert to lower 001350: 344136 alss 9 001351: 660711 jmp passone 001352: 601523 1: jms sleep; sfiles+0 001353: 102434 001354: 005520 jms swap 001355: 100136 jmp rttyi 001356: 601337 " write routine for ttyout special file wttyo: jms chkint1 001357: 101535 jms forall 001360: 102412 sna 001361: 741200 jmp fallr 001362: 602425 lmq 001363: 652000 lac sfiles+1 001364: 205521 spa 001365: 741100 jmp 1f 001366: 601376 xor o400000 001367: 244173 dac sfiles+1 001370: 045521 lacq 001371: 641002 tls " load output buffer 001372: 700406 sad o12 " newline? 001373: 544130 jms putcr " yes, put CR as well 001374: 104014 jmp fallr 001375: 602425 1: lacq 001376: 641002 dac char 001377: 045511 lac d2 "** written: d6 ttyout 001400: 204120 jms putchar 001401: 101730 skp 001402: 741000 jmp fallr 001403: 602425 jms sleep; sfiles+1 001404: 102434 001405: 005521 jms swap 001406: 100136 jmp wttyo 001407: 601357 " read routine for (display) "keyboard" special file rkbdi: jms chkint1 001410: 101535 lac d3 001411: 204121 jms getchar 001412: 101745 "** 01-s1.pdf page 18 jmp 3f 001413: 601445 lmq 001414: 652000 and o155 001415: 504146 sad o55 001416: 544137 jmp 1f " -/=? map to =?-/ ??? 001417: 601425 lacq 001420: 641002 and o137 001421: 504145 sad o134 001422: 544144 skp " \| map to Ll ??? 001423: 741000 jmp 2f 001424: 601430 1: lacq 001425: 641002 xor o20 001426: 244134 lmq 001427: 652000 2: lacq 001430: 641002 dac u.limit 001431: 045653 1: jms chkint1 001432: 101535 lac u.limit 001433: 205653 jms dspput 001434: 102540 jmp 1f 001435: 601442 jms sleep; sfiles+6 001436: 102434 001437: 005526 jms swap 001440: 100136 jmp 1b 001441: 601432 1: lac u.limit 001442: 205653 alss 9 001443: 660711 jmp passone 001444: 601523 3: jms sleep; sfiles+2 001445: 102434 001446: 005522 jms swap 001447: 100136 jmp rkbdi 001450: 601410 " write routine for (graphic) "display" special file wdspo: jms chkint1 001451: 101535 jms forall 001452: 102412 jms dspput " put char (fallr "returns" here) 001453: 102540 jmp fallr " go back for next (continuation!) 001454: 602425 jms sleep; sfiles+6 001455: 102434 001456: 005526 jms swap 001457: 100136 jmp wdspo 001460: 601451 " read routine for paper tape reader special file rppti: lac d4 001461: 204122 jms getchar 001462: 101745 jmp .+3 001463: 601466 alss 9 001464: 660711 jmp passone 001465: 601523 lac sfiles+3 001466: 205523 sma 001467: 740100 rsa 001470: 700104 1: jms sleep; sfiles+3 001471: 102434 001472: 005523 jms swap 001473: 100136 jmp rppti 001474: 601461 "** 01-s1.pdf page 19 " write routine for paper tape punch special file wppto: jms forall 001475: 102412 sna 001476: 741200 jmp fallr 001477: 602425 lmq 001500: 652000 lac sfiles+4 001501: 205524 spa 001502: 741100 jmp 1f 001503: 601511 xor o400000 001504: 244173 dac sfiles+4 001505: 045524 lacq 001506: 641002 psa 001507: 700204 jmp fallr 001510: 602425 1: lacq 001511: 641002 dac char 001512: 045511 lac d5 001513: 204123 jms putchar 001514: 101730 skp 001515: 741000 jmp fallr 001516: 602425 jms sleep; sfiles+4 001517: 102434 001520: 005524 jms swap 001521: 100136 jmp wppto 001522: 601475 " common exit for special file input passone: sad o4000 " CTRL/D? 001523: 544154 jmp okexit " yes: return zero 001524: 600102 dac u.base i " no: save for user 001525: 065651 lac d1 " return 1 001526: 204117 dac u.ac 001527: 045631 jmp sysexit 001530: 600103 error: 0 001531: 000000 -1 001532: 777777 dac u.ac 001533: 045631 jmp sysexit 001534: 600103 chkint1: 0 001535: 000000 dzm .insys 001536: 144066 jms chkint 001537: 100320 skp 001540: 741000 jmp .save 001541: 601151 -1 001542: 777777 dac .insys 001543: 044066 jmp chkint1 i 001544: 621535 "** 01-s1.pdf page 21 " s4 " allocate a free disk block for a file (data or indirect) alloc: 0 001545: 000000 -1 " Decrement the # free block numbers in the cache 001546: 777777 tad s.nfblks " kept at s.fblks. Jump to 1f if no free blocks left. 001547: 345543 spa 001550: 741100 jmp 1f 001551: 601566 dac s.nfblks " Update the count of free block numbers 001552: 045543 tad fblksp 001553: 344106 jms laci 001554: 101635 dac 9f+t 001555: 044214 jms copyz; dskbuf; 64 001556: 101712 001557: 007700 001560: 000100 lac 9f+t 001561: 204214 jms dskwr 001562: 102146 dzm .savblk 001563: 144072 lac 9f+t 001564: 204214 jmp alloc i " Return from routine 001565: 621545 1: lac s.nxfblk 001566: 205542 sna 001567: 741200 jms halt " OUT OF DISK 001570: 102254 dac s.fblks 001571: 045544 jms dskrd 001572: 102116 lac dskbuf 001573: 207700 dac s.nxfblk 001574: 045542 jms copy; dskbuf+1; s.fblks+1; 9 001575: 101667 001576: 007701 001577: 005545 001600: 000011 lac d10 001601: 204130 dac s.nfblks 001602: 045543 jmp alloc+1 001603: 601546 " free the disk block whose number is in AC free: 0 001604: 000000 lmq 001605: 652000 lac s.nfblks 001606: 205543 sad d10 001607: 544130 jmp 1f 001610: 601620 tad fblksp 001611: 344106 dac 9f+t 001612: 044214 lacq 001613: 641002 dac 9f+t i 001614: 064214 dzm .savblk 001615: 144072 isz s.nfblks 001616: 445543 jmp free i 001617: 621604 1: lac s.nxfblk 001620: 205542 dac dskbuf 001621: 047700 jms copy; s.fblks+1; dskbuf+1; 9 001622: 101667 001623: 005545 001624: 007701 001625: 000011 lacq 001626: 641002 dac s.nxfblk 001627: 045542 jms dskwr 001630: 102146 dzm .savblk 001631: 144072 lac d1 001632: 204117 dac s.nfblks 001633: 045543 jmp free i " Return from the routine 001634: 621604 t = t+1 000010 " load AC indirect (without using indirect!) " AC/ address " jms laci " AC/ contents of address laci: 0 001635: 000000 and o17777 " clear everything but addr 001636: 504160 tad o200000 " make into "lac addr" 001637: 344170 dac .+1 001640: 041641 lac .. " fetch 001641: 200000 jmp laci i " return 001642: 621635 "** 01-s1.pdf page 22 " skip if AC between two values (inclusive) " jms betwen; low_ptr; high_ptr " " " listing has an alternate written in " (which would require 'lac ptr' instead of 'ptr' args?) betwen: 0 001643: 000000 lmq cmq " get ~AC in MQ 001644: 652004 lac betwen i " get low_ptr 001645: 221643 dac 9f+t 001646: 044215 isz betwen " skip low_ptr 001647: 441643 lacq " get ~AC (-AC-1) from MQ 001650: 641002 tad 9f+t i " get low-AC-1 001651: 364215 sma " negative (AC >= low)? 001652: 740100 jmp 1f " no, return w/o skip 001653: 601663 lac betwen i " fetch high_ptr 001654: 221643 dac 9f+t 001655: 044215 isz betwen " skip high_ptr 001656: 441643 lacq " get -AC-1 001657: 641002 tad 9f+t i " add to high value (high-AC-1) 001660: 364215 cma " complement (AC-high) 001661: 740001 spa sna " AC-high <= 0? 001662: 741300 1: isz betwen " no: give happy (skip) return 001663: 441643 lacq " restore ~AC 001664: 641002 cma " restore AC 001665: 740001 jmp betwen i " return w/o skip 001666: 621643 " copy memory " call: " jms copy; src; dest; count copy: 0 001667: 000000 -1 001670: 777777 tad copy i 001671: 361667 dac 8 001672: 040010 isz copy 001673: 441667 -1 001674: 777777 tad copy i 001675: 361667 dac 9 001676: 040011 isz copy 001677: 441667 -1 001700: 777777 tad copy i 001701: 361667 cma 001702: 740001 dac 9f+t 001703: 044215 isz copy 001704: 441667 1: lac 8 i 001705: 220010 dac 9 i 001706: 060011 isz 9f+t 001707: 444215 jmp 1b 001710: 601705 jmp copy i 001711: 621667 " copy zeroes (clear memory) " call: " jms copyz; pointer; count copyz: 0 001712: 000000 -1 001713: 777777 tad copyz i " get call PC 001714: 361712 dac 8 " save in index (pre-increments) 001715: 040010 isz copyz " skip pointer 001716: 441712 -1 001717: 777777 tad copyz i " get count-1 001720: 361712 cma " get negative count 001721: 740001 dac 9f+t " save in t0 001722: 044215 isz copyz " skip count 001723: 441712 1: dzm 8 i " zero word 001724: 160010 isz 9f+t " done? 001725: 444215 jmp 1b " no: loop 001726: 601724 jmp copyz i " return 001727: 621712 t = t+1 000011 " put queued character " CALLED FROM PI: AVOIDS INDIRECT!! " queue number in AC putchar: 0 001730: 000000 "** 01-s1.pdf page 23 dac 9f+t 001731: 044216 cla 001732: 750000 jms takeq 001733: 101757 jmp putchar i 001734: 621730 tad o40001 001735: 344163 dac .+4 001736: 041742 lac 9f+t 001737: 204216 jms putq 001740: 102011 lac char 001741: 205511 dac q2+1 .. 001742: 044301 isz putchar 001743: 441730 jmp putchar i 001744: 621730 t = t+1 000012 " get queued character " CALLED FROM PI: AVOIDS INDIRECT!! " queue number in AC: " 1: tty input " 2: tty output " 3: display keyboard " 4: paper tape reader " 5: paper tape punch getchar: 0 001745: 000000 jms takeq 001746: 101757 jmp i getchar 001747: 621745 tad o200001 001750: 344171 dac .+3 001751: 041754 cla 001752: 750000 jms putq 001753: 102011 lac q2+1 .. 001754: 204301 isz getchar 001755: 441745 jmp i getchar 001756: 621745 " CALLED FROM PI: AVOIDS INDIRECT!! takeq: 0 001757: 000000 rcl 001760: 744010 tad lacq1 001761: 344110 dac .+7 001762: 041771 tad o640000 001763: 344177 dac .+17 001764: 042005 tad d1 001765: 344117 dac .+14 001766: 042004 tad o500000 001767: 344174 dac .+5 001770: 041775 lac q1 .. 001771: 204260 sna 001772: 741200 jmp takeq i 001773: 621757 dac lnkaddr 001774: 045510 sad q1+1 .. 001775: 544261 jmp .+5 001776: 602003 tad o200000 001777: 344170 dac .+1 002000: 042001 lac q2 .. 002001: 204300 jmp .+3 002002: 602005 cla 002003: 750000 dac q1+1 .. 002004: 044261 dac q1 .. 002005: 044260 isz takeq 002006: 441757 lac lnkaddr 002007: 205510 jmp i takeq 002010: 621757 putq: 0 002011: 000000 rcl 002012: 744010 tad dacq1 002013: 344107 dac .+14 002014: 042032 tad d1 002015: 344117 dac .+13 002016: 042033 tad o140000 002017: 344167 dac .+1 002020: 042021 lac q1-1 .. 002021: 204257 "** 01-s1.pdf page 24 sna 002022: 741200 jmp .+6 002023: 602031 tad o40000 002024: 344162 dac .+2 002025: 042027 lac lnkaddr 002026: 205510 dac q2 .. 002027: 044300 jmp .+3 002030: 602033 lac lnkaddr 002031: 205510 dac q1 .. 002032: 044260 dac q1+1 .. 002033: 044261 jmp putq i 002034: 622011 srcdbs: 0 002035: 000000 dac 9f+t+2 "* lmq 002036: 044221 -ndskbs 002037: 777774 dac 9f+t 002040: 044217 law dskbs "* -1 dac 8 written 002041: 765067 dac 9f+t+1 "* lacq 002042: 044220 1: lac 9f+t+2 "** crossed out 002043: 204221 sad 9f+t+1 "** isz 8 written 002044: 544220 jmp srcdbs i 002045: 622035 law 65 "** ??? crossed out 002046: 760101 tad 9f+t+1 "** crossed out isz 8 written 002047: 344220 isz 9f+t+1 002050: 444220 isz 9f+t 002051: 444217 jmp 1b 002052: 602043 isz srcdbs 002053: 442035 jmp srcdbs i 002054: 622035 collapse: 0 002055: 000000 cla 002056: 750000 jms srcdbs 002057: 102035 jmp 1f 002060: 602063 law dskbs 002061: 765067 dac 9f+t+1 "** 9f+t+1 crossed out: 8 written in 002062: 044220 1: lac 9f+t+1 "** 9f+t+1 crossed out: 8 written in 002063: 204220 dac 0f+1 002064: 042100 tad d65 "** crossed out: d2-- original obscured 002065: 344141 dac 0f 002066: 042077 cma 002067: 740001 tad d1 002070: 344117 tad edskbsp 002071: 345473 and o17777 002072: 504160 sna 002073: 741200 jmp 0f+3 002074: 602102 dac 0f+2 002075: 042101 jms copy; 0:..; ..; .. 002076: 101667 002077: 000000 002100: 000000 002101: 000000 -65 002102: 777677 tad edskbsp 002103: 345473 dac 9f+t 002104: 044217 tad d1 002105: 344117 dac 0f 002106: 042113 lac dskaddr 002107: 205512 dac 9f+t i 002110: 064217 jms copy; dskbuf; 0:..; 64 002111: 101667 002112: 007700 002113: 000000 002114: 000100 jmp collapse i 002115: 622055 dskrd: 0 002116: 000000 jms betwen; d2; d7999 002117: 101643 002120: 004120 002121: 004155 "** 01-s1.pdf page 25 jms halt 002122: 102254 sad dskaddr 002123: 545512 jmp dskrd i 002124: 622116 dac dskaddr 002125: 045512 jms srcdbs 002126: 102035 jmp 1f 002127: 602134 lac dskaddr 002130: 205512 jms dskio; 06000 002131: 102162 002132: 006000 jmp 2f 002133: 602144 1: dzm 9f+t+1 i 002134: 164220 law 1 002135: 760001 tad 9f+t+1 002136: 344220 dac .+2 002137: 042141 jms copy; ..; dskbuf; 64 002140: 101667 002141: 000000 002142: 007700 002143: 000100 2: jms collapse 002144: 102055 jmp dskrd i 002145: 622116 " write a file block (data, inode or indirect) " AC/ block dskwr: 0 002146: 000000 jms betwen; d2; d7999 002147: 101643 002150: 004120 002151: 004155 jms halt 002152: 102254 jms dskio; 07000 002153: 102162 002154: 007000 lac dskaddr 002155: 205512 jms srcdbs 002156: 102035 dzm 9f+t+1 i 002157: 164220 jms collapse 002160: 102055 jmp dskwr i 002161: 622146 t = t+3 000015 " AC/ block " jms dskio; dsld_bits dskio: 0 002162: 000000 dac dskaddr 002163: 045512 cll; idiv; 80 002164: 744000 002165: 653323 002166: 000120 dac 9f+t 002167: 044222 lacq 002170: 641002 idiv; 10 002171: 653323 002172: 000012 dac 9f+t+1 002173: 044223 lls 22 002174: 640626 xor 9f+t+1 002175: 244223 als 8 002176: 640710 dac 9f+t+1 002177: 044223 lac 9f+t 002200: 204222 idiv; 10 002201: 653323 002202: 000012 dac 9f+t 002203: 044222 lls 22 002204: 640626 xor 9f+t 002205: 244222 xor 9f+t+1 002206: 244223 xor o200000 002207: 244170 dac 9f+t 002210: 044222 jms dsktrans; -64; dskbuf; 9f+t; dskio 002211: 102220 002212: 777700 002213: 007700 002214: 004222 002215: 002162 isz dskio 002216: 442162 jmp dskio i 002217: 622162 t = t+1 000016 " called with: " jms dsktrans; -WC; MAC; addr_ptr?; dsld_ptr dsktrans: 0 002220: 000000 -10 002221: 777766 dac 9f+t 002222: 044223 1: -1 002223: 777777 tad dsktrans 002224: 342220 dac 12 002225: 040014 "** 01-s1.pdf page 26 dscs " clear status register 002226: 707141 lac 12 i 002227: 220014 dslw " load WC 002230: 707124 lac 12 i 002231: 220014 dslm " load MAC 002232: 707142 lac 12 i 002233: 220014 jms laci 002234: 101635 dsld " load TA & SA 002235: 707104 dzm .dskb 002236: 144074 lac 12 i 002237: 220014 jms laci 002240: 101635 jms laci 002241: 101635 dsls " load status 002242: 707144 lac .dskb " check for interrupt 002243: 204074 sna 002244: 741200 jmp .-2 002245: 602243 lac .dske " get status from interrupt 002246: 204075 sma 002247: 740100 jmp 12 i " return 002250: 620014 isz 9f+t 002251: 444223 jmp 1b 002252: 602223 jms halt " 10 disk errors 002253: 102254 t = t+1 000017 halt: 0 002254: 000000 isz 9f+t " spin for a while (process interrupts) 002255: 444224 jmp .-1 002256: 602255 iof " disable interrupts 002257: 700002 hlt " halt 002260: 740040 jms copy; law; 4096; 4096 " continued: copy system up to user memory? 002261: 101667 002262: 760000 002263: 010000 002264: 010000 hlt; jmp .-1 " halt for good 002265: 740040 002266: 602265 t = t+1 000020 "** 01-s1.pdf page 28 " s5 " read/write a process from/to swap space " call: " AC/ first word of process table " jms dskswap; DSLD bits dskswap: 0 002267: 000000 cll; als 3 " get process disk address 002270: 744000 002271: 640703 dac 9f+t " save in t0 002272: 044225 jms dsktrans; -64; userdata; 9f+t; dskswap " read/write user area 002273: 102220 002274: 777700 002275: 005631 002276: 004225 002277: 002267 lac 9f+t " get swap addr back 002300: 204225 tad o20 " advance by 16?? 002301: 344134 dac 9f+t " save 002302: 044225 jms dsktrans; -4096; 4096; 9f+t; dskswap " read/write user memory 002303: 102220 002304: 770000 002305: 010000 002306: 004225 002307: 002267 isz dskswap " skip bits 002310: 442267 jmp dskswap i " return 002311: 622267 t = t+1 000021 access: 0 002312: 000000 lac i.flags " get inode flags 002313: 205732 lmq " save in MQ 002314: 652000 lac u.uid " get user id 002315: 205644 spa " negative? 002316: 741100 jmp access i " yes: super user, return 002317: 622312 sad i.uid " compare to file owner 002320: 545742 lrs 2 " same: shift flags down two 002321: 640502 lacq " get inode flags back 002322: 641002 and mode " AND with mode from system call 002323: 505500 sza " access allowed? 002324: 740200 jmp access i " yes: return 002325: 622312 jms error " no: return error from system call 002326: 101531 fassign: 0 002327: 000000 -10 " loop count 002330: 777766 dac 9f+t " in t0 002331: 044226 1: lac 9f+t " get count 002332: 204226 tad d10 " turn into fd 002333: 344130 jms fget " fetch open file into "fnode" 002334: 102360 jms halt " will not happen 002335: 102254 lac f.flags " get fnode flags 002336: 205757 sma " sign bit set (active)? 002337: 740100 jmp 1f " no: free 002340: 602344 isz 9f+t " increment loop count & loop until zero 002341: 444226 jmp 1b 002342: 602332 jmp fassign i 002343: 622327 1: lac mode " get mode from system call 002344: 205500 xor o400000 " set sign bit 002345: 244173 dac f.flags " save in fnode 002346: 045757 lac ii " get i-number 002347: 205731 dac f.i " save in fnode 002350: 045761 lac 9f+t 002351: 204226 tad d10 " get fd 002352: 344130 dac u.ac " return in user AC 002353: 045631 dzm f.badd " clear file offset in fnode 002354: 145760 jms fput " copy fnode back into u.ofiles 002355: 102402 isz fassign " give skip return 002356: 442327 jmp fassign i 002357: 622327 t = t+1 000022 " load fnode (open file entry) from u.ofiles " AC/ user fd " jms fget " bad fd " return with fnode set fget: 0 002360: 000000 jms betwen; d0; d9 " fd 0..9? 002361: 101643 002362: 004116 002363: 004127 jmp fget i " no, return 002364: 622360 cll; mul; 3 " multiply by three 002365: 744000 002366: 653122 002367: 000003 lacq 002370: 641002 "** 01-s1.pdf page 29 tad ofilesp " get pointer into u.ofiles 002371: 344101 dac 9f+t " save in t0 002372: 044227 dac .+2 " save as copy source 002373: 042375 jms copy; ..; fnode; 3 " copy to "fnode" 002374: 101667 002375: 000000 002376: 005757 002377: 000003 isz fget " give skip return 002400: 442360 jmp fget i 002401: 622360 " copy fnode back to u.ofiles " uses temp value set by "fget" " (fget and fput calls must be paired) fput: 0 002402: 000000 lac 9f+t 002403: 204227 dac .+3 002404: 042407 jms copy; fnode; ..; 3 002405: 101667 002406: 005757 002407: 000000 002410: 000003 jmp fput i 002411: 622402 t = t+1 000023 " helper for special device write routines " return to caller with next character to write: " when done return character count to user. forall: 0 002412: 000000 lac u.base 002413: 205651 sad u.limit 002414: 545653 jmp 1f " done 002415: 602431 lac u.base " get base pointer (again?) 002416: 205651 ral " rotate MSB into LINK 002417: 740010 lac u.base i " fetch word via base pointer 002420: 225651 snl " link set? 002421: 740400 lrs 9 " no: get low 9 bits 002422: 640511 and o777 " mask to 9 bits 002423: 504152 jmp forall i " return char 002424: 622412 fallr: " jump here for subsequent characters lac u.base " get base 002425: 205651 add o400000 " advance pointer 002426: 304173 dac u.base " start from top 002427: 045651 jmp forall+1 002430: 602413 1: lac u.count 002431: 205652 dac u.ac 002432: 045631 jmp sysexit 002433: 600103 " wait for a condition variable " call: " jmr sleep; sfiles+N sleep: 0 002434: 000000 law ulist-1 " pointer to process table 002435: 765560 dac 8 " in index register 002436: 040010 lac o200000 002437: 204170 lmq " get 200000 in MQ 002440: 652000 1: lac u.ulistp i " get current process status word 002441: 225647 sad 8 i " compare to next process table entry 002442: 560010 jmp 1f " match 002443: 602452 isz 8 " no match: skip other 3 words of process table 002444: 440010 isz 8 002445: 440010 isz 8 002446: 440010 cla; lrs 1 " shift MQ down one 002447: 750000 002450: 640501 jmp 1b " loop 002451: 602441 1: tad o100000 " mark process not ready 002452: 344166 dac u.ulistp i 002453: 065647 lac sleep i " get sleep variable pointer 002454: 222434 dac 9f+t 002455: 044230 lac 9f+t i " get sleep variable contents 002456: 224230 omq " or in MQ (bit vector of processes waiting) 002457: 640002 dac 9f+t i " save 002460: 064230 isz sleep " skip sleep variable pointer 002461: 442434 jmp sleep i 002462: 622434 t = t+1 000024 "** 01-s1.pdf page 30 " look for a free directory entry?? dslot: 0 002463: 000000 dzm di 002464: 145746 skp 002465: 741000 1: isz di 002466: 445746 lac di 002467: 205746 jms dget " get directory entry 002470: 103104 lac d.i " get i number 002471: 205747 sza " zero (free)? 002472: 740200 jmp 1b " no keep looking 002473: 602466 jmp dslot i " yes: return index 002474: 622463 " called with: " AC/ mode " name/ file name icreat: 0 002475: 000000 dac 9f+t " save mode in t0 002476: 044231 jms dslot 002477: 102463 lac o20 " look for a free inode starting at 17 002500: 204134 dac ii 002501: 045731 1: isz ii 002502: 445731 lac ii 002503: 205731 jms iget 002504: 103017 lac i.flags 002505: 205732 spa " "in use" bit bit clear? 002506: 741100 jmp 1b " no, guess again 002507: 602502 lac ii 002510: 205731 dac d.i 002511: 045747 jms copy; name; d.name; 4 002512: 101667 002513: 005504 002514: 005750 002515: 000004 isz s.uniq " get a new unique number 002516: 445556 lac s.uniq 002517: 205556 dac d.uniq " save in directory entry 002520: 045754 dac i.uniq " and inode 002521: 045745 lac 9f+t " get mode 002522: 204231 xor o400000 " set "in use" 002523: 244173 dac i.flags 002524: 045732 lac u.uid " get user 002525: 205644 dac i.uid " set owner 002526: 045742 -1 002527: 777777 dac i.nlks " -1 links?! 002530: 045743 dzm i.size " empty 002531: 145744 jms copyz; i.dskps; 7 " clear disk block numbers 002532: 101712 002533: 005733 002534: 000007 jms iput " write inode 002535: 103046 jms dput " write directory entry 002536: 103136 jmp icreat i 002537: 622475 t = t+1 000025 " output character to display dspput: 0 002540: 000000 and o177 " mask to 7 bits 002541: 504147 sna 002542: 741200 jmp i dspput " discard NUL 002543: 622540 sad o14 " Form Feed? 002544: 544131 jmp 1f " yes 002545: 602560 lmq " save char in MQ 002546: 652000 sad o12 " newline? 002547: 544130 jms dspnl " yes 002550: 102574 lac dsploc i " get display word 002551: 224444 sad o400000 " TRAP? 002552: 544173 jmp dspleft " yes (first character) 002553: 602562 omq " no: or in second character 002554: 640002 dac dsploc i " save both characters 002555: 064444 isz dsploc " advance display pointer 002556: 444444 jmp i dspput 002557: 622540 "** 01-s1.pdf page 31 1: " here on form feed jms dspinit " clear display 002560: 102606 jmp dspput i 002561: 622540 dspleft: lac dsploc " get display pointer 002562: 204444 sad edspbuf " end of the buffer? 002563: 544104 jmp 1f " yes: light up a button!? 002564: 602602 dac 8 " no: store in index 002565: 040010 lac o400000 " get TRAP instruction 002566: 204173 dac 8 i " store as next 002567: 060010 cla; llss 18+7 " shift MQ upto "char1" position 002570: 750000 002571: 660631 dac dsploc i " store word with char1 002572: 064444 jmp dspput i 002573: 622540 dspnl: 0 " only called once! 002574: 000000 lac dsplno " get display line number 002575: 204445 sad d33 " 33? 002576: 544142 jmp 1f " yes: light a button! 002577: 602602 isz dsplno " no: increment line number 002600: 444445 jmp dspnl i 002601: 622574 1: lac o2000 " get bit for push button 7 002602: 204153 wbl " write button lights 002603: 704424 isz dspput 002604: 442540 jmp dspput i 002605: 622540 dspinit: 0 002606: 000000 lac dspbufp3 " get pointer to dspbuf+3 002607: 204105 dac dsploc " store location 002610: 044444 lac o400000 " display "TRAP" instruction (end of list) 002611: 204173 dac dspbuf+3 " save in buffer 002612: 044451 dzm dsplno " clear display line number 002613: 144445 jmp dspinit i 002614: 622606 " "move display" (change display buffer pointer) " called with new buffer pointer in AC?? movdsp: 0 002615: 000000 iof 002616: 700002 cdf 002617: 700501 dac dspbufp 002620: 045475 -1 002621: 777777 dac .dspb 002622: 045536 ion 002623: 700042 jmp movdsp i 002624: 622615 " fetch user argument from word after "sys" call, return in AC arg: 0 002625: 000000 lac u.rq+8 i " fetch word after return PC 002626: 225643 isz u.rq+8 " bump PC 002627: 445643 jmp arg i 002630: 622625 " fetch user pathname argument from pointer word after "sys" call " into "name" and look it up (in current working directory) " if lookup fails: returns error to user (not caller) " if lookup OK: returns with file i-inode read (into "inode") " and i-number in AC argname: 0 002631: 000000 jms arg " fetch name pointer 002632: 102625 dac .+2 " save as copy source 002633: 042635 jms copy; ..; name; 4 " copy to "name" 002634: 101667 002635: 000000 002636: 005504 002637: 000004 lac u.cdir " get CWD 002640: 205646 jms namei; name " look up file 002641: 102737 002642: 005504 jms error " failed: return error directly to user 002643: 101531 jmp argname i 002644: 622631 seektell: 0 002645: 000000 jms arg 002646: 102625 dac u.base 002647: 045651 "** 01-s1.pdf page 32 jms arg 002650: 102625 dac u.limit 002651: 045653 jms finac 002652: 103370 lac u.limit 002653: 205653 sna 002654: 741200 jmp seektell i 002655: 622645 sad d1 002656: 544117 jmp .+3 002657: 602662 lac i.size 002660: 205744 jmp seektell i 002661: 622645 lac f.badd 002662: 205760 jmp seektell i 002663: 622645 " system call helper " fetch system call argument name pointer from after "sys" call " read inode; if current user is not owner, return error to user isown: 0 002664: 000000 jms argname 002665: 102631 jms iget 002666: 103017 lac u.uid " get user id 002667: 205644 sma " super user? 002670: 740100 sad i.uid " no: does user own file? 002671: 545742 skp " yes, or super user 002672: 741000 jms error " not super user, not owner: return error 002673: 101531 jmp isown i 002674: 622664 "** 01-s1.pdf page 34 " s6 itrunc: 0 002675: 000000 -7 " loop 7 times 002676: 777771 dac 9f+t " in t0 002677: 044232 lac idskpp " pointer to inode block numbers 002700: 204102 dac 9f+t+1 " save in t1 002701: 044233 1: " top of loop for inode blocks lac 9f+t+1 i " fetch next block number 002702: 224233 sna " allocated? 002703: 741200 jmp 4f " no 002704: 602730 lac i.flags " check flags 002705: 205732 and o200000 002706: 504170 sna " large file? 002707: 741200 jmp 3f " no 002710: 602725 -64 " loop 64 times 002711: 777700 dac 9f+t+2 " save count in t2 002712: 044234 lac dskbufp " get pointer to dskbuf 002713: 204103 dac 9f+t+3 " in t3 002714: 044235 2: " inner loop for indirect blocks lac 9f+t+1 i " get indirect block number 002715: 224233 jms dskrd " read it 002716: 102116 lac 9f+t+3 i " read block number from indirect 002717: 224235 sza " free? 002720: 740200 jms free " no: free it 002721: 101604 isz 9f+t+3 " increment pointer into indirect block 002722: 444235 isz 9f+t+2 " increment loop counter, skip if done 002723: 444234 jmp 2b " not done: loop 002724: 602715 3: " here with small file lac 9f+t+1 i " load block number 002725: 224233 jms free " free it 002726: 101604 dzm 9f+t+1 i " clear block number 002727: 164233 4: " bottom of loop for inode block ptrs isz 9f+t+1 " increment block pointer 002730: 444233 isz 9f+t " increment count, skip if done 002731: 444232 jmp 1b " not done 002732: 602702 lac i.flags 002733: 205732 and o577777 " clear large file flag 002734: 504175 dac i.flags 002735: 045732 jmp itrunc i 002736: 622675 t = t+4 000031 " Given a pointer to a 4-word filename after " the jms to namei, and with AC holding the " i-num of the directory it is in, return the " i-number of the filename (and skip) " return zero in AC if not found (no skip) namei: 0 002737: 000000 jms iget " Get the inode from the i-num in the AC 002740: 103017 -1 002741: 777777 tad namei i " get argptr-1 002742: 362737 dac 9f+t+1 " save in t1 002743: 044237 isz namei " skip over argument 002744: 442737 lac i.flags 002745: 205732 and o20 " get directory bit 002746: 504134 sna " Is this a directory? 002747: 741200 jmp namei i " no: return without skip 002750: 622737 -8 002751: 777770 tad i.size " Subtract 8 from the file's size 002752: 345744 cma 002753: 740001 lrss 3 002754: 660503 dac 9f+t " negative count of directory entries in t0 002755: 044236 sna " any? 002756: 741200 jmp namei i " no: return without skip 002757: 622737 dzm di " Store zero in di 002760: 145746 1: lac di 002761: 205746 "** 01-s1.pdf page 35 jms dget " Get a directory entry from the dirblock 002762: 103104 lac d.i " get i-num 002763: 205747 sna " in use? 002764: 741200 jmp 2f " no 002765: 603013 lac 9f+t+1 " get argptr-1 002766: 204237 dac 8 002767: 040010 lac d.name " Compare the four words of the filename in the 002770: 205750 sad 8 i " directory entry with the argument to namei 002771: 560010 skp 002772: 741000 jmp 2f " No match 002773: 603013 lac d.name+1 002774: 205751 sad 8 i 002775: 560010 skp 002776: 741000 jmp 2f " No match 002777: 603013 lac d.name+2 003000: 205752 sad 8 i 003001: 560010 skp 003002: 741000 jmp 2f " No match 003003: 603013 lac d.name+3 003004: 205753 sad 8 i 003005: 560010 skp 003006: 741000 jmp 2f " No match 003007: 603013 lac d.i " A match. Get the i-number into AC 003010: 205747 isz namei " give skip return 003011: 442737 jmp namei i 003012: 622737 2: isz di " No match, move up to the next direntry 003013: 445746 isz 9f+t " any left? 003014: 444236 jmp 1b " yes: keep going 003015: 602761 jmp namei i " Didn't find it, return zero in AC (without skip) 003016: 622737 t = t+2 000033 " Given an i-number in AC, fetch that i-node " from disk and store it in the inode buffer iget: 0 003017: 000000 dac ii " Store the i-number in ii 003020: 045731 cll; idiv; 5 " Divide by 5: 5 inodes in a block 003021: 744000 003022: 653323 003023: 000005 dac 9f+t " Store the remainder in 9f+t: the i-node 003024: 044240 lacq " number within the block 003025: 641002 tad d2 " Add 2 to the quotient to get the block number 003026: 344120 dac 9f+t+1 " and store in 9f+t+1 003027: 044241 jms dskrd " Get the block 003030: 102116 lac 9f+t 003031: 204240 cll; mul; 12 " Multiply the i-num within the block by 12 003032: 744000 003033: 653122 003034: 000014 lacq " to get the offset into the block 003035: 641002 tad dskbufp " Add on the base of the disk buffer 003036: 344103 dac 9f+t 003037: 044240 dac .+2 003040: 043042 jms copy; ..; inode; 12 " Copy 12 words from buffer to inode 003041: 101667 003042: 000000 003043: 005732 003044: 000014 jmp iget i " and return 003045: 623017 iput: 0 003046: 000000 lac 9f+t+1 003047: 204241 jms dskrd 003050: 102116 law inode-1 003051: 765731 dac 8 003052: 040010 -1 003053: 777777 tad 9f+t 003054: 344240 dac 9 003055: 040011 -12 003056: 777764 dac 9f+t+2 003057: 044242 1: lac 8 i 003060: 220010 "** 01-s1.pdf page 36 sad 9 i 003061: 560011 skp 003062: 741000 jmp 2f 003063: 603067 isz 9f+t+2 003064: 444242 jmp 1b 003065: 603060 jmp iput i 003066: 623046 2: -1 003067: 777777 tad 8 003070: 340010 dac 8 003071: 040010 -1 003072: 777777 tad 9 003073: 340011 dac 9 003074: 040011 1: lac 8 i 003075: 220010 dac 9 i 003076: 060011 isz 9f+t+2 003077: 444242 jmp 1b 003100: 603075 lac 9f+t+1 003101: 204241 jms dskwr 003102: 102146 jmp iput i 003103: 623046 t = t+3 000036 " allocate directory entry " AC/ entry number dget: 0 003104: 000000 dac di " save entry number 003105: 045746 alss 3 " get word number 003106: 660703 dac 9f+t " save in t0 003107: 044243 jms pget " get free disk block 003110: 103152 dac 9f+t+1 " save in t1 003111: 044244 jms dskrd 003112: 102116 lac 9f+t 003113: 204243 and o77 003114: 504140 tad dskbufp 003115: 344103 dac 9f+t+2 003116: 044245 dac .+2 003117: 043121 jms copy; ..; dnode; 8 003120: 101667 003121: 000000 003122: 005747 003123: 000010 lac 9f+t 003124: 204243 tad d8 003125: 344126 jms betwen; d0; i.size 003126: 101643 003127: 004116 003130: 005744 skp 003131: 741000 jmp dget i 003132: 623104 jms dacisize 003133: 103402 dzm d.i 003134: 145747 jmp dget i 003135: 623104 dput: 0 003136: 000000 lac 9f+t+1 003137: 204244 jms dskrd 003140: 102116 lac 9f+t+2 003141: 204245 dac .+3 003142: 043145 jms copy; dnode; ..; 8 003143: 101667 003144: 005747 003145: 000000 003146: 000010 lac 9f+t+1 003147: 204244 jms dskwr 003150: 102146 jmp dput i 003151: 623136 t = t+3 000041 " get a block number for a file, returns disk block number " allocates block if not allocated " AC/ file offset " jms pget " AC/ disk block number pget: 0 003152: 000000 lrss 6 " convert offset to block 003153: 660506 dac 9f+t " save as t0 003154: 044246 lac i.flags 003155: 205732 "** 01-s1.pdf page 37 and o200000 003156: 504170 sza " large file bit set? 003157: 740200 jmp 2f " yes 003160: 603220 lac 9f+t " no: small file 003161: 204246 jms betwen; d0; d6 " block 0..6? 003162: 101643 003163: 004116 003164: 004124 jmp 1f " no 003165: 603175 tad idskpp " make into block number pointer 003166: 344102 dac 9f+t " save in t0 003167: 044246 lac 9f+t i " get disk block number 003170: 224246 sna " allocated? 003171: 741200 jms alloc " no: allocate now 003172: 101545 dac 9f+t i " save (new) disk block number 003173: 064246 jmp pget i " return disk block number 003174: 623152 1: " here when file block>=7, not "large" jms alloc " allocate indirect block 003175: 101545 dac 9f+t+1 " save as t1 003176: 044247 jms copy; i.dskps; dskbuf; 7 " copy all the disk block numbers 003177: 101667 003200: 005733 003201: 007700 003202: 000007 jms copyz; dskbuf+7; 64-7 " zero rest of indirect block 003203: 101712 003204: 007707 003205: 000071 lac 9f+t+1 " get indirect block number back 003206: 204247 jms dskwr " write indirect block to disk 003207: 102146 lac 9f+t+1 003210: 204247 dac i.dskps " save indirect as new first block 003211: 045733 jms copyz; i.dskps+1; 6 " zero rest of block pointers 003212: 101712 003213: 005734 003214: 000006 lac i.flags 003215: 205732 xor o200000 " set "large file" 003216: 244170 dac i.flags 003217: 045732 2: " here with "large file" lac 9f+t " get file block number 003220: 204246 lrss 6 " divide by 64 (indirects/block) 003221: 660506 jms betwen; d0; d6 " ok now? 003222: 101643 003223: 004116 003224: 004124 jms halt " file too big " no, you lose! 003225: 102254 tad idskpp " yes: get indirect block pointer 003226: 344102 dac 9f+t+1 " save in t1 003227: 044247 lac 9f+t+1 i " get indirect block number 003230: 224247 sna " allocated? 003231: 741200 jms alloc " no, get it now 003232: 101545 dac 9f+t+1 i " save (new) indirect block 003233: 064247 dac 9f+t+2 " save as t2 003234: 044250 jms dskrd " read indirect block 003235: 102116 lac 9f+t " get original block number 003236: 204246 and o77 " mod by 64 003237: 504140 tad dskbufp " get pointer to disk block number 003240: 344103 dac 9f+t+1 " save as t1 003241: 044247 lac 9f+t+1 i " fetch disk block number 003242: 224247 sza " allocated? 003243: 740200 jmp pget i " yes: return 003244: 623152 jms alloc " no: allocate data block 003245: 101545 dac 9f+t " save as t0 003246: 044246 lac 9f+t+2 " get indirect block number 003247: 204250 jms dskrd " read it in 003250: 102116 lac 9f+t " get data block number 003251: 204246 dac 9f+t+1 i " save data block number 003252: 064247 lac 9f+t+2 003253: 204250 jms dskwr " write indirect block back 003254: 102146 lac 9f+t " get data block back 003255: 204246 jmp pget i " return it 003256: 623152 t = t+3 000044 iwrite: 0 003257: 000000 dac 9f+t " save arg in t0 003260: 044251 lac iwrite " load return address 003261: 203257 "** 01-s1.pdf page 38 dac iread " save as iread return addr 003262: 043266 lac cskp " load skip instruction 003263: 203335 dac iwrite " save as iwrite instruction 003264: 043257 jmp 1f 003265: 603272 " iread from file referenced by loaded inode " AC/ file offset " jms iread; addr; count iread: 0 003266: 000000 dac 9f+t " save offset in t0 003267: 044251 lac cnop " get nop 003270: 203442 dac iwrite " save as iwrite instruction 003271: 043257 1: -1 003272: 777777 tad iread i " get word before return addr 003273: 363266 dac 10 " store in index 10 & 11 003274: 040012 dac 11 003275: 040013 isz iread " increment return addr 003276: 443266 lac iread i " load addr 003277: 223266 dac 9f+t+1 " save in t1 003300: 044252 isz iread " increment return addr 003301: 443266 lac o70000 003302: 204164 xct iwrite " skip if write 003303: 403257 lac i.size " read: get file size 003304: 205744 cma 003305: 740001 tad 9f+t " add offset 003306: 344251 cma 003307: 740001 jms betwen; d0; 9f+t+1 003310: 101643 003311: 004116 003312: 004252 lac 9f+t+1 003313: 204252 dac 9f+t+2 003314: 044253 cma 003315: 740001 tad d1 003316: 344117 sna 003317: 741200 jmp iread i 003320: 623266 dac 9f+t+1 003321: 044252 1: lac 9f+t 003322: 204251 jms pget 003323: 103152 dac 9f+t+3 003324: 044254 jms dskrd 003325: 102116 lac 9f+t 003326: 204251 and o77 003327: 504140 tad dskbufp 003330: 344103 tad dm1 003331: 344204 xct iwrite 003332: 403257 jmp .+3 003333: 603336 dac 10 003334: 040012 cskp: skp 003335: 741000 dac 11 003336: 040013 2: lac 11 i 003337: 220013 dac 10 i 003340: 060012 isz 9f+t 003341: 444251 isz 9f+t+1 003342: 444252 jmp 3f 003343: 603357 xct iwrite 003344: 403257 jmp 4f 003345: 603355 lac 9f+t 003346: 204251 jms betwen; d0; i.size 003347: 101643 003350: 004116 003351: 005744 dac i.size 003352: 045744 lac 9f+t+3 003353: 204254 jms dskwr 003354: 102146 4: "** 01-s1.pdf page 38 lac 9f+t+2 003355: 204253 jmp iread i 003356: 623266 3: lac 9f+t 003357: 204251 and o77 003360: 504140 sza 003361: 740200 jmp 2b 003362: 603337 xct iwrite 003363: 403257 jmp 1b 003364: 603322 lac 9f+t+3 003365: 204254 jms dskwr 003366: 102146 jmp 1b 003367: 603322 t = t+4 000050 " system call helper " AC/ fd " jms finac " return with: fnode and inode loaded " or makes error return to user finac: 0 003370: 000000 lac u.ac 003371: 205631 jms fget 003372: 102360 jms error 003373: 101531 lac f.flags 003374: 205757 sma 003375: 740100 jms error 003376: 101531 lac f.i 003377: 205761 jms iget 003400: 103017 jmp finac i 003401: 623370 " update inode file size with value in AC dacisize: 0 003402: 000000 dac i.size 003403: 045744 jms iput 003404: 103046 lac i.size 003405: 205744 jmp dacisize i 003406: 623402 "** 01-s1.pdf page 41 " s7 pibreak: " priority interrupt break processing "chain" dac .ac " save interrupt AC 003407: 044071 "** CROSSED OUT.... dpsf 003410: 704741 jmp 1f " disable the Graphics-2 I/O 003411: 603432 dpcf 003412: 704761 dprs 003413: 704752 dac dpstat 003414: 045532 sma ral 003415: 740110 jmp 2f 003416: 603425 dprc 003417: 704712 dac dpchar 003420: 045535 -1 003421: 777777 dac dpread 003422: 045533 lac dpstat 003423: 205532 ral 003424: 740010 2: sma 003425: 740100 jmp piret 003426: 603755 -1 003427: 777777 dac dpwrite 003430: 045534 jmp piret "** END OF CROSSOUT 003431: 603755 1: clsf " clock overflow (line frequency ticks)? 003432: 700001 jmp 1f " no 003433: 603466 lpb " load display push buttons 003434: 704412 dac pbsflgs " save 003435: 045476 isz s.tim+1 " increment low order tick count 003436: 445560 skp " no overflow, skip second increment 003437: 741000 isz s.tim " low order overflowed, increment high order count 003440: 445557 isz uquant " increment user quantum counter 003441: 445474 "** written: ttydelay -> ttyd1 "** written: ttyrestart -> ttyres1 cnop: " fetched as constant in iread nop 003442: 740000 -1 003443: 777777 dac 7 " set location 7 to -1 (nothing ever clears it) 003444: 040007 clon " enable clock interrupts, reset flag 003445: 700044 lac ttydelay " tty delay positive? 003446: 205503 spa " yes: skip to skp 003447: 741100 isz ttydelay " no: done delaying? 003450: 445503 skp " not done 003451: 741000 jms ttyrestart " yes: start output 003452: 103572 "** START CROSSED OUT: written: lac tty lac .dspb 003453: 205536 sna 003454: 741200 jmp piret 003455: 603755 isz .dsptm 003456: 444073 skp 003457: 741000 jmp dsprestart 003460: 603512 sad d3 003461: 544121 jmp piret 003462: 603755 isz .dspb 003463: 445536 jmp piret 003464: 603755 jmp dsprestart "** END CROSSED OUT 003465: 603512 1: dssf " disk flag set? 003466: 707121 jmp 1f " no 003467: 603476 -1 " set .dskb = -1 003470: 777777 dac .dskb 003471: 044074 "** 01-s1.pdf page 42 dsrs " get disk status in .dske 003472: 707132 dac .dske 003473: 044075 dscs " clear status register 003474: 707141 jmp piret 003475: 603755 "** BEGIN CROSSED OUT 1: lds " load display status (see 03-scope.pdf pg 25) 003476: 701052 sma ral " display trap set? (and rotate left) 003477: 740110 jmp 1f " not set 003500: 603521 cdf " display done executing; clear display flags 003501: 700501 lac .dspb 003502: 205536 sna 003503: 741200 jmp piret " return now if .dspb == 0 003504: 603755 tad dm3 003505: 344203 sna 003506: 741200 jmp dsprestart " start display if .dspb == 3 003507: 603512 dac .dspb " otherwise, .dspb -= 3 and return 003510: 045536 jmp piret 003511: 603755 dsprestart: lac d1 003512: 204117 dac .dspb " set .dspb = 1 003513: 045536 lac dspbufp " load display buf pointer 003514: 205475 beg " start display processor 003515: 700547 -10 003516: 777766 dac .dsptm " set .dsptm = -10 (10 ticks) 003517: 044073 jmp piret 003520: 603755 1: sma ral " edges flag set?? (and rotate) 003521: 740110 jmp .+3 " no 003522: 603525 raef " "resume after edges flag" 003523: 700742 jmp piret " return 003524: 603755 sma " light pen flag? 003525: 740100 jmp 1f " no 003526: 603533 lda " G-2: load display address 003527: 701012 dac .lpba " save 003530: 045537 rlpd " G-2: resume after light pen stop 003531: 700723 jmp piret 003532: 603755 1: ksf " (TTY) keyboard flag set? 003533: 700301 jmp 1f " no 003534: 603565 lac ttydelay " get TTY delay 003535: 205503 sma " minus (waiting for output)? 003536: 740100 isz ttydelay " no: increment??? (make more positive) 003537: 445503 krb " read keyboard buffer 003540: 700312 dac char " save in char 003541: 045511 sad o375 " interrupt char (TTY ALT MODE?) 003542: 544151 jmp intrp1 " yes 003543: 604021 lac d1 003544: 204117 jms putchar 003545: 101730 dzm char 003546: 145511 lac sfiles+0 " get sleep word for ttyin 003547: 205520 jms wakeup " wake processes 003550: 103762 dac sfiles+0 " clear sleep word 003551: 045520 lac char " get character 003552: 205511 sad o212 " new line (with parity)?? 003553: 544150 skp " yes 003554: 741000 jmp piret " no: done 003555: 603755 lac sfiles+1 " get ttyout sleep word 003556: 205521 sma " highest bit set? 003557: 740100 xor o400000 " no, make it so (why?] 003560: 244173 dac sfiles+1 " save back 003561: 045521 "** 01-s1.pdf page 43 jms putcr " output CR next 003562: 104014 jms ttyrestart " start output 003563: 103572 jmp piret 003564: 603755 1: tsf " TTY output flag set? 003565: 700401 jmp 1f " no 003566: 603626 tcf " yes: clear flag 003567: 700402 jms ttyrestart " transmit next character 003570: 103572 jmp piret 003571: 603755 ttyrestart: 0 003572: 000000 lac ttydelay " get tty delay 003573: 205503 spa " positive? 003574: 741100 jmp ttyrestart i " no: keep waiting 003575: 623572 lac nttychar " get pending CR, if any 003576: 205501 dzm nttychar " clear it 003577: 145501 sza " need to send CR? 003600: 740200 jmp 3f " yes 003601: 603606 isz ttydelay " increment ttydelay (make more positive) 003602: 445503 lac d2 003603: 204120 jms getchar " get a character 003604: 101745 jmp 2f " none found?? 003605: 603622 3: tls " start output 003606: 700406 sad o12 " newline? 003607: 544130 jms putcr " yes: put CR next 003610: 104014 sad o15 " CR? 003611: 544132 skp " yes 003612: 741000 jmp ttyrestart i " no: return 003613: 623572 lac ttydelay " get current tty delay 003614: 205503 tad o20 " bump by 16 003615: 344134 rcr " divide by two 003616: 744020 cma " complement 003617: 740001 dac ttydelay " save 003620: 045503 jmp ttyrestart i 003621: 623572 2: lac sfiles+1 " run out of characters to send: wake user(s) 003622: 205521 jms wakeup 003623: 103762 dac sfiles+1 003624: 045521 jmp ttyrestart i "** written arrow up 2 copies 003625: 623572 "** BEGIN CROSSED OUT 1: sck " Graphic-2 keyboard flag set? 003626: 704301 jmp 1f " no. 003627: 603644 cck " yes: clear flag 003630: 704304 lck " read character 003631: 704312 dac char 003632: 045511 sad o33 " code 33 (ESCAPE?) 003633: 544135 jmp intrp2 " yes: mark interrupt 003634: 604044 lac d3 003635: 204121 jms putchar 003636: 101730 nop 003637: 740000 lac sfiles+2 003640: 205522 jms wakeup 003641: 103762 dac sfiles+2 003642: 045522 jmp piret 003643: 603755 1: rsf " paper tape ready? 003644: 700101 jmp 1f " no 003645: 603712 "** 01-s1.pdf page 44 lac npptchar 003646: 205502 sna 003647: 741200 jmp .+5 003650: 603655 dac char 003651: 045511 rrb 003652: 700112 dac npptchar 003653: 045502 jmp .+3 003654: 603657 rrb 003655: 700112 dac char 003656: 045511 3: lac char 003657: 205511 sna 003660: 741200 jmp 2f 003661: 603670 lac d4 003662: 204122 jms putchar 003663: 101730 jmp 3f 003664: 603704 lac char 003665: 205511 sad d4 003666: 544122 jmp 4f 003667: 603706 2: lac npptchar 003670: 205502 sna 003671: 741200 jmp .+4 003672: 603676 dac char 003673: 045511 dzm npptchar 003674: 145502 jmp 3b 003675: 603657 rsa 003676: 700104 lac sfiles+3 003677: 205523 jms wakeup 003700: 103762 xor o400000 003701: 244173 dac sfiles+3 003702: 045523 jmp piret 003703: 603755 3: lac char 003704: 205511 dac npptchar 003705: 045502 4: lac sfiles+3 003706: 205523 jms wakeup 003707: 103762 dac sfiles+3 003710: 045523 jmp piret 003711: 603755 1: psf " paper tape ready? 003712: 700201 jmp 1f " no 003713: 603726 pcf " clear ptp flag 003714: 700202 lac d5 003715: 204123 jms getchar " get next char 003716: 101745 jmp .+3 003717: 603722 psa 003720: 700204 jmp piret 003721: 603755 lac sfiles+4 003722: 205524 jms wakeup 003723: 103762 dac sfiles+4 003724: 045524 jmp piret 003725: 603755 "** BEGIN CROSSED OUT 1: spb " any graphic-2 push button? 003726: 704401 jmp 1f " no 003727: 603745 cpb " clear push button flag 003730: 704404 lpb " load push button value 003731: 704412 dac pbsflgs+1 003732: 045477 "** 01-s1.pdf page 45 and o2000 " get push button 7 003733: 504153 sna " set? 003734: 741200 jmp piret " no: done 003735: 603755 jms dspinit " yes: reset display buffer 003736: 102606 lac sfiles+6 " wake up anyone sleeping on display 003737: 205526 jms wakeup 003740: 103762 dac sfiles+6 003741: 045526 cla " clear button lights 003742: 750000 wbl 003743: 704424 jmp piret "** END CROSSED OUT 003744: 603755 1: crsf " card reader flag set? 003745: 706701 jmp 1f " no 003746: 603754 crrb 003747: 706712 dac crchar 003750: 045541 -1 003751: 777777 dac crread 003752: 045540 jmp piret 003753: 603755 1: crrb " read card reader buffer?? 003754: 706712 piret: " return from priority interrupt lac 0 " get LINK/PC 003755: 200000 ral " restore LINK 003756: 740010 lac .ac " restore AC 003757: 204071 ion " reenable interrupts 003760: 700042 jmp 0 i " return from interrupt 003761: 620000 " wake sleeping processes " NOTE!! Called from interrupt service, so avoids indirect!!! " call: " AC/ sfiles word (bit vector of processes to wake) " jms wakeup " AC/ 0 (to store in sfiles word) wakeup: 0 003762: 000000 dac 9f+t " save vector in t0 003763: 044255 -mnproc 003764: 777766 dac 9f+t+1 " loop count in t1 003765: 044256 lac tadu " get "tad ulist" 003766: 204076 dac 2f 003767: 044000 lac dacu " get "dac ulist" 003770: 204077 dac 2f+1 003771: 044001 1: lac 9f+t 003772: 204255 ral " rotate vector up one 003773: 740010 dac 9f+t 003774: 044255 sma " high bit set? 003775: 740100 jmp 2f+2 " no: skip the fun 003776: 604002 lac o700000 " yes: decrement process status (wake) 003777: 204200 2: tad .. " (avoiding indirect) 004000: 340000 dac .. 004001: 040000 lac 2b " advance tad operand by 4 words 004002: 204000 tad d4 004003: 344122 dac 2b 004004: 044000 lac 2b+1 " advance tad operand by 4 words 004005: 204001 tad d4 004006: 344122 dac 2b+1 004007: 044001 isz 9f+t+1 " done? 004010: 444256 jmp 1b " no, keep going 004011: 603772 cla " return zero in AC 004012: 750000 jmp wakeup i 004013: 623762 t = t+2 000052 " call to output CR after LF (NL) putcr: 0 004014: 000000 lac o15 004015: 204132 dac nttychar 004016: 045501 "** 01-s1.pdf page 46 cla 004017: 750000 jmp putcr i 004020: 624014 intrp1: " here with TTY interrupt character lac d6 " get keyboard special device number 004021: 204124 dac .int1 " save as interrupt source 004022: 044067 lac d1 " drain tty input buffer? 004023: 204117 jms getchar 004024: 101745 skp 004025: 741000 jmp .-3 004026: 604023 lac d2 " drain tty output buffer? 004027: 204120 jms getchar 004030: 101745 skp 004031: 741000 jmp .-3 004032: 604027 lac sfiles+0 " wake ttyin sleepers 004033: 205520 jms wakeup 004034: 103762 dac sfiles+0 004035: 045520 lac sfiles+1 " wake ttyout sleepers 004036: 205521 jms wakeup 004037: 103762 dac sfiles+1 004040: 045521 jms chkint " check if user interrupted 004041: 100320 jmp piret " no, return from PI 004042: 603755 jmp 1f " yes: return thru system call code (dump core) 004043: 604062 intrp2: " here with display interrupt character lac d7 " get keyboard special device number 004044: 204125 dac .int2 " save as interrupt source 004045: 044070 lac d3 " drain keyboard buffer? 004046: 204121 jms getchar 004047: 101745 skp 004050: 741000 jmp .-3 004051: 604046 lac sfiles+2 " wake up any "keyboard" sleepers 004052: 205522 jms wakeup 004053: 103762 dac sfiles+2 004054: 045522 lac sfiles+6 " wake up any "display" sleepers 004055: 205526 jms wakeup 004056: 103762 dac sfiles+6 004057: 045526 jms chkint " check if user interrupted 004060: 100320 jmp piret " no, return from PI 004061: 603755 1: lac 0 " get interrupt PC 004062: 200000 dac 020 " save as system call return PC 004063: 040020 lac .ac " restore AC from interrupt 004064: 204071 jmp 021 " join system call processing (dump core?) 004065: 600021 "** 01-s1.pdf page 48 " s8 " manifests mnproc = 10 000012 dspbsz = 270 000416 ndskbs = 4 000004 " flags .insys: 0 " "in system" 004066: 000000 .int1: 0 " inode for user interrupt 1 004067: 000000 .int2: 0 " inode for user interrupt 2 004070: 000000 .ac: 0 " saved AC from Priotity Interrupt 004071: 000000 .savblk: 0 " set by system call, cleared by disk i/o 004072: 000000 .dsptm: 0 " display restart countdown (10 ticks) 004073: 000000 .dskb: 0 " set on disk interrupt 004074: 000000 .dske: 0 " status from disk interrupt 004075: 000000 " pointers tadu: tad ulist 004076: 345561 dacu: dac ulist 004077: 045561 maxquant: 30 004100: 000036 ofilesp: u.ofiles 004101: 005654 idskpp: i.dskps 004102: 005733 dskbufp: dskbuf 004103: 007700 edspbuf: dspbuf+dspbsz 004104: 005064 dspbufp3: dspbuf+3 004105: 004451 fblksp: s.fblks 004106: 005544 dacq1: dac q1 004107: 044260 lacq1: lac q1 004110: 204260 q2p: q2 004111: 004300 " strings initf: n;t;< > ;< > " 004112: 151156 004113: 151164 004114: 040040 004115: 040040 " constants d0: 0 004116: 000000 d1: 1 004117: 000001 d2: 2 004120: 000002 d3: 3 004121: 000003 d4: 4 004122: 000004 d5: 5 004123: 000005 d6: 6 004124: 000006 d7: o7: 07 004125: 000007 d8: 8 004126: 000010 d9: 9 004127: 000011 o12: d10: 10 004130: 000012 o14: 014 004131: 000014 o15: 015 004132: 000015 o17: 017 004133: 000017 o20: 020 004134: 000020 o33: 033 004135: 000033 o40: 040 004136: 000040 o55: 055 004137: 000055 o77: 077 004140: 000077 d65:o101: 0101 004141: 000101 d33: 33 004142: 000041 o132: 0132 004143: 000132 o134: 0134 004144: 000134 o137: 0137 004145: 000137 o155: 0155 004146: 000155 o177: 0177 004147: 000177 "** 01-s1.pdf page 49 o212: 0212 004150: 000212 o375: 0375 004151: 000375 o777: 0777 004152: 000777 o2000: 02000 004153: 002000 o4000: 04000 004154: 004000 d7999: 7999 004155: 017477 o10000: 010000 004156: 010000 o17762: 017762 004157: 017762 o17777: 017777 004160: 017777 o20001: 020001 004161: 020001 o40000: 040000 004162: 040000 o40001: 040001 004163: 040001 o70000: 070000 004164: 070000 o77777: 077777 004165: 077777 o100000: 0100000 004166: 100000 o140000: 0140000 004167: 140000 o200000: 0200000 004170: 200000 o200001: 0200001 004171: 200001 o300000: 0300000 004172: 300000 o400000: 0400000 004173: 400000 o500000: 0500000 004174: 500000 o577777: 0577777 004175: 577777 o600000: 0600000 004176: 600000 o640000: 0640000 004177: 640000 o700000: 0700000 004200: 700000 o777700: 0777700 004201: 777700 o777760: 0777760 004202: 777760 dm3: -3 004203: 777775 dm1: -1 004204: 777777 9: .=.+t " per-routine temp variables 1004257 c1: .=.+1 " not used? 1004260 q1: q2;q2+98 " ** 90? 96?? " queue element free list? 004260: 004300 004261: 004442 .=.+14 1004300 " queues (two words each, head and tail pointers?) " 1: tty input " 2: tty output " 3: display keyboard " 4: paper tape reader " 5: paper tape punch q2: .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 004300: 004302 004301: 000000 004302: 004304 004303: 000000 004304: 004306 004305: 000000 004306: 004310 004307: 000000 004310: 004312 004311: 000000 004312: 004314 004313: 000000 004314: 004316 004315: 000000 004316: 004320 004317: 000000 004320: 004322 004321: 000000 004322: 004324 004323: 000000 .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 004324: 004326 004325: 000000 004326: 004330 004327: 000000 004330: 004332 004331: 000000 004332: 004334 004333: 000000 004334: 004336 004335: 000000 004336: 004340 004337: 000000 004340: 004342 004341: 000000 004342: 004344 004343: 000000 004344: 004346 004345: 000000 004346: 004350 004347: 000000 .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 004350: 004352 004351: 000000 004352: 004354 004353: 000000 004354: 004356 004355: 000000 004356: 004360 004357: 000000 004360: 004362 004361: 000000 004362: 004364 004363: 000000 004364: 004366 004365: 000000 004366: 004370 004367: 000000 004370: 004372 004371: 000000 004372: 004374 004373: 000000 .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0 004374: 004376 004375: 000000 004376: 004400 004377: 000000 004400: 004402 004401: 000000 004402: 004404 004403: 000000 004404: 004406 004405: 000000 004406: 004410 004407: 000000 004410: 004412 004411: 000000 004412: 004414 004413: 000000 004414: 004416 004415: 000000 004416: 004420 004417: 000000 .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;0;0 004420: 004422 004421: 000000 004422: 004424 004423: 000000 004424: 004426 004425: 000000 004426: 004430 004427: 000000 004430: 004432 004431: 000000 004432: 004434 004433: 000000 004434: 004436 004435: 000000 004436: 004440 004437: 000000 004440: 004442 004441: 000000 004442: 000000 004443: 000000 dsploc: .=.+1 1004445 dsplno: .=.+1 1004446 dspbuf: 0065057;0147740;0160000 " display commands: see 03-scope.pdf pg 20 004446: 065057 004447: 147740 004450: 160000 " PARAM: clear blink, clear light pen, scale=1, intensity=3 " X-Y: invisible, no delay, Y=01740 (992) " X-Y: invisible, settling delay, X=0 .=.+30 1004507 coldentry: dzm 0100 " not re-entrant 004507: 140100 caf " clear all flags 004510: 703302 ion " enable interrupts 004511: 700042 clon " clear clock flag 004512: 700044 law 3072 " initialize display.... 004513: 766000 wcga 004514: 704206 jms dspinit 004515: 102606 law dspbuf " set display buffer to default 004516: 764446 jms movdsp 004517: 102615 cla " read system block from disk 004520: 750000 jms dskio; 06000 004521: 102162 004522: 006000 jms copy; dskbuf; sysdata; ulist-sysdata " copy to system data 004523: 101667 004524: 007700 004525: 005542 004526: 000017 lac d3 " look for "init" in default directory 004527: 204121 jms namei; initf 004530: 102737 004531: 004112 jms halt 004532: 102254 "** 01-s1.pdf page 50 jms iget 004533: 103017 cla 004534: 750000 jms iread; 4096; 4096 " read in "init" 004535: 103266 004536: 010000 004537: 010000 jmp 4096 " start process 1 004540: 610000 . = dspbuf+dspbsz+3 1005067 dskbuf = 07700 007700 dskbs: .=.+65+65+65+65 1005473 edskbsp: . 005473: 005473 uquant: .=.+1 " number of ticks user has been running 1005475 dspbufp: .=.+1 " pointer to display buffer 1005476 pbsflgs: .=.+2 " buttons on last tick, last button interrupt 1005500 mode: .=.+1 1005501 nttychar: .=.+1 " CR to send next, or zero 1005502 npptchar: .=.+1 1005503 ttydelay: .=.+1 " delay count for TTY output 1005504 name: .=.+4 1005510 lnkaddr: .=.+1 1005511 char: .=.+1 1005512 dskaddr: .=.+1 1005513 uniqpid: 1 " pid generator 005513: 000001 lu: .=.+4 " user (process) table entry copy 1005520 sfiles: .=.+10 " wait addresses for special files 1005532 " (bit vector of waiting processes?) " offsets: 0: ttyin, 1: ttyout, 2: keyboard, " 3: ptr, 4: ptp, 6: display dpdata: dpstat: .=.+1 1005533 dpread: .=.+1 1005534 dpwrite: .=.+1 1005535 dpchar: .=.+1 1005536 dspdata: .dspb: .=.+1 1005537 .lpba: .=.+1 "** 4 written on listing 1005540 crdata: crread: .=.+1 1005541 crchar: .=.+1 1005542 sysdata: " system data 64 words saved to disk s.nxfblk: .=.+1 " pointer to next free block?? 1005543 s.nfblks: .=.+1 " number of free blocks (in fblks?) 1005544 s.fblks: .=.+10 " cached free block numbers 1005556 s.uniq: .=.+1 " next unique value 1005557 s.tim: .=.+2 " (up?)time in 60Hz ticks (low, high) 1005561 " process table " first word " bits 0:2 -- status " 0: free slot " 1: in/ready " 2: in/notready " 3: out/ready " 4: out/notready?? " bits 3:17 -- disk swap address/8 " second word: process pid " third word: smes/rmes status: " 0: not waiting " -1: this process waiting (rmes) " other: complement of sender pid " fourth word: smes message ulist: 0131000;1;0;0 005561: 131000 005562: 000001 005563: 000000 005564: 000000 0031040;0;0;0 005565: 031040 005566: 000000 005567: 000000 005570: 000000 0031100;0;0;0 005571: 031100 005572: 000000 005573: 000000 005574: 000000 0031140;0;0;0 005575: 031140 005576: 000000 005577: 000000 005600: 000000 0031200;0;0;0 005601: 031200 005602: 000000 005603: 000000 005604: 000000 0031240;0;0;0 005605: 031240 005606: 000000 005607: 000000 005610: 000000 0031300;0;0;0 005611: 031300 005612: 000000 005613: 000000 005614: 000000 0031340;0;0;0 005615: 031340 005616: 000000 005617: 000000 005620: 000000 0031400;0;0;0 005621: 031400 005622: 000000 005623: 000000 005624: 000000 0031440;0;0;0 005625: 031440 005626: 000000 005627: 000000 005630: 000000 userdata: " "ustruct" (swappable) u.ac: 0 " user AC 005631: 000000 u.mq: 0 " user MQ 005632: 000000 u.rq: .=.+9 " user 010-017, user PC 1005644 u.uid: -1 " user id 005644: 777777 u.pid: 1 " process id 005645: 000001 u.cdir: 3 " connected directory (inode number?) 005646: 000003 u.ulistp: ulist " pointer to process table entry 005647: 005561 u.swapret: 0 " kernel routine to resume at after swap in 005650: 000000 u.base: 0 " start of user buffer 005651: 000000 u.count: 0 " size of user buffer 005652: 000000 "** 01-s1.pdf page 51 u.limit: 0 " end of user buffer 005653: 000000 u.ofiles: .=.+30 " open files (10 "fnode" entries) 1005712 u.dspbuf: 0 005712: 000000 u.intflg: 1 005713: 000001 .=userdata+64 1005731 ii: .=.+1 " The current i-node number stored in inode 1005732 inode: " disk inode in memory: i.flags: .=.+1 " inode flags 1005733 " 400000 in use " 200000 large file " 000040 special device (indicated by inum) " 000020 directory " 000010 owner read " 000004 owner write " 000002 world read " 000001 world write i.dskps: .=.+7 " disk block numbers (indirect if "large file") 1005742 i.uid: .=.+1 " owner 1005743 i.nlks: .=.+1 " link count (negative) 1005744 i.size: .=.+1 " size (in words) 1005745 i.uniq: .=.+1 " unique number 1005746 .= inode+12 1005746 di: .=.+1 " directory index 1005747 dnode: " directory entry: d.i: .=.+1 " inode number 1005750 d.name: .=.+4 " name (space padded) 1005754 d.uniq: .=.+1 " unique number from directory inode 1005755 . = dnode+8 1005757 fnode: " open file entry f.flags: .=.+1 " see below 1005760 f.badd: .=.+1 " offset 1005761 f.i: 0 " file i-number 005761: 000000 " f.flags: " 400000 in use " 000002 read " 000001 write Labels: .ac 004071 r .capt 000377 r .chdir 000615 r .chmod 000407 r .chown 000421 r .close 000720 r .creat 000660 r .dskb 004074 r .dske 004075 r .dspb 005536 r .dsptm 004073 r .exit 001163 r .fork 001111 r .getuid 000426 r .halt 001336 r .insys 004066 r .int1 004067 r .int2 004070 r .intrp 000257 r .link 000467 r .lpba 005537 r .open 000626 r .read 000724 r .rele 000403 r .rename 000567 r .rmes 001177 r .savblk 004072 r .save 001151 r .seek 000431 r .setuid 000561 r .smes 001225 r .status 000352 r .sysloc 000262 r .tell 000461 r .time 000610 r .unlink 000542 r .write 000773 r access 002312 r alloc 001545 r arg 002625 r argname 002631 r awake 001304 r badcal 001146 r betwen 001643 r c1 004257 r char 005511 r chkint 000320 r chkint1 001535 r cnop 003442 r coldentr 004507 r collapse 002055 r copy 001667 r copyz 001712 r crchar 005541 r crdata 005540 r crread 005540 r cskp 003335 r d.i 005747 r d.name 005750 r d.uniq 005754 r d0 004116 r d1 004117 r d10 004130 r d2 004120 r d3 004121 r d33 004142 r d4 004122 r d5 004123 r d6 004124 r d65 004141 r d7 004125 r d7999 004155 r d8 004126 r d9 004127 r dacisize 003402 r dacq1 004107 r dacu 004077 r dget 003104 r di 005746 r dm1 004204 r dm3 004203 r dnode 005747 r dpchar 005535 r dpdata 005532 r dpread 005533 r dpstat 005532 r dput 003136 r dpwrite 005534 r dskaddr 005512 r dskbs 005067 r dskbufp 004103 r dskio 002162 r dskrd 002116 r dskswap 002267 r dsktrans 002220 r dskwr 002146 r dslot 002463 r dspbuf 004446 r dspbufp 005475 r dspbufp3 004105 r dspdata 005536 r dspinit 002606 r dspleft 002562 r dsplno 004445 r dsploc 004444 r dspnl 002574 r dspput 002540 r dspresta 003512 r edskbsp 005473 r edspbuf 004104 r error 001531 r exitrw 001034 r f.badd 005760 r f.flags 005757 r f.i 005761 r fallr 002425 r fassign 002327 r fblksp 004106 r fget 002360 r finac 003370 r fnode 005757 r forall 002412 r fput 002402 r free 001604 r getchar 001745 r halt 002254 r i.dskps 005733 r i.flags 005732 r i.nlks 005743 r i.size 005744 r i.uid 005742 r i.uniq 005745 r icreat 002475 r idskpp 004102 r iget 003017 r ii 005731 r initf 004112 r inode 005732 r intrp1 004021 r intrp2 004044 r iput 003046 r iread 003266 r isown 002664 r itrunc 002675 r iwrite 003257 r laci 001635 r lacq1 004110 r lnkaddr 005510 r locn 000317 r locsw 000275 r lookfor 001066 r lu 005514 r maxquant 004100 r mode 005500 r movdsp 002615 r name 005504 r namei 002737 r npptchar 005502 r nttychar 005501 r o10000 004156 r o100000 004166 r o101 004141 r o12 004130 r o132 004143 r o134 004144 r o137 004145 r o14 004131 r o140000 004167 r o15 004132 r o155 004146 r o17 004133 r o177 004147 r o17762 004157 r o17777 004160 r o20 004134 r o2000 004153 r o200000 004170 r o200001 004171 r o20001 004161 r o212 004150 r o300000 004172 r o33 004135 r o375 004151 r o40 004136 r o4000 004154 r o40000 004162 r o400000 004173 r o40001 004163 r o500000 004174 r o55 004137 r o577777 004175 r o600000 004176 r o640000 004177 r o7 004125 r o70000 004164 r o700000 004200 r o77 004140 r o777 004152 r o777700 004201 r o777760 004202 r o77777 004165 r ofilesp 004101 r okexit 000102 r open1 000715 r orig 000000 r passone 001523 r pbsflgs 005476 r pget 003152 r pibreak 003407 r piret 003755 r putchar 001730 r putcr 004014 r putq 002011 r q1 004260 r q2 004300 r q2p 004111 r rkbdi 001410 r rppti 001461 r rttyi 001337 r s.fblks 005544 r s.nfblks 005543 r s.nxfblk 005542 r s.tim 005557 r s.uniq 005556 r searchu 001042 r seektell 002645 r sfiles 005520 r sleep 002434 r srcdbs 002035 r swap 000136 r swn 000256 r swp 000220 r swr 001324 r sww 001324 r sysdata 005542 r sysexit 000103 r tadu 004076 r takeq 001757 r ttydelay 005503 r ttyresta 003572 r u.ac 005631 r u.base 005651 r u.cdir 005646 r u.count 005652 r u.dspbuf 005712 r u.intflg 005713 r u.limit 005653 r u.mq 005632 r u.ofiles 005654 r u.pid 005645 r u.rq 005633 r u.swapre 005650 r u.uid 005644 r u.ulistp 005647 r ulist 005561 r uniqpid 005513 r uquant 005474 r userdata 005631 r wakeup 003762 r wdspo 001451 r wppto 001475 r wttyo 001357 r