diff --git a/src/sys/s1.s b/src/sys/s1.s index 7532526..ce56239 100644 --- a/src/sys/s1.s +++ b/src/sys/s1.s @@ -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 diff --git a/src/sys/s4.s b/src/sys/s4.s index 8f273e3..6dde6d1 100644 --- a/src/sys/s4.s +++ b/src/sys/s4.s @@ -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 diff --git a/src/sys/s6.s b/src/sys/s6.s index 6adf94d..723d561 100644 --- a/src/sys/s6.s +++ b/src/sys/s6.s @@ -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 diff --git a/src/sys/s7.s b/src/sys/s7.s index 7f6a999..363407c 100644 --- a/src/sys/s7.s +++ b/src/sys/s7.s @@ -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) diff --git a/src/sys/s8.s b/src/sys/s8.s index 0d84bf9..283ee98 100644 --- a/src/sys/s8.s +++ b/src/sys/s8.s @@ -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