mirror of
https://github.com/DoctorWkt/pdp7-unix.git
synced 2026-01-27 20:48:00 +00:00
253 lines
6.0 KiB
ArmAsm
253 lines
6.0 KiB
ArmAsm
"** 01-s1.pdf page 48
|
|
|
|
" s8
|
|
|
|
" manifests
|
|
mnproc = 10 " number of processes
|
|
dspbsz = 270 " display buffer size
|
|
ndskbs = 4 " number of buffers at dskbs
|
|
|
|
" flags
|
|
.insys: 0 " "in system"
|
|
.int1: 0 " inode for user interrupt 1
|
|
.int2: 0 " inode for user interrupt 2
|
|
.ac: 0 " saved AC from Priotity Interrupt
|
|
.savblk: 0 " set by system call, cleared by disk i/o
|
|
.dsptm: 0 " display restart countdown (10 ticks)
|
|
.dskb: 0 " set on disk interrupt
|
|
.dske: 0 " status from disk interrupt
|
|
|
|
" pointers
|
|
tadu: tad ulist
|
|
dacu: dac ulist
|
|
maxquant: 30
|
|
ofilesp: u.ofiles
|
|
idskpp: i.dskps
|
|
dskbufp: dskbuf
|
|
edspbuf: dspbuf+dspbsz
|
|
dspbufp3: dspbuf+3
|
|
fblksp: s.fblks
|
|
dacq1: dac q1
|
|
lacq1: lac q1
|
|
q2p: q2
|
|
|
|
" strings
|
|
initf:
|
|
<in>; <it>; 040040; 040040 " was <i>n;<i>t;< > ;< > but as.s unhappy!
|
|
|
|
" constants
|
|
d0: 0
|
|
d1: 1
|
|
d2: 2
|
|
d3: 3
|
|
d4: 4
|
|
d5: 5
|
|
d6: 6
|
|
d7: o7: 07
|
|
d8: 8
|
|
d9: 9
|
|
o12: d10: 10
|
|
o14: 014
|
|
o15: 015
|
|
o17: 017
|
|
o20: 020
|
|
o33: 033
|
|
o40: 040
|
|
o55: 055
|
|
o77: 077
|
|
d65:o101: 0101
|
|
d33: 33
|
|
o132: 0132
|
|
o134: 0134
|
|
o137: 0137
|
|
o155: 0155
|
|
o177: 0177
|
|
"** 01-s1.pdf page 49
|
|
o212: 0212
|
|
o375: 0375
|
|
o777: 0777
|
|
o2000: 02000
|
|
o4000: 04000
|
|
d7999: 7999
|
|
o10000: 010000
|
|
o17762: 017762
|
|
o17777: 017777
|
|
o20001: 020001
|
|
o40000: 040000
|
|
o40001: 040001
|
|
o70000: 070000
|
|
o77777: 077777
|
|
o100000: 0100000
|
|
o140000: 0140000
|
|
o200000: 0200000
|
|
o200001: 0200001
|
|
o300000: 0300000
|
|
o400000: 0400000
|
|
o500000: 0500000
|
|
o577777: 0577777
|
|
o600000: 0600000
|
|
o640000: 0640000
|
|
o700000: 0700000
|
|
o777700: 0777700
|
|
o777760: 0777760
|
|
dm3: -3
|
|
dm1: -1
|
|
|
|
9: .=.+t " per-routine temp variables
|
|
c1: .=.+1 " not used?
|
|
q1: q2;q2+98 " ** 90? 96?? " queue element free list?
|
|
.=.+14
|
|
" 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
|
|
.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
|
|
.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
|
|
.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
|
|
.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;0;0
|
|
dsploc: .=.+1
|
|
dsplno: .=.+1
|
|
dspbuf:
|
|
0065057;0147740;0160000 " display commands: see 03-scope.pdf pg 20
|
|
" 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
|
|
coldentry:
|
|
dzm 0100 " not re-entrant
|
|
caf " clear all flags
|
|
ion " enable interrupts
|
|
clon " clear clock flag
|
|
law 3072 " initialize display....
|
|
wcga
|
|
jms dspinit
|
|
law dspbuf " set display buffer to default
|
|
jms movdsp
|
|
cla " read system block from disk
|
|
jms dskio; 06000
|
|
jms copy; dskbuf; sysdata; ulist-sysdata " copy to system data
|
|
lac d3 " look for "init" in default directory
|
|
jms namei; initf
|
|
jms halt
|
|
"** 01-s1.pdf page 50
|
|
jms iget
|
|
cla
|
|
jms iread; 4096; 4096 " read in "init"
|
|
jmp 4096 " start process 1
|
|
. = dspbuf+dspbsz+3
|
|
dskbuf = 07700
|
|
dskbs: .=.+65+65+65+65 " ndskbs buffers (block number + block)
|
|
edskbsp: .
|
|
uquant: .=.+1 " number of ticks user has been running
|
|
dspbufp: .=.+1 " pointer to display buffer
|
|
pbsflgs: .=.+2 " buttons on last tick, last button interrupt
|
|
mode: .=.+1
|
|
nttychar: .=.+1 " CR to send next, or zero
|
|
npptchar: .=.+1
|
|
ttydelay: .=.+1 " delay count for TTY output
|
|
name: .=.+4
|
|
lnkaddr: .=.+1
|
|
char: .=.+1
|
|
dskaddr: .=.+1
|
|
uniqpid: 1 " pid generator
|
|
lu: .=.+4 " user (process) table entry copy
|
|
sfiles: .=.+10 " wait addresses for special files
|
|
" (bit vector of waiting processes?)
|
|
" offsets: 0: ttyin, 1: ttyout, 2: keyboard,
|
|
" 3: ptr, 4: ptp, 6: display
|
|
dpdata:
|
|
dpstat: .=.+1
|
|
dpread: .=.+1
|
|
dpwrite: .=.+1
|
|
dpchar: .=.+1
|
|
dspdata:
|
|
.dspb: .=.+1
|
|
.lpba: .=.+1 "** 4 written on listing
|
|
crdata:
|
|
crread: .=.+1
|
|
crchar: .=.+1
|
|
sysdata: " system data 64 words saved to disk
|
|
s.nxfblk: .=.+1 " pointer to next free block??
|
|
s.nfblks: .=.+1 " number of free blocks (in fblks?)
|
|
s.fblks: .=.+10 " cached free block numbers
|
|
s.uniq: .=.+1 " next unique value
|
|
s.tim: .=.+2 " (up?)time in 60Hz ticks (low, high)
|
|
" 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
|
|
0031040;0;0;0
|
|
0031100;0;0;0
|
|
0031140;0;0;0
|
|
0031200;0;0;0
|
|
0031240;0;0;0
|
|
0031300;0;0;0
|
|
0031340;0;0;0
|
|
0031400;0;0;0
|
|
0031440;0;0;0
|
|
userdata: " "ustruct" (swappable)
|
|
u.ac: 0 " user AC
|
|
u.mq: 0 " user MQ
|
|
u.rq: .=.+9 " user 010-017, user PC
|
|
u.uid: -1 " user id
|
|
u.pid: 1 " process id
|
|
u.cdir: 3 " connected directory (inode number?)
|
|
u.ulistp: ulist " pointer to process table entry
|
|
u.swapret: 0 " kernel routine to resume at after swap in
|
|
u.base: 0 " start of user buffer
|
|
u.count: 0 " size of user buffer
|
|
"** 01-s1.pdf page 51
|
|
u.limit: 0 " end of user buffer
|
|
u.ofiles: .=.+30 " open files (10 "fnode" entries)
|
|
u.dspbuf: 0
|
|
u.intflg: 1
|
|
.=userdata+64
|
|
ii: .=.+1 " The current i-node number stored in inode
|
|
inode: " disk inode in memory:
|
|
i.flags: .=.+1 " inode flags
|
|
" 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")
|
|
i.uid: .=.+1 " owner
|
|
i.nlks: .=.+1 " link count (negative)
|
|
i.size: .=.+1 " size (in words)
|
|
i.uniq: .=.+1 " unique number
|
|
.= inode+12
|
|
di: .=.+1 " directory index
|
|
dnode: " directory entry:
|
|
d.i: .=.+1 " inode number
|
|
d.name: .=.+4 " name (space padded)
|
|
d.uniq: .=.+1 " unique number from directory inode
|
|
. = dnode+8
|
|
fnode: " open file entry
|
|
f.flags: .=.+1 " see below
|
|
f.badd: .=.+1 " offset
|
|
f.i: 0 " file i-number
|
|
" f.flags:
|
|
" 400000 in use
|
|
" 000002 read
|
|
" 000001 write
|