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:
@@ -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
|
||||
|
||||
90
src/sys/s4.s
90
src/sys/s4.s
@@ -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
|
||||
|
||||
232
src/sys/s7.s
232
src/sys/s7.s
@@ -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
|
||||
|
||||
@@ -68,7 +68,9 @@ o375: 0375
|
||||
o777: 0777
|
||||
o2000: 02000
|
||||
o4000: 04000
|
||||
o7000: 07000
|
||||
d7999: 7999
|
||||
d8000: 8000
|
||||
o10000: 010000
|
||||
o17762: 017762
|
||||
o17777: 017777
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user