1
0
mirror of https://github.com/livingcomputermuseum/pdp7-unix.git synced 2026-04-17 08:51:02 +00:00

Committing changes for LCM+L's PDP-7 hardware: removing interrupt code

for nonexistent devices (GRAPHIC II, Dataphone, etc.) and rewriting RB09 disk
code to use our programmed-IO disk device, dubbed the JK09.  This includes
bootstrap code for same.
This commit is contained in:
Josh Dersch
2019-10-30 11:46:37 -07:00
parent 9c8e5f5f2c
commit f6b16bedb0
5 changed files with 170 additions and 165 deletions

View File

@@ -24,7 +24,7 @@ BINDIR=bin
TESTDIR=tests
BINARIES=../binaries/
all: cmd others a.out boot.rim image.fs
all: cmd others a.out boot.rim jkboot.rim image.fs
# Make alternative everything: no dd but . and ..
alt: altcmd altothers boot.rim alt/a.out alt/image.fs
@@ -70,6 +70,11 @@ alt/a.out: $(ALTSYS)
boot.rim: $(SYSSRC)/sop.s $(OTHERSRC)/pbboot.s
$(AS) -f rim -o boot.rim $(SYSSRC)/sop.s $(OTHERSRC)/pbboot.s
# Josh's bootstrap code
jkboot.rim: $(SYSSRC)/sop.s $(OTHERSRC)/jkboot.s
$(AS) -f rim -o jkboot.rim $(SYSSRC)/sop.s $(OTHERSRC)/jkboot.s
$(AS) -n -f list -o jkboot.lst $(SYSSRC)/sop.s $(OTHERSRC)/jkboot.s
# Cold boot Unix kernel: attempts to build a minimal filesystem.
# Don't use this one!
COLDBOOT=$(SYS) $(SYSSRC)/s9.s

View File

@@ -56,7 +56,8 @@ free: 0
jmp free i " Return from the routine
t = t+1
" "load ac indirect"
" load AC indirect (without using indirect!)
" need to avoid use of indirect in interrupt service routines
" AC/ address
" jms laci
" AC/ contents of address
@@ -142,7 +143,7 @@ copyz: 0
t = t+1
" Character queue management routines
" (CALLED FROM PI: USE OF INDIRECT AVOIDED TO AVOID DISK DMA UNDERRUN)
" (CALLED FROM PI: USE OF INDIRECT AVOIDED!)
" Queue numbers:
" 0: free list
@@ -311,7 +312,7 @@ dskrd: 0
jms srcdbs " in memory?
jmp 1f " yes
lac dskaddr " no: read from disk
jms dskio; 06000
jms dskio; 06000
jmp 2f
1:
dzm 9f+t+1 i
@@ -341,68 +342,61 @@ t = t+3
" jms dskio; DSLD_BITS
dskio: 0
dac dskaddr
cll; idiv; 80
dac 9f+t
lacq
idiv; 10
dac 9f+t+1
lls 22
xor 9f+t+1
als 8
dac 9f+t+1
lac 9f+t
idiv; 10
dac 9f+t
lls 22
xor 9f+t
xor 9f+t+1
xor o200000
tad d8000 " start at logical block 8000
dac 9f+t
jms dsktrans; -64; dskbuf; 9f+t; dskio
isz dskio
jmp dskio i
t = t+1
t = t+2
" perform disk I/O (both filesystem buffer and swapping)
" passed physical (BCD) disk address
" waits for disk interrupt: no overlapped operation
" to avoid disk DMA underrun
" called:
" jms dsktrans; -words; mem_addr; disk_addr_ptr; op_ptr_ptr
" jms dsktrans; -WC; MAC; addr_ptr; dsld_ptr
dsktrans: 0
-10 " set retry counter
dac 9f+t
1:
-1
tad dsktrans " get arg pointer
tad dsktrans
dac 12 " store as auto-index
"** 01-s1.pdf page 26
dscs " clear status register
lac 12 i " pick up word count
dslw " load WC
lac 12 i " pick up memory address
dslm " load MAC
lac 12 i " get disk_addr_ptr
jms laci " get disk address
dsld " load BCD track and sector (TA & SA)
dzm .dskb " clear disk interrupt indicator
lac 12 i " load status (op) pointer pointer
lac 12 i
dac 9f+t " stow word count
lac 12 i
dac 9f+t+1 " stow memory address
lac 12 i
jms laci " fetch pointer
jkld " load JK disk address
lac 12 i
jms laci " fetch operation (read/write) ptr
jms laci " fetch op
dsls " load status register (sets busy, int enb)
lac .dskb " check for interrupt
sna
jmp .-2 " loop until interrupt seen
lac .dske " get status from interrupt
sma
sad o7000
jmp 2f " this is a write
" do a read operation
1:
jkrd " read next word
dac i 9f+t+1 " store it
isz 9f+t+1 " move to next address
isz 9f+t " increment counter
jmp 1b " do it again
jmp 3f " done
" do a write operation
2:
lac i 9f+t+1 " read word from memory
jkwr " write to disk
isz 9f+t+1
isz 9f+t " as above
jmp 2b " do it again
3:
jmp 12 i " return
isz 9f+t " increment retry counter
jmp 1b " less than 10 tries: try again
jms halt " 10 disk errors
t = t+1
t = t+2
halt: 0
isz 9f+t " spin for a while (process interrupts?)
isz 9f+t " spin for a while (process interrupts)
jmp .-1
iof " disable interrupts
hlt " halt

View File

@@ -4,62 +4,61 @@
pibreak: " priority interrupt break processing "chain"
dac .ac " save interrupt AC
"** CROSSED OUT....
dpsf " skip on data phone flag set
jmp 1f " not set: check next device
" dpsf " skip on data phone flag set
" jmp 1f " not set: check next device
dpcf " clear dataphone flag
dprs " read dataphone status
dac dpstat " save for user
sma ral " REC FLG set? rotate flags left
jmp 2f " no
dprc " read char (bit zero set if parity correct)
dac dpchar " save for user
-1
dac dpread " dpread = -1
lac dpstat " get status back
ral " rotate up
2:
sma " XMIT FLG set?
jmp piret " no: return from interrupt
-1
dac dpwrite " dpwrite = -1
jmp piret "** END OF CROSSOUT
" dpcf " clear dataphone flag
" dprs " read dataphone status
" dac dpstat " save for user
" sma ral " REC FLG set? rotate flags left
" jmp 2f " no
" dprc " read char (bit zero set if parity correct)
" dac dpchar " save for user
" -1
" dac dpread " dpread = -1
" lac dpstat " get status back
" ral " rotate up
" 2:
" sma " XMIT FLG set?
" jmp piret " no: return from interrupt
" -1
" dac dpwrite " dpwrite = -1
" jmp piret "** END OF CROSSOUT
1: clsf " clock overflow (60hz tick increment of loc 7 (-1))
1: clsf " clock overflow (line frequency ticks)?
jmp 1f " no
lpb " load display push buttons
dac pbsflgs " save
" lpb " load display push buttons
" dac pbsflgs " save
isz s.tim+1 " increment low order tick count
skp " no overflow, skip high order word increment
skp " no overflow, skip second increment
isz s.tim " low order overflowed, increment high order count
" ("never" skips: 36 bits overflows every 36 years!)
isz uquant " increment user quantum counter (ignore overflow)
" (18 bits overflows in 72 minutes)
"** written: ttydelay -> ttyd1 ;
isz uquant " increment user quantum counter
"** written: ttydelay -> ttyd1
"** written: ttyrestart -> ttyres1
cnop: " constant location for iread (stored at iwrite!)
nop
cnop: " fetched as constant in iread
nop
-1
dac 7 " reset rt clock count to -1 (overflow on next tick)
clon " enable clock interrupts, clear overflow flag
dac 7 " set location 7 to -1 (nothing ever checks/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 " .dspb != 0?
jmp piret " no: return
isz .dsptm " increment .dsptm; is zero?
skp " no
jmp dsprestart " yes: restart display
sad d3 " .dspb == 3?
jmp piret " yes: return
isz .dspb " increment .dspb; is zero?
jmp piret " no: return from interrupt
jmp dsprestart " yes: restart display
" lac .dspb
" sna " .dspb != 0?
" jmp piret " no: return
" isz .dsptm " increment .dsptm; is zero?
" skp " no
" jmp dsprestart " yes: restart display
" sad d3 " .dspb == 3?
" jmp piret " yes: return
" isz .dspb " increment .dspb; is zero?
" jmp piret " no: return from interrupt
" jmp dsprestart " yes: restart display
"** END CROSSED OUT
1: dssf " disk flag set?
@@ -76,37 +75,37 @@ cnop: " constant location for iread (stored at iwrite!)
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: 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: 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
@@ -129,8 +128,8 @@ dsprestart:
skp " yes
jmp piret " no: done
lac sfiles+1 " get ttyout sleep word
sma " busy?
xor o400000 " no, mark as busy now!
sma " highest bit set?
xor o400000 " no, make it so (why???)
dac sfiles+1 " save back
"** 01-s1.pdf page 43
@@ -169,7 +168,7 @@ ttyrestart: 0
tad o20 " bump by 16
rcr " divide by two
cma " complement
dac ttydelay " save as delay countdown
dac ttydelay " save
jmp ttyrestart i
2:
lac sfiles+1 " run out of characters to send: wake user(s)
@@ -178,21 +177,21 @@ ttyrestart: 0
jmp ttyrestart i "** written arrow up 2 copies
"** BEGIN CROSSED OUT
1: sck " Graphic-2 keyboard flag set?
jmp 1f " no.
" 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
" 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 reader ready?
jmp 1f " no
@@ -204,7 +203,7 @@ ttyrestart: 0
sna " have saved char?
jmp .+5 " no: jump to second rrb
dac char " yes: save as current char
rrb " clear flag, read ptr buffer
rrb " clear flag, read reader buffer
dac npptchar " save as saved char
jmp .+3
rrb " here without saved char: read new
@@ -222,14 +221,14 @@ ttyrestart: 0
2:
lac npptchar " get saved char (if any)
sna " had saved char?
jmp .+4 " no
jmp .+4 " no: wake up writer
dac char " yes: save as char to send
dzm npptchar " clear saved char
jmp 3b
rsa " reader select alphanumeric mode
lac sfiles+3
jms wakeup " wake sleepers; returns zero
xor o400000 " mark busy (rsa before sleep @ rppti)
xor o400000 " set high bit (rsa before sleep)
dac sfiles+3
jmp piret
3:
@@ -256,37 +255,38 @@ ttyrestart: 0
jmp piret " return from PI
"** BEGIN CROSSED OUT
1: spb " any graphic-2 push button?
jmp 1f " no
" 1: spb " any graphic-2 push button?
" jmp 1f " no
cpb " clear push button flag
lpb " load push button value
dac pbsflgs+1
" 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
" 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
" 1: crsf " card reader flag set?
" jmp 1f " no
crrb
dac crchar
-1
dac crread
jmp piret
" crrb
" dac crchar
" -1
" dac crread
" jmp piret
1: crrb " clear CR flag for good measure???
" 1: crrb " read card reader buffer??
1:
piret: " return from priority interrupt
lac 0 " get LINK (in bit 0)
ral " restore LINK
@@ -314,7 +314,7 @@ wakeup: 0
dac 9f+t
sma " high bit set?
jmp 2f+2 " no: skip the fun
lac o700000 " yes: decrement process status (mark ready)
lac o700000 " yes: decrement process status (wake)
2: tad .. " (avoiding indirect)
dac ..
lac 2b " advance tad operand by 4 words

View File

@@ -68,7 +68,9 @@ o375: 0375
o777: 0777
o2000: 02000
o4000: 04000
o7000: 07000
d7999: 7999
d8000: 8000
o10000: 010000
o17762: 017762
o17777: 017777

View File

@@ -56,6 +56,10 @@ dsls = 0707144 " DSK: load status
dssf = 0707121 " DSK: skip on flags
dsrs = 0707132 " DSK: read status register
jkld = 0704624 " JK: load block address
jkrd = 0704612 " JK: read word
jkwr = 0704604 " JK: write word
iof = 0700002 " PIC: interrupts off
ion = 0700042 " PIC: interrupts on
caf = 0703302 " CPU: clear all flags