"** 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?)