1
0
mirror of https://github.com/DoctorWkt/pdp7-unix.git synced 2026-01-25 11:47:35 +00:00

Improve sys annotations

Finally understand location 7 (incremented at 60Hz)
	setting it to -1 causes clock interrupt every jiffy
Improve comments in dsktrans
Clarify cnop/cskp usage in iread/iwrite code
	iwrite and iread have common code
	entry at iwrite save return address at iread
		and overwrites return address to "skp" inst
	entry at iread puts "nop" inst at iwrite
	"xct iwrite" skips on write entry
This commit is contained in:
phil 2019-10-21 22:24:09 -04:00
parent 17c9581351
commit 4b284c6bbe
5 changed files with 63 additions and 59 deletions

View File

@ -6,12 +6,16 @@ orig:
hlt " overwritten with interrupt return addr
jmp pibreak " dispatch to interrupt processing
. = orig+7
-1 " only ever set (to -1): never read?!
. = orig+7 " real time (60Hz) clock
-1 " -1 will cause "clock overflow" on next tick
" Overflow is checked by "clsf" instr
" in PI service (pibreak) routine,
" reset to -1 after tick handling
" results in an interrupt every "jiffy"
. = orig+020 " syscall (CAL) and user "interrupt" processing
1f " addr for "CAL I": store return here on "CAL"
iof " interrupts off
iof " here on CAL: interrupts off
dac u.ac " save user AC
lac 020 " save user return addr
dac 1f " save as if "CAL I"
@ -22,29 +26,29 @@ orig:
1f " literal to restore location 20
1: 0 " "CAL I" PC stored here
iof " interrupts off
dac u.ac " save user AC
dac u.ac " save user AC in user area
lacq
dac u.mq " save user MQ
dac u.mq " save user MQ in user area
lac 8
dac u.rq " save user auto-index location 8
dac u.rq " save user auto-index location 8 in uarea
lac 9
dac u.rq+1 " save user auto-index location 9
jms copy; 10; u.rq+2; 6 " save user auto-index locations 10-15
lac 1b " load user PC after system call
dac u.rq+8 " save user PC
dac u.rq+1 " save auto-index location 9 in user area
jms copy; 10; u.rq+2; 6 " save auto-index locations 10-15 (using 8/9!)
lac 1b " load user PC
dac u.rq+8 " save in user area
-1 " load -1
dac .savblk " set "save" flag (cleared by disk I/O?)
dac .insys " set "in system" flag
lac uquant " load user quantum count
jms betwen; d0; maxquant " check if between 0 & maxquant??
jms swap " no: swap processes
lac uquant " load user quantum (tick) count
jms betwen; d0; maxquant " check if between 0 & maxquant (30 jiffies)
jms swap " no: quantum expired: swap process out
ion " interrupts on
-1
tad u.rq+8 " get address of system call
jms laci " load AC indirect??
jms betwen; o20001; swn " range check
jms laci " load system call instruction
jms betwen; o20001; swn " range check (expects CAL I!)
jmp badcal " bad system call
tad swp " add system call table base
tad swp " add "jmp syscall_table_base"
dac .+1 " save as next instruction
jmp .. i " dispatch system call
@ -137,7 +141,7 @@ swp: " system call dispatch table
.chdir; .chmod; .chown; badcal; .sysloc; badcal; .capt; .rele
.status; badcal; .smes; .rmes; .fork
swn:
.-swp-1 i " count of system calls, plus indirect!
.-swp-1 i " last system call number: "CAL I n"
" AC/ new value for intflg (non-zero to ignore interrupt char)
" sys intrp

View File

@ -56,8 +56,7 @@ free: 0
jmp free i " Return from the routine
t = t+1
" load AC indirect (without using indirect!)
" need to avoid use of indirect in interrupt service routines
" "load ac indirect"
" AC/ address
" jms laci
" AC/ contents of address
@ -143,7 +142,7 @@ copyz: 0
t = t+1
" Character queue management routines
" (CALLED FROM PI: USE OF INDIRECT AVOIDED!)
" (CALLED FROM PI: USE OF INDIRECT AVOIDED TO AVOID DISK DMA UNDERRUN)
" Queue numbers:
" 0: free list
@ -366,42 +365,44 @@ t = t+1
" 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; -WC; MAC; addr_ptr; dsld_ptr
" jms dsktrans; -words; mem_addr; disk_addr_ptr; op_ptr_ptr
dsktrans: 0
-10
-10 " set retry counter
dac 9f+t
1:
-1
tad dsktrans
dac 12
tad dsktrans " get arg pointer
dac 12 " store as auto-index
"** 01-s1.pdf page 26
dscs " clear status register
lac 12 i
lac 12 i " pick up word count
dslw " load WC
lac 12 i
lac 12 i " pick up memory address
dslm " load MAC
lac 12 i
jms laci
dsld " load TA & SA
dzm .dskb
lac 12 i
jms laci
jms laci
dsls " load status
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
jms laci " fetch pointer
jms laci " fetch op
dsls " load status register (sets busy, int enb)
lac .dskb " check for interrupt
sna
jmp .-2
jmp .-2 " loop until interrupt seen
lac .dske " get status from interrupt
sma
jmp 12 i " return
isz 9f+t
jmp 1b
isz 9f+t " increment retry counter
jmp 1b " less than 10 tries: try again
jms halt " 10 disk errors
t = t+1
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

@ -270,12 +270,10 @@ t = t+3
" AC/ file offset
" jms iwrite; addr; count
iwrite: 0
iwrite: 0 " set to skp (or nop by iread)
dac 9f+t " save arg in t0
lac iwrite " load return address
"** 01-s1.pdf page 38
dac iread " save as iread return addr
lac cskp " load skip instruction
dac iwrite " save as iwrite instruction
@ -287,7 +285,7 @@ iwrite: 0
iread: 0
dac 9f+t " save offset in t0
lac cnop " get nop
dac iwrite " save as iwrite instruction
dac iwrite " save in iwrite return location
1: " common code for iread/iwrite
-1
tad iread i " get word before return addr
@ -322,17 +320,17 @@ iread: 0
tad dm1
xct iwrite " skip if write
jmp .+3
dac 10
cskp:
dac 10 " here on read
cskp: " literal for store to iwrite
skp
dac 11
dac 11 " here on write
2:
lac 11 i
dac 10 i
isz 9f+t
isz 9f+t+1
jmp 3f
xct iwrite
xct iwrite " skip if write
jmp 4f
lac 9f+t
jms betwen; d0; i.size
@ -348,7 +346,7 @@ cskp:
and o77
sza
jmp 2b
xct iwrite
xct iwrite " skip if write
jmp 1b
lac 9f+t+3
jms dskwr

View File

@ -25,23 +25,24 @@ pibreak: " priority interrupt break processing "chain"
dac dpwrite " dpwrite = -1
jmp piret "** END OF CROSSOUT
1: clsf " clock overflow (line frequency ticks)?
1: clsf " clock overflow (60hz tick increment of loc 7 (-1))
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
skp " no overflow, skip high order word increment
isz s.tim " low order overflowed, increment high order count
isz uquant " increment user quantum counter
"** written: ttydelay -> ttyd1
" ("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 ;
"** written: ttyrestart -> ttyres1
cnop: " fetched as constant in iread
nop
cnop: " constant location for iread (stored at iwrite!)
nop
-1
dac 7 " set location 7 to -1 (nothing ever checks/clears it?)
clon " enable clock interrupts, reset flag
dac 7 " reset rt clock count to -1 (overflow on next tick)
clon " enable clock interrupts, clear overflow flag
lac ttydelay " tty delay positive?
spa " yes: skip to skp
isz ttydelay " no: done delaying?
@ -129,7 +130,7 @@ dsprestart:
jmp piret " no: done
lac sfiles+1 " get ttyout sleep word
sma " highest bit set?
xor o400000 " no, make it so (why???)
xor o400000 " no, make it so
dac sfiles+1 " save back
"** 01-s1.pdf page 43
@ -168,7 +169,7 @@ ttyrestart: 0
tad o20 " bump by 16
rcr " divide by two
cma " complement
dac ttydelay " save
dac ttydelay " save as delay countdown
jmp ttyrestart i
2:
lac sfiles+1 " run out of characters to send: wake user(s)

View File

@ -123,7 +123,7 @@ coldentry:
dzm 0100 " not re-entrant
caf " clear all flags
ion " enable interrupts
clon " clear clock flag
clon " clear clock overflow flag
law 3072 " initialize display....
wcga
jms dspinit