Files
pdp7-unix/build/alt/a.lst
T

5377 lines
114 KiB
Plaintext

"** 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
" <not between>
" <between>
" 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:
<i>n;<i>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