mirror of
https://github.com/DoctorWkt/pdp7-unix.git
synced 2026-01-27 12:42:28 +00:00
380 lines
8.1 KiB
ArmAsm
380 lines
8.1 KiB
ArmAsm
"** 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?)
|