PDP7-Unix/sys/s7.s
"** 01-s1.pdf page 41
" s7
pibreak: " priority interrupt break processing "chain"
dac .ac " save interrupt AC
"** CROSSED OUT....
dpsf
jmp 1f " disable the Graphics-2 I/O
dpcf
dprs
dac dpstat
sma ral
jmp 2f
dprc
dac dpchar
-1
dac dpread
lac dpstat
ral
2:
sma
jmp piret
-1
dac dpwrite
jmp piret "** END OF CROSSOUT
1: clsf " clock overflow (line frequency ticks)?
jmp 1f " no
lpb " load display push buttons
dac pbsflgs " save
isz s.tim+1 " increment low order tick count
skp " no overflow, skip second increment
isz s.tim " low order overflowed, increment high order count
isz uquant " increment user quantum counter
"** written: ttydelay -> ttyd1
"** written: ttyrestart -> ttyres1
cnop: " fetched as constant in iread
nop
-1
dac 7 " set location 7 to -1 (nothing ever clears it)
clon " enable clock interrupts, reset flag
lac ttydelay " tty delay positive?
spa " yes: skip to skp
isz ttydelay " no: done delaying?
skp " not done
jms ttyrestart " yes: start output
"** START CROSSED OUT: written: lac tty
lac .dspb
sna
jmp piret
isz .dsptm
skp
jmp dsprestart
sad d3
jmp piret
isz .dspb
jmp piret
jmp dsprestart "** END CROSSED OUT
1: dssf " disk flag set?
jmp 1f " no
-1 " set .dskb = -1
dac .dskb
"** 01-s1.pdf page 42
dsrs " get disk status in .dske
dac .dske
dscs " clear status register
jmp piret
"** BEGIN CROSSED OUT
1: lds " load display status (see 03-scope.pdf pg 25)
sma ral " display trap set? (and rotate left)
jmp 1f " not set
cdf " display done executing; clear display flags
lac .dspb
sna
jmp piret " return now if .dspb == 0
tad dm3
sna
jmp dsprestart " start display if .dspb == 3
dac .dspb " otherwise, .dspb -= 3 and return
jmp piret
dsprestart:
lac d1
dac .dspb " set .dspb = 1
lac dspbufp " load display buf pointer
beg " start display processor
-10
dac .dsptm " set .dsptm = -10 (10 ticks)
jmp piret
1: sma ral " edges flag set?? (and rotate)
jmp .+3 " no
raef " "resume after edges flag"
jmp piret " return
sma " light pen flag?
jmp 1f " no
lda " G-2: load display address
dac .lpba " save
rlpd " G-2: resume after light pen stop
jmp piret
1: ksf " (TTY) keyboard flag set?
jmp 1f " no
lac ttydelay " get TTY delay
sma " minus (waiting for output)?
isz ttydelay " no: increment??? (make more positive)
krb " read keyboard buffer
dac char " save in char
sad o375 " interrupt char (TTY ALT MODE?)
jmp intrp1 " yes
lac d1
jms putchar
dzm char
lac sfiles+0 " get sleep word for ttyin
jms wakeup " wake processes
dac sfiles+0 " clear sleep word
lac char " get character
sad o212 " new line (with parity)??
skp " yes
jmp piret " no: done
lac sfiles+1 " get ttyout sleep word
sma " highest bit set?
xor o400000 " no, make it so (why???)
dac sfiles+1 " save back
"** 01-s1.pdf page 43
jms putcr " output CR next
jms ttyrestart " start output
jmp piret
1: tsf " TTY output flag set?
jmp 1f " no
tcf " yes: clear flag
jms ttyrestart " transmit next character
jmp piret
ttyrestart: 0
lac ttydelay " get tty delay
spa " positive?
jmp ttyrestart i " no: keep waiting
lac nttychar " get pending CR, if any
dzm nttychar " clear it
sza " need to send CR?
jmp 3f " yes
isz ttydelay " increment ttydelay (make more positive)
lac d2
jms getchar " get a character
jmp 2f " none found??
3:
tls " start output
sad o12 " newline?
jms putcr " yes: put CR next
sad o15 " CR?
skp " yes
jmp ttyrestart i " no: return
lac ttydelay " get current tty delay
tad o20 " bump by 16
rcr " divide by two
cma " complement
dac ttydelay " save
jmp ttyrestart i
2:
lac sfiles+1 " run out of characters to send: wake user(s)
jms wakeup
dac sfiles+1
jmp ttyrestart i "** written arrow up 2 copies
"** BEGIN CROSSED OUT
1: sck " Graphic-2 keyboard flag set?
jmp 1f " no.
cck " yes: clear flag
lck " read character
dac char
sad o33 " code 33 (ESCAPE?)
jmp intrp2 " yes: mark interrupt
lac d3
jms putchar
nop
lac sfiles+2
jms wakeup
dac sfiles+2
jmp piret
1: rsf " paper tape ready?
jmp 1f " no
"** 01-s1.pdf page 44
lac npptchar
sna
jmp .+5
dac char
rrb
dac npptchar
jmp .+3
rrb
dac char
3:
lac char
sna
jmp 2f
lac d4
jms putchar
jmp 3f
lac char
sad d4
jmp 4f
2:
lac npptchar
sna
jmp .+4
dac char
dzm npptchar
jmp 3b
rsa
lac sfiles+3
jms wakeup
xor o400000
dac sfiles+3
jmp piret
3:
lac char
dac npptchar
4:
lac sfiles+3
jms wakeup
dac sfiles+3
jmp piret
1: psf " paper tape ready?
jmp 1f " no
pcf " clear ptp flag
lac d5
jms getchar " get next char
jmp .+3
psa
jmp piret
lac sfiles+4
jms wakeup
dac sfiles+4
jmp piret
"** BEGIN CROSSED OUT
1: spb " any graphic-2 push button?
jmp 1f " no
cpb " clear push button flag
lpb " load push button value
dac pbsflgs+1
"** 01-s1.pdf page 45
and o2000 " get push button 7
sna " set?
jmp piret " no: done
jms dspinit " yes: reset display buffer
lac sfiles+6 " wake up anyone sleeping on display
jms wakeup
dac sfiles+6
cla " clear button lights
wbl
jmp piret "** END CROSSED OUT
1: crsf " card reader flag set?
jmp 1f " no
crrb
dac crchar
-1
dac crread
jmp piret
1: crrb " read card reader buffer??
piret: " return from priority interrupt
lac 0 " get LINK/PC
ral " restore LINK
lac .ac " restore AC
ion " reenable interrupts
jmp 0 i " return from interrupt
" 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
dac 9f+t " save vector in t0
-mnproc
dac 9f+t+1 " loop count in t1
lac tadu " get "tad ulist"
dac 2f
lac dacu " get "dac ulist"
dac 2f+1
1:
lac 9f+t
ral " rotate vector up one
dac 9f+t
sma " high bit set?
jmp 2f+2 " no: skip the fun
lac o700000 " yes: decrement process status (wake)
2: tad .. " (avoiding indirect)
dac ..
lac 2b " advance tad operand by 4 words
tad d4
dac 2b
lac 2b+1 " advance tad operand by 4 words
tad d4
dac 2b+1
isz 9f+t+1 " done?
jmp 1b " no, keep going
cla " return zero in AC
jmp wakeup i
t = t+2
" call to output CR after LF (NL)
putcr: 0
lac o15
dac nttychar
"** 01-s1.pdf page 46
cla
jmp putcr i
intrp1: " here with TTY interrupt character
lac d6 " get keyboard special device number
dac .int1 " save as interrupt source
lac d1 " drain tty input buffer?
jms getchar
skp
jmp .-3
lac d2 " drain tty output buffer?
jms getchar
skp
jmp .-3
lac sfiles+0 " wake ttyin sleepers
jms wakeup
dac sfiles+0
lac sfiles+1 " wake ttyout sleepers
jms wakeup
dac sfiles+1
jms chkint " check if user interrupted
jmp piret " no, return from PI
jmp 1f " yes: return thru system call code (dump core)
intrp2: " here with display interrupt character
lac d7 " get keyboard special device number
dac .int2 " save as interrupt source
lac d3 " drain keyboard buffer?
jms getchar
skp
jmp .-3
lac sfiles+2 " wake up any "keyboard" sleepers
jms wakeup
dac sfiles+2
lac sfiles+6 " wake up any "display" sleepers
jms wakeup
dac sfiles+6
jms chkint " check if user interrupted
jmp piret " no, return from PI
1:
lac 0 " get interrupt PC
dac 020 " save as system call return PC
lac .ac " restore AC from interrupt
jmp 021 " join system call processing (dump core?)